From f8b35b0fe546c9f34626155f19dafe16a8f82829 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Wed, 30 Mar 2016 17:50:36 +0200 Subject: android: Add new example viewer. Thanks to Fred Ross-Perry. --- platform/android/example/README | 12 ++ platform/android/example/app/build.gradle | 46 +++++ platform/android/example/app/proguard-rules.pro | 17 ++ .../example/app/src/main/AndroidManifest.xml | 46 +++++ .../artifex/mupdf/example/ChooseDocActivity.java | 228 +++++++++++++++++++++ .../artifex/mupdf/example/ChooseDocAdapter.java | 76 +++++++ .../com/artifex/mupdf/example/ChooseDocItem.java | 17 ++ .../com/artifex/mupdf/example/DocViewActivity.java | 105 ++++++++++ .../com/artifex/mupdf/example/MainActivity.java | 20 ++ .../src/main/res/drawable-hdpi/ic_explorer_any.png | Bin 0 -> 3167 bytes .../main/res/drawable-hdpi/ic_explorer_fldr.png | Bin 0 -> 1523 bytes .../src/main/res/drawable-hdpi/ic_explorer_up.png | Bin 0 -> 2016 bytes .../src/main/res/drawable-mdpi/ic_explorer_any.png | Bin 0 -> 1744 bytes .../main/res/drawable-mdpi/ic_explorer_fldr.png | Bin 0 -> 834 bytes .../src/main/res/drawable-mdpi/ic_explorer_up.png | Bin 0 -> 821 bytes .../main/res/drawable-xhdpi/ic_explorer_any.png | Bin 0 -> 4846 bytes .../main/res/drawable-xhdpi/ic_explorer_fldr.png | Bin 0 -> 2153 bytes .../src/main/res/drawable-xhdpi/ic_explorer_up.png | Bin 0 -> 2420 bytes .../main/res/drawable-xxhdpi/ic_explorer_any.png | Bin 0 -> 9123 bytes .../main/res/drawable-xxhdpi/ic_explorer_fldr.png | Bin 0 -> 4075 bytes .../main/res/drawable-xxhdpi/ic_explorer_up.png | Bin 0 -> 4613 bytes .../main/res/drawable-xxxhdpi/ic_explorer_any.png | Bin 0 -> 14341 bytes .../main/res/drawable-xxxhdpi/ic_explorer_fldr.png | Bin 0 -> 6189 bytes .../main/res/drawable-xxxhdpi/ic_explorer_up.png | Bin 0 -> 7804 bytes .../app/src/main/res/layout/activity_doc_view.xml | 67 ++++++ .../app/src/main/res/layout/activity_main.xml | 6 + .../example/app/src/main/res/layout/choose_doc.xml | 32 +++ .../app/src/main/res/layout/picker_entry.xml | 25 +++ .../app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../app/src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../src/main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes .../example/app/src/main/res/values/colors.xml | 4 + .../example/app/src/main/res/values/strings.xml | 10 + .../example/app/src/main/res/values/styles.xml | 8 + platform/android/example/build.gradle | 18 ++ platform/android/example/local.properties.sample | 5 + platform/android/example/mupdf/build.gradle | 52 +++++ platform/android/example/mupdf/proguard-rules.pro | 17 ++ .../example/mupdf/src/main/AndroidManifest.xml | 12 ++ .../example/mupdf/src/main/res/values/strings.xml | 3 + platform/android/example/settings.gradle | 1 + 43 files changed, 827 insertions(+) create mode 100644 platform/android/example/README create mode 100644 platform/android/example/app/build.gradle create mode 100644 platform/android/example/app/proguard-rules.pro create mode 100644 platform/android/example/app/src/main/AndroidManifest.xml create mode 100644 platform/android/example/app/src/main/java/com/artifex/mupdf/example/ChooseDocActivity.java create mode 100644 platform/android/example/app/src/main/java/com/artifex/mupdf/example/ChooseDocAdapter.java create mode 100644 platform/android/example/app/src/main/java/com/artifex/mupdf/example/ChooseDocItem.java create mode 100644 platform/android/example/app/src/main/java/com/artifex/mupdf/example/DocViewActivity.java create mode 100644 platform/android/example/app/src/main/java/com/artifex/mupdf/example/MainActivity.java create mode 100755 platform/android/example/app/src/main/res/drawable-hdpi/ic_explorer_any.png create mode 100755 platform/android/example/app/src/main/res/drawable-hdpi/ic_explorer_fldr.png create mode 100755 platform/android/example/app/src/main/res/drawable-hdpi/ic_explorer_up.png create mode 100755 platform/android/example/app/src/main/res/drawable-mdpi/ic_explorer_any.png create mode 100755 platform/android/example/app/src/main/res/drawable-mdpi/ic_explorer_fldr.png create mode 100755 platform/android/example/app/src/main/res/drawable-mdpi/ic_explorer_up.png create mode 100755 platform/android/example/app/src/main/res/drawable-xhdpi/ic_explorer_any.png create mode 100755 platform/android/example/app/src/main/res/drawable-xhdpi/ic_explorer_fldr.png create mode 100755 platform/android/example/app/src/main/res/drawable-xhdpi/ic_explorer_up.png create mode 100755 platform/android/example/app/src/main/res/drawable-xxhdpi/ic_explorer_any.png create mode 100755 platform/android/example/app/src/main/res/drawable-xxhdpi/ic_explorer_fldr.png create mode 100755 platform/android/example/app/src/main/res/drawable-xxhdpi/ic_explorer_up.png create mode 100755 platform/android/example/app/src/main/res/drawable-xxxhdpi/ic_explorer_any.png create mode 100755 platform/android/example/app/src/main/res/drawable-xxxhdpi/ic_explorer_fldr.png create mode 100755 platform/android/example/app/src/main/res/drawable-xxxhdpi/ic_explorer_up.png create mode 100644 platform/android/example/app/src/main/res/layout/activity_doc_view.xml create mode 100644 platform/android/example/app/src/main/res/layout/activity_main.xml create mode 100644 platform/android/example/app/src/main/res/layout/choose_doc.xml create mode 100644 platform/android/example/app/src/main/res/layout/picker_entry.xml create mode 100644 platform/android/example/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 platform/android/example/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 platform/android/example/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 platform/android/example/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 platform/android/example/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 platform/android/example/app/src/main/res/values/colors.xml create mode 100644 platform/android/example/app/src/main/res/values/strings.xml create mode 100644 platform/android/example/app/src/main/res/values/styles.xml create mode 100644 platform/android/example/build.gradle create mode 100644 platform/android/example/local.properties.sample create mode 100644 platform/android/example/mupdf/build.gradle create mode 100644 platform/android/example/mupdf/proguard-rules.pro create mode 100644 platform/android/example/mupdf/src/main/AndroidManifest.xml create mode 100644 platform/android/example/mupdf/src/main/res/values/strings.xml create mode 100644 platform/android/example/settings.gradle (limited to 'platform') diff --git a/platform/android/example/README b/platform/android/example/README new file mode 100644 index 00000000..9a2acc77 --- /dev/null +++ b/platform/android/example/README @@ -0,0 +1,12 @@ +This is a very basic example viewer using the new JNI classes. + +The build system is a bit incomplete. + +You need gradle 2.10 (exactly!). + +Copy the libmupdf_java.so file from the original viewer build: + $ cd ../viewer && ndk-build + $ cp ../viewer/libs/armeabi-v7a/libmupdf_java.so mupdf/libs/armeabi-v7a/libmupdf_java.so + +Build and install on device: + $ gradle-2.10 installArmDebug diff --git a/platform/android/example/app/build.gradle b/platform/android/example/app/build.gradle new file mode 100644 index 00000000..5d433deb --- /dev/null +++ b/platform/android/example/app/build.gradle @@ -0,0 +1,46 @@ +apply plugin: 'com.android.model.application' + +model { + + android { + compileSdkVersion = 23 + buildToolsVersion = "23.0.2" + + defaultConfig.with { + applicationId = "com.artifex.mupdf.example" + minSdkVersion.apiLevel = 8 + targetSdkVersion.apiLevel = 16 + versionCode = 1 + versionName = "1.0" + } + } + + android.buildTypes { + release { + minifyEnabled = false + proguardFiles.add(file('proguard-rules.pro')) + } + } + + android.productFlavors { + create("arm") { + ndk.with { + // You can customize the NDK configurations for each + // productFlavors and buildTypes. + abiFilters.add("armeabi") + } + + } + } + + /* This is important, it will run lint checks but won't abort build */ + android.lintOptions { + abortOnError false + } + +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar','*.so']) + compile project(':mupdf') +} diff --git a/platform/android/example/app/proguard-rules.pro b/platform/android/example/app/proguard-rules.pro new file mode 100644 index 00000000..68e56937 --- /dev/null +++ b/platform/android/example/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Applications/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/platform/android/example/app/src/main/AndroidManifest.xml b/platform/android/example/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..c1dc4e52 --- /dev/null +++ b/platform/android/example/app/src/main/AndroidManifest.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/android/example/app/src/main/java/com/artifex/mupdf/example/ChooseDocActivity.java b/platform/android/example/app/src/main/java/com/artifex/mupdf/example/ChooseDocActivity.java new file mode 100644 index 00000000..3fcb3064 --- /dev/null +++ b/platform/android/example/app/src/main/java/com/artifex/mupdf/example/ChooseDocActivity.java @@ -0,0 +1,228 @@ +package com.artifex.mupdf.example; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.res.Resources; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.os.FileObserver; +import android.os.Handler; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListView; + +import java.io.File; +import java.io.FileFilter; +import java.util.Arrays; +import java.util.Comparator; + +public class ChooseDocActivity + extends Activity +{ + private ListView mListView; + private ChooseDocAdapter adapter; + static private File mDirectory; + static private File mStartingDirectory; + private File mParent; + private File[] mDirs; + private File[] mFiles; + private Handler mHandler; + private Runnable mUpdateFiles; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + setContentView(R.layout.choose_doc); + + mHandler = new Handler(); + + String storageState = Environment.getExternalStorageState(); + if (!Environment.MEDIA_MOUNTED.equals(storageState) && + !Environment.MEDIA_MOUNTED_READ_ONLY.equals(storageState)) + { + showMessage(getResources().getString(R.string.no_media_warning), + getResources().getString(R.string.no_media_hint), + getResources().getString(R.string.dismiss)); + + return; + } + + if (mDirectory == null) { + mDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); + mStartingDirectory = mDirectory; // remember where we started + } + + // Create the list... + mListView = (ListView)findViewById(R.id.fileListView); + mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + onListItemClick(mListView, view, position, id); + } + }); + + // Create a list adapter... + adapter = new ChooseDocAdapter(getLayoutInflater()); + mListView.setAdapter(adapter); + + // ...that is updated dynamically when files are scanned + mUpdateFiles = new Runnable() { + public void run() { + Resources res = getResources(); + String appName = res.getString(R.string.app_name); + String version = res.getString(R.string.version); + String title = res.getString(R.string.picker_title_App_Ver_Dir); + setTitle(String.format(title, appName, version, mDirectory)); + + mParent = mDirectory.getParentFile(); + + mDirs = mDirectory.listFiles(new FileFilter() { + + public boolean accept(File file) { + return file.isDirectory(); + } + }); + if (mDirs == null) + mDirs = new File[0]; + + mFiles = mDirectory.listFiles(new FileFilter() { + + public boolean accept(File file) { + if (file.isDirectory()) + return false; + + String fname = file.getName().toLowerCase(); + + if (fname.endsWith(".pdf")) + return true; + if (fname.endsWith(".xps")) + return true; + if (fname.endsWith(".cbz")) + return true; + if (fname.endsWith(".epub")) + return true; + if (fname.endsWith(".png")) + return true; + if (fname.endsWith(".jpe")) + return true; + if (fname.endsWith(".jpeg")) + return true; + if (fname.endsWith(".jpg")) + return true; + if (fname.endsWith(".jfif")) + return true; + if (fname.endsWith(".jfif-tbnl")) + return true; + if (fname.endsWith(".tif")) + return true; + if (fname.endsWith(".tiff")) + return true; + + return false; + } + }); + if (mFiles == null) + mFiles = new File[0]; + + Arrays.sort(mFiles, new Comparator() { + public int compare(File arg0, File arg1) { + return arg0.getName().compareToIgnoreCase(arg1.getName()); + } + }); + + Arrays.sort(mDirs, new Comparator() { + public int compare(File arg0, File arg1) { + return arg0.getName().compareToIgnoreCase(arg1.getName()); + } + }); + + adapter.clear(); + + // add a button for going up one level + if (mParent != null) + if (!mDirectory.getAbsolutePath().equals(mStartingDirectory.getAbsolutePath())) + adapter.add(new ChooseDocItem(ChooseDocItem.Type.PARENT, getString(R.string.parent_directory), mParent.getAbsolutePath())); + + for (File f : mDirs) + adapter.add(new ChooseDocItem(ChooseDocItem.Type.DIR, f.getName(), f.getAbsolutePath())); + for (File f : mFiles) + adapter.add(new ChooseDocItem(ChooseDocItem.Type.DOC, f.getName(), f.getAbsolutePath())); + } + }; + + // Start initial file scan... + mHandler.post(mUpdateFiles); + + // ...and observe the directory and scan files upon changes. + FileObserver observer = new FileObserver(mDirectory.getPath(), FileObserver.CREATE | FileObserver.DELETE) { + public void onEvent(int event, String path) { + mHandler.post(mUpdateFiles); + } + }; + observer.startWatching(); + } + + private void onListItemClick(ListView l, View v, int position, long id) + { + ChooseDocItem item = (ChooseDocItem) v.getTag(); + File f = new File(item.path); + if (item.type== ChooseDocItem.Type.PARENT || item.type== ChooseDocItem.Type.DIR) + { + mDirectory = f; + mHandler.post(mUpdateFiles); + return; + } + + // start a viewing activity + Uri uri = Uri.parse(f.getAbsolutePath()); + Intent intent; + intent = new Intent(this, DocViewActivity.class); + intent.setAction(Intent.ACTION_VIEW); + intent.setData(uri); + startActivity(intent); + } + + @Override + protected void onPause() { + super.onPause(); + } + + @Override + protected void onResume() { + super.onResume(); + + // do another file scan to pick up changes to files since we were away + mHandler.post(mUpdateFiles); + } + + // this hides the activity + @Override + public void onBackPressed() { + moveTaskToBack (true); + } + + private void showMessage(final String title, final String body, final String okLabel) + { + final Activity activity = this; + runOnUiThread(new Runnable() { + @Override + public void run() { + new AlertDialog.Builder(activity) + .setTitle(title) + .setMessage(body) + .setCancelable(false) + .setPositiveButton(okLabel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }).create().show(); + } + }); + } +} diff --git a/platform/android/example/app/src/main/java/com/artifex/mupdf/example/ChooseDocAdapter.java b/platform/android/example/app/src/main/java/com/artifex/mupdf/example/ChooseDocAdapter.java new file mode 100644 index 00000000..4b889a06 --- /dev/null +++ b/platform/android/example/app/src/main/java/com/artifex/mupdf/example/ChooseDocAdapter.java @@ -0,0 +1,76 @@ +package com.artifex.mupdf.example; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.LinkedList; + +public class ChooseDocAdapter extends BaseAdapter { + private final LinkedList mItems; + private final LayoutInflater mInflater; + + public ChooseDocAdapter(LayoutInflater inflater) { + mInflater = inflater; + mItems = new LinkedList(); + } + + public void clear() { + mItems.clear(); + } + + public void add(ChooseDocItem item) { + mItems.add(item); + notifyDataSetChanged(); + } + + public int getCount() { + return mItems.size(); + } + + public Object getItem(int i) { + return null; + } + + public long getItemId(int arg0) { + return 0; + } + + private int iconForType(ChooseDocItem.Type type, String docName) + { + switch (type) + { + case PARENT: + return R.drawable.ic_explorer_up; + + case DIR: + return R.drawable.ic_explorer_fldr; + + case DOC: + return R.drawable.ic_explorer_any; + + default: + return 0; + } + } + + public View getView(int position, View convertView, ViewGroup parent) { + View v; + if (convertView == null) { + v = mInflater.inflate(R.layout.picker_entry, null); + } else { + v = convertView; + } + ChooseDocItem item = mItems.get(position); + ((TextView)v.findViewById(R.id.name)).setText(item.name); + ((ImageView)v.findViewById(R.id.icon)).setImageResource(iconForType(item.type, item.name)); + + v.setTag(item); + + return v; + } + +} diff --git a/platform/android/example/app/src/main/java/com/artifex/mupdf/example/ChooseDocItem.java b/platform/android/example/app/src/main/java/com/artifex/mupdf/example/ChooseDocItem.java new file mode 100644 index 00000000..194db0f3 --- /dev/null +++ b/platform/android/example/app/src/main/java/com/artifex/mupdf/example/ChooseDocItem.java @@ -0,0 +1,17 @@ +package com.artifex.mupdf.example; + +public class ChooseDocItem { + public enum Type { + PARENT, DIR, DOC + } + + final public Type type; + final public String name; + final public String path; + + public ChooseDocItem(Type t, String n, String p) { + type = t; + name = n; + path = p; + } +} diff --git a/platform/android/example/app/src/main/java/com/artifex/mupdf/example/DocViewActivity.java b/platform/android/example/app/src/main/java/com/artifex/mupdf/example/DocViewActivity.java new file mode 100644 index 00000000..a0e989ff --- /dev/null +++ b/platform/android/example/app/src/main/java/com/artifex/mupdf/example/DocViewActivity.java @@ -0,0 +1,105 @@ +package com.artifex.mupdf.example; + +import android.app.Activity; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.artifex.mupdf.fitz.ColorSpace; +import com.artifex.mupdf.fitz.Document; +import com.artifex.mupdf.fitz.Matrix; +import com.artifex.mupdf.fitz.Page; +import com.artifex.mupdf.fitz.Pixmap; + +public class DocViewActivity extends Activity +{ + private int mPageCount; + private int mCurrentPage; + + Document mDocument; + Page mPage; + Bitmap mBitmap = null; + + ImageView mImageView; + TextView mTextView; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_doc_view); + + mImageView = (ImageView)findViewById(R.id.image_view); + mTextView = (TextView)findViewById(R.id.page_text); + + // load the doc + Uri uri = getIntent().getData(); + String path = Uri.decode(uri.getEncodedPath()); + mDocument = new Document(path); + mPageCount = mDocument.countPages(); + + // show the first page + mCurrentPage = 0; + displayCurrentPage(); + } + + public void onFirstPageButton(final View v) + { + mCurrentPage = 0; + displayCurrentPage(); + } + + public void onPreviousPageButton(final View v) + { + if (mCurrentPage > 0) + { + mCurrentPage--; + displayCurrentPage(); + } + } + + public void onNextPageButton(final View v) + { + if (mCurrentPage < mPageCount-1) + { + mCurrentPage++; + displayCurrentPage(); + } + } + + public void onLastPageButton(final View v) + { + mCurrentPage = mPageCount-1; + displayCurrentPage(); + } + + private void displayCurrentPage() + { + // report the page number + mTextView.setText(String.format("page %d of %d",mCurrentPage+1,mPageCount)); + + // get the page + mPage = mDocument.loadPage(mCurrentPage); + + // create a matrix that renders at 300 DPI + Matrix m = new Matrix(); + m.scale(300.0f/72.0f); + + // create a new bitmap for the page + Bitmap old = mBitmap; + Pixmap pixmap = mPage.toPixmap(m, ColorSpace.DeviceBGR); + mBitmap = Bitmap.createBitmap(pixmap.getWidth(), pixmap.getHeight(), Bitmap.Config.ARGB_8888); + int [] pixels = pixmap.getPixels(); + mBitmap.setPixels(pixels, 0, pixmap.getWidth(), 0, 0, pixmap.getWidth(), pixmap.getHeight()); + + // set the bitmap in the UI + mImageView.setImageBitmap(mBitmap); + + // recycle the old bitmap + if (old!=null) + old.recycle(); + } +} diff --git a/platform/android/example/app/src/main/java/com/artifex/mupdf/example/MainActivity.java b/platform/android/example/app/src/main/java/com/artifex/mupdf/example/MainActivity.java new file mode 100644 index 00000000..b7aa39ca --- /dev/null +++ b/platform/android/example/app/src/main/java/com/artifex/mupdf/example/MainActivity.java @@ -0,0 +1,20 @@ +package com.artifex.mupdf.example; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; + +public class MainActivity extends Activity +{ + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + // just show the document chooser activity + Intent intent = new Intent(this, ChooseDocActivity.class); + startActivity(intent); + finish(); + } + +} diff --git a/platform/android/example/app/src/main/res/drawable-hdpi/ic_explorer_any.png b/platform/android/example/app/src/main/res/drawable-hdpi/ic_explorer_any.png new file mode 100755 index 00000000..1ec7c5f3 Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-hdpi/ic_explorer_any.png differ diff --git a/platform/android/example/app/src/main/res/drawable-hdpi/ic_explorer_fldr.png b/platform/android/example/app/src/main/res/drawable-hdpi/ic_explorer_fldr.png new file mode 100755 index 00000000..8156137e Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-hdpi/ic_explorer_fldr.png differ diff --git a/platform/android/example/app/src/main/res/drawable-hdpi/ic_explorer_up.png b/platform/android/example/app/src/main/res/drawable-hdpi/ic_explorer_up.png new file mode 100755 index 00000000..7adeab26 Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-hdpi/ic_explorer_up.png differ diff --git a/platform/android/example/app/src/main/res/drawable-mdpi/ic_explorer_any.png b/platform/android/example/app/src/main/res/drawable-mdpi/ic_explorer_any.png new file mode 100755 index 00000000..ee4ed481 Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-mdpi/ic_explorer_any.png differ diff --git a/platform/android/example/app/src/main/res/drawable-mdpi/ic_explorer_fldr.png b/platform/android/example/app/src/main/res/drawable-mdpi/ic_explorer_fldr.png new file mode 100755 index 00000000..6a1c9862 Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-mdpi/ic_explorer_fldr.png differ diff --git a/platform/android/example/app/src/main/res/drawable-mdpi/ic_explorer_up.png b/platform/android/example/app/src/main/res/drawable-mdpi/ic_explorer_up.png new file mode 100755 index 00000000..48b7ea04 Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-mdpi/ic_explorer_up.png differ diff --git a/platform/android/example/app/src/main/res/drawable-xhdpi/ic_explorer_any.png b/platform/android/example/app/src/main/res/drawable-xhdpi/ic_explorer_any.png new file mode 100755 index 00000000..50e224a4 Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-xhdpi/ic_explorer_any.png differ diff --git a/platform/android/example/app/src/main/res/drawable-xhdpi/ic_explorer_fldr.png b/platform/android/example/app/src/main/res/drawable-xhdpi/ic_explorer_fldr.png new file mode 100755 index 00000000..0df4d0c4 Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-xhdpi/ic_explorer_fldr.png differ diff --git a/platform/android/example/app/src/main/res/drawable-xhdpi/ic_explorer_up.png b/platform/android/example/app/src/main/res/drawable-xhdpi/ic_explorer_up.png new file mode 100755 index 00000000..f089e8d7 Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-xhdpi/ic_explorer_up.png differ diff --git a/platform/android/example/app/src/main/res/drawable-xxhdpi/ic_explorer_any.png b/platform/android/example/app/src/main/res/drawable-xxhdpi/ic_explorer_any.png new file mode 100755 index 00000000..9aea910c Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-xxhdpi/ic_explorer_any.png differ diff --git a/platform/android/example/app/src/main/res/drawable-xxhdpi/ic_explorer_fldr.png b/platform/android/example/app/src/main/res/drawable-xxhdpi/ic_explorer_fldr.png new file mode 100755 index 00000000..f0eefc36 Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-xxhdpi/ic_explorer_fldr.png differ diff --git a/platform/android/example/app/src/main/res/drawable-xxhdpi/ic_explorer_up.png b/platform/android/example/app/src/main/res/drawable-xxhdpi/ic_explorer_up.png new file mode 100755 index 00000000..af79349e Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-xxhdpi/ic_explorer_up.png differ diff --git a/platform/android/example/app/src/main/res/drawable-xxxhdpi/ic_explorer_any.png b/platform/android/example/app/src/main/res/drawable-xxxhdpi/ic_explorer_any.png new file mode 100755 index 00000000..6a653115 Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-xxxhdpi/ic_explorer_any.png differ diff --git a/platform/android/example/app/src/main/res/drawable-xxxhdpi/ic_explorer_fldr.png b/platform/android/example/app/src/main/res/drawable-xxxhdpi/ic_explorer_fldr.png new file mode 100755 index 00000000..e06c1b25 Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-xxxhdpi/ic_explorer_fldr.png differ diff --git a/platform/android/example/app/src/main/res/drawable-xxxhdpi/ic_explorer_up.png b/platform/android/example/app/src/main/res/drawable-xxxhdpi/ic_explorer_up.png new file mode 100755 index 00000000..243c3c65 Binary files /dev/null and b/platform/android/example/app/src/main/res/drawable-xxxhdpi/ic_explorer_up.png differ diff --git a/platform/android/example/app/src/main/res/layout/activity_doc_view.xml b/platform/android/example/app/src/main/res/layout/activity_doc_view.xml new file mode 100644 index 00000000..05cee21a --- /dev/null +++ b/platform/android/example/app/src/main/res/layout/activity_doc_view.xml @@ -0,0 +1,67 @@ + + + + + +