bin / mupdf / mupdf-1.7 / platform / android / src / com / artifex / mupdfdemo / ChoosePDFActivity.java
7859 viewspackage com.artifex.mupdfdemo;12import java.io.File;3import java.io.FileFilter;4import java.util.Arrays;5import java.util.Comparator;6import java.util.HashMap;7import java.util.Map;89import android.app.AlertDialog;10import android.app.ListActivity;11import android.content.DialogInterface;12import android.content.DialogInterface.OnClickListener;13import android.content.Intent;14import android.content.res.Resources;15import android.net.Uri;16import android.os.Bundle;17import android.os.Environment;18import android.os.FileObserver;19import android.os.Handler;20import android.view.View;21import android.widget.ListView;2223enum Purpose {24PickPDF,25PickKeyFile26}2728public class ChoosePDFActivity extends ListActivity {29static public final String PICK_KEY_FILE = "com.artifex.mupdfdemo.PICK_KEY_FILE";30static private File mDirectory;31static private Map<String, Integer> mPositions = new HashMap<String, Integer>();32private File mParent;33private File [] mDirs;34private File [] mFiles;35private Handler mHandler;36private Runnable mUpdateFiles;37private ChoosePDFAdapter adapter;38private Purpose mPurpose;3940@Override41protected void onCreate(Bundle savedInstanceState) {42super.onCreate(savedInstanceState);4344mPurpose = PICK_KEY_FILE.equals(getIntent().getAction()) ? Purpose.PickKeyFile : Purpose.PickPDF;454647String storageState = Environment.getExternalStorageState();4849if (!Environment.MEDIA_MOUNTED.equals(storageState)50&& !Environment.MEDIA_MOUNTED_READ_ONLY.equals(storageState))51{52AlertDialog.Builder builder = new AlertDialog.Builder(this);53builder.setTitle(R.string.no_media_warning);54builder.setMessage(R.string.no_media_hint);55AlertDialog alert = builder.create();56alert.setButton(AlertDialog.BUTTON_POSITIVE,getString(R.string.dismiss),57new OnClickListener() {58public void onClick(DialogInterface dialog, int which) {59finish();60}61});62alert.show();63return;64}6566if (mDirectory == null)67mDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);6869// Create a list adapter...70adapter = new ChoosePDFAdapter(getLayoutInflater());71setListAdapter(adapter);7273// ...that is updated dynamically when files are scanned74mHandler = new Handler();75mUpdateFiles = new Runnable() {76public void run() {77Resources res = getResources();78String appName = res.getString(R.string.app_name);79String version = res.getString(R.string.version);80String title = res.getString(R.string.picker_title_App_Ver_Dir);81setTitle(String.format(title, appName, version, mDirectory));8283mParent = mDirectory.getParentFile();8485mDirs = mDirectory.listFiles(new FileFilter() {8687public boolean accept(File file) {88return file.isDirectory();89}90});91if (mDirs == null)92mDirs = new File[0];9394mFiles = mDirectory.listFiles(new FileFilter() {9596public boolean accept(File file) {97if (file.isDirectory())98return false;99String fname = file.getName().toLowerCase();100switch (mPurpose) {101case PickPDF:102if (fname.endsWith(".pdf"))103return true;104if (fname.endsWith(".xps"))105return true;106if (fname.endsWith(".cbz"))107return true;108if (fname.endsWith(".epub"))109return true;110if (fname.endsWith(".png"))111return true;112if (fname.endsWith(".jpe"))113return true;114if (fname.endsWith(".jpeg"))115return true;116if (fname.endsWith(".jpg"))117return true;118if (fname.endsWith(".jfif"))119return true;120if (fname.endsWith(".jfif-tbnl"))121return true;122if (fname.endsWith(".tif"))123return true;124if (fname.endsWith(".tiff"))125return true;126return false;127case PickKeyFile:128if (fname.endsWith(".pfx"))129return true;130return false;131default:132return false;133}134}135});136if (mFiles == null)137mFiles = new File[0];138139Arrays.sort(mFiles, new Comparator<File>() {140public int compare(File arg0, File arg1) {141return arg0.getName().compareToIgnoreCase(arg1.getName());142}143});144145Arrays.sort(mDirs, new Comparator<File>() {146public int compare(File arg0, File arg1) {147return arg0.getName().compareToIgnoreCase(arg1.getName());148}149});150151adapter.clear();152if (mParent != null)153adapter.add(new ChoosePDFItem(ChoosePDFItem.Type.PARENT, getString(R.string.parent_directory)));154for (File f : mDirs)155adapter.add(new ChoosePDFItem(ChoosePDFItem.Type.DIR, f.getName()));156for (File f : mFiles)157adapter.add(new ChoosePDFItem(ChoosePDFItem.Type.DOC, f.getName()));158159lastPosition();160}161};162163// Start initial file scan...164mHandler.post(mUpdateFiles);165166// ...and observe the directory and scan files upon changes.167FileObserver observer = new FileObserver(mDirectory.getPath(), FileObserver.CREATE | FileObserver.DELETE) {168public void onEvent(int event, String path) {169mHandler.post(mUpdateFiles);170}171};172observer.startWatching();173}174175private void lastPosition() {176String p = mDirectory.getAbsolutePath();177if (mPositions.containsKey(p))178getListView().setSelection(mPositions.get(p));179}180181@Override182protected void onListItemClick(ListView l, View v, int position, long id) {183super.onListItemClick(l, v, position, id);184185mPositions.put(mDirectory.getAbsolutePath(), getListView().getFirstVisiblePosition());186187if (position < (mParent == null ? 0 : 1)) {188mDirectory = mParent;189mHandler.post(mUpdateFiles);190return;191}192193position -= (mParent == null ? 0 : 1);194195if (position < mDirs.length) {196mDirectory = mDirs[position];197mHandler.post(mUpdateFiles);198return;199}200201position -= mDirs.length;202203Uri uri = Uri.parse(mFiles[position].getAbsolutePath());204Intent intent = new Intent(this,MuPDFActivity.class);205intent.setAction(Intent.ACTION_VIEW);206intent.setData(uri);207switch (mPurpose) {208case PickPDF:209// Start an activity to display the PDF file210startActivity(intent);211break;212case PickKeyFile:213// Return the uri to the caller214setResult(RESULT_OK, intent);215finish();216break;217}218}219220@Override221protected void onPause() {222super.onPause();223if (mDirectory != null)224mPositions.put(mDirectory.getAbsolutePath(), getListView().getFirstVisiblePosition());225}226}227228229