diff options
author | Michael Weghorn <m.weghorn@posteo.de> | 2021-04-09 10:08:19 +0200 |
---|---|---|
committer | Michael Weghorn <m.weghorn@posteo.de> | 2021-04-12 07:33:20 +0200 |
commit | b368623ad40ee27014fcf70898e22aabc6179255 (patch) | |
tree | ec891ec4bac7e499f947795877938c380dab828c | |
parent | b80deaefedfc9ac4fcaa14a8d350ebaa14d78a87 (diff) |
android: Turn 3 "internal" docs into raw resources
Make 'example.odt', 'license.txt' and 'notice.txt'
(which can be opened via the "About" dialog)
resources of the app by copying them to a new directory
'res_generated' instead of into assets, and include
'res_generated' into resources, then use an
'android.resource://' URI instead of a 'file:///assets/'
one in AboutDialogFragment.
The latter does not work with when passed as a parameter
to 'ContentResolver.openInputStream'.
Adapt/Simplify 'LibreOfficeMainActivity#copyFileToTemp' to
make loading those docs using the 'android.resource://'
URI work and use the existing 'copyStream' method for copying from
the input to the output stream.
This is in preparation for upcoming commit with Change-Id
I7731ef81a4242fa0ce3b3fd8ced1683a6a6bee8c,
"android: Always create a temporary local copy of the doc".
Change-Id: I7731ef81a4242fa0ce3b3fd8ced1683a6a6bee8c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113881
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
(cherry picked from commit d3f8f4b1663214ebe29e49e109b1ae704b680b9e)
-rw-r--r-- | android/.gitignore | 1 | ||||
-rw-r--r-- | android/source/build.gradle | 26 | ||||
-rw-r--r-- | android/source/src/java/org/libreoffice/AboutDialogFragment.java | 13 | ||||
-rw-r--r-- | android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java | 75 |
4 files changed, 52 insertions, 63 deletions
diff --git a/android/.gitignore b/android/.gitignore index 163145dd63fa..de608fea3c14 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -6,6 +6,7 @@ /source/build/ /source/captures/ /source/jni/Application.mk +/source/res_generated /jniLibs/ /source/liboSettings.gradle /source/local.properties diff --git a/android/source/build.gradle b/android/source/build.gradle index 35a83be655c0..35b3c601079e 100644 --- a/android/source/build.gradle +++ b/android/source/build.gradle @@ -42,7 +42,7 @@ android { sourceSets { main.manifest.srcFile 'AndroidManifest.xml' main.assets.srcDirs = ['assets'] - main.res.srcDirs = ['res'] + main.res.srcDirs = ['res', 'res_generated'] main.java.srcDirs = ['../Bootstrap/src', 'src/java'] main.jniLibs.srcDirs = ["${liboJniLibsdir}"] main.jni.srcDirs = [] // don't attempt to build native-lib via gradle @@ -144,14 +144,6 @@ task copyUnpackAssets(type: Copy) { task copyAssets(type: Copy) { description "copies assets that can be accessed within the installed apk" into 'assets' - from("${liboInstdir}") { - includes = ["LICENSE", "NOTICE"] - rename "LICENSE", "license.txt" - rename "NOTICE", "notice.txt" - } - from("${liboExampleDocument}") { - rename ".*", "example.odt" - } // include icons into ('share') { @@ -195,6 +187,19 @@ task copyAssets(type: Copy) { } } +task copyAppResources(type: Copy) { + description "copies documents to make them available as app resources" + into 'res_generated/raw' + from("${liboInstdir}") { + includes = ["LICENSE", "NOTICE"] + rename "LICENSE", "license.txt" + rename "NOTICE", "notice.txt" + } + from("${liboExampleDocument}") { + rename ".*", "example.odt" + } +} + task createFullConfig(type: Copy) { // grab dir to clear whole hierarchy on clean target outputs.dir "assets_fullUI" @@ -292,7 +297,8 @@ task createRCfiles { preBuild.dependsOn 'createRCfiles', 'createStrippedConfigMain', 'createStrippedConfigRegistry', - 'createFullConfig' + 'createFullConfig', + 'copyAppResources' clean.dependsOn 'cleanCopyAssets', 'cleanCreateStrippedConfig', diff --git a/android/source/src/java/org/libreoffice/AboutDialogFragment.java b/android/source/src/java/org/libreoffice/AboutDialogFragment.java index 6c944bae7ef1..8e4ddf0ae08c 100644 --- a/android/source/src/java/org/libreoffice/AboutDialogFragment.java +++ b/android/source/src/java/org/libreoffice/AboutDialogFragment.java @@ -30,9 +30,6 @@ import java.io.File; public class AboutDialogFragment extends DialogFragment { - private static final String DEFAULT_DOC_PATH = "/assets/example.odt"; - - @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { @@ -81,21 +78,21 @@ public class AboutDialogFragment extends DialogFragment { .setNegativeButton(R.string.about_license, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { - loadFromAbout("/assets/license.txt"); + loadFromAbout(R.raw.license); dialog.dismiss(); } }) .setPositiveButton(R.string.about_notice, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { - loadFromAbout("/assets/notice.txt"); + loadFromAbout(R.raw.notice); dialog.dismiss(); } }) .setNeutralButton(R.string.about_moreinfo, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { - loadFromAbout(DEFAULT_DOC_PATH); + loadFromAbout(R.raw.example); dialog.dismiss(); } }); @@ -103,8 +100,8 @@ public class AboutDialogFragment extends DialogFragment { return builder.create(); } - private void loadFromAbout(String input) { - Intent i = new Intent(Intent.ACTION_VIEW, Uri.fromFile(new File(input))); + private void loadFromAbout(int resourceId) { + Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("android.resource://" + BuildConfig.APPLICATION_ID + "/" + resourceId)); String packageName = getActivity().getApplicationContext().getPackageName(); ComponentName componentName = new ComponentName(packageName, LibreOfficeMainActivity.class.getName()); i.setComponent(componentName); diff --git a/android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java b/android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java index 022965e65052..0048bad50fd7 100644 --- a/android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java +++ b/android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java @@ -175,7 +175,8 @@ public class LibreOfficeMainActivity extends AppCompatActivity implements Settin mDocumentUri = getIntent().getData(); if (mDocumentUri != null) { - if (mDocumentUri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { + if (mDocumentUri.getScheme().equals(ContentResolver.SCHEME_CONTENT) + || mDocumentUri.getScheme().equals(ContentResolver.SCHEME_ANDROID_RESOURCE)) { final boolean isReadOnlyDoc; if (getIntent().getStringExtra(LibreOfficeUIActivity.NEW_DOC_TYPE_KEY) != null) { // New document type string is not null, meaning we want to open a new document @@ -296,53 +297,37 @@ public class LibreOfficeMainActivity extends AppCompatActivity implements Settin try { mTempFile = File.createTempFile("LibreOffice", suffix, this.getCacheDir()); - final FileChannel outputChannel = new FileOutputStream(mTempFile).getChannel(); - try { - // need to run copy operation in a separate thread, since network access is not - // allowed from main thread, but that may happen here when underlying - // DocumentsProvider (like the NextCloud one) does that - class CopyThread extends Thread { - /** Whether copy operation was successful. */ - private boolean result = false; - - @Override - public void run() { - result = false; - try { - final AssetFileDescriptor assetFD = contentResolver.openAssetFileDescriptor(mDocumentUri, "r"); - if (assetFD == null) { - Log.e(LOGTAG, "couldn't create assetfiledescriptor from " + mDocumentUri); - return; - } - FileChannel inputChannel = assetFD.createInputStream().getChannel(); - long bytesTransferred = 0; - // might not copy all at once, so make sure everything gets copied... - while (bytesTransferred < inputChannel.size()) { - bytesTransferred += outputChannel.transferFrom(inputChannel, bytesTransferred, inputChannel.size()); - } - Log.e(LOGTAG, "Success copying " + bytesTransferred + " bytes"); - inputChannel.close(); - } catch (IOException e) { - e.printStackTrace(); - return; - } - result = true; + final FileOutputStream outputStream = new FileOutputStream(mTempFile); + // need to run copy operation in a separate thread, since network access is not + // allowed from main thread, but that may happen here when underlying + // DocumentsProvider (like the NextCloud one) does that + class CopyThread extends Thread { + /** Whether copy operation was successful. */ + private boolean result = false; + + @Override + public void run() { + result = false; + try { + InputStream inputStream = contentResolver.openInputStream(mDocumentUri); + result = copyStream(inputStream, outputStream); + } catch (IOException e) { + e.printStackTrace(); + return; } - }; - CopyThread copyThread = new CopyThread(); - copyThread.start(); - try { - // wait for copy operation to finish - // NOTE: might be useful to add some indicator in UI for long copy operations involving network... - copyThread.join(); - } catch (InterruptedException e) { - e.printStackTrace(); } - - return copyThread.result; - } finally { - outputChannel.close(); + }; + CopyThread copyThread = new CopyThread(); + copyThread.start(); + try { + // wait for copy operation to finish + // NOTE: might be useful to add some indicator in UI for long copy operations involving network... + copyThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); } + + return copyThread.result; } catch (FileNotFoundException e) { return false; } catch (IOException e) { |