1 package cz.cvut.fel.dce.qrscanner.mupdf;
4 import java.io.FileFilter;
5 import java.util.Arrays;
6 import java.util.Comparator;
7 import java.util.HashMap;
10 import android.app.AlertDialog;
11 import android.app.ListActivity;
12 import android.content.DialogInterface;
13 import android.content.DialogInterface.OnClickListener;
14 import android.content.Intent;
15 import android.content.res.Resources;
16 import android.net.Uri;
17 import android.os.Bundle;
18 import android.os.Environment;
19 import android.os.FileObserver;
20 import android.os.Handler;
21 import android.view.View;
22 import android.widget.ListView;
24 import cz.cvut.fel.dce.qrscanner.R;
31 public class ChoosePDFActivity extends ListActivity {
32 static public final String PICK_KEY_FILE = "com.artifex.mupdfdemo.PICK_KEY_FILE";
33 static private File mDirectory;
34 static private Map<String, Integer> mPositions = new HashMap<String, Integer>();
36 private File [] mDirs;
37 private File [] mFiles;
38 private Handler mHandler;
39 private Runnable mUpdateFiles;
40 private ChoosePDFAdapter adapter;
41 private Purpose mPurpose;
44 protected void onCreate(Bundle savedInstanceState) {
45 super.onCreate(savedInstanceState);
47 mPurpose = PICK_KEY_FILE.equals(getIntent().getAction()) ? Purpose.PickKeyFile : Purpose.PickPDF;
50 String storageState = Environment.getExternalStorageState();
52 if (!Environment.MEDIA_MOUNTED.equals(storageState)
53 && !Environment.MEDIA_MOUNTED_READ_ONLY.equals(storageState))
55 AlertDialog.Builder builder = new AlertDialog.Builder(this);
56 builder.setTitle(R.string.no_media_warning);
57 builder.setMessage(R.string.no_media_hint);
58 AlertDialog alert = builder.create();
59 alert.setButton(AlertDialog.BUTTON_POSITIVE,getString(R.string.dismiss),
60 new OnClickListener() {
61 public void onClick(DialogInterface dialog, int which) {
69 if (mDirectory == null)
70 mDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
72 // Create a list adapter...
73 adapter = new ChoosePDFAdapter(getLayoutInflater());
74 setListAdapter(adapter);
76 // ...that is updated dynamically when files are scanned
77 mHandler = new Handler();
78 mUpdateFiles = new Runnable() {
80 Resources res = getResources();
81 String appName = res.getString(R.string.app_name);
82 String version = res.getString(R.string.version);
83 String title = res.getString(R.string.picker_title_App_Ver_Dir);
84 setTitle(String.format(title, appName, version, mDirectory));
86 mParent = mDirectory.getParentFile();
88 mDirs = mDirectory.listFiles(new FileFilter() {
90 public boolean accept(File file) {
91 return file.isDirectory();
97 mFiles = mDirectory.listFiles(new FileFilter() {
99 public boolean accept(File file) {
100 if (file.isDirectory())
102 String fname = file.getName().toLowerCase();
105 if (fname.endsWith(".pdf"))
107 if (fname.endsWith(".xps"))
109 if (fname.endsWith(".cbz"))
111 if (fname.endsWith(".png"))
113 if (fname.endsWith(".jpe"))
115 if (fname.endsWith(".jpeg"))
117 if (fname.endsWith(".jpg"))
119 if (fname.endsWith(".jfif"))
121 if (fname.endsWith(".jfif-tbnl"))
123 if (fname.endsWith(".tif"))
125 if (fname.endsWith(".tiff"))
129 if (fname.endsWith(".pfx"))
138 mFiles = new File[0];
140 Arrays.sort(mFiles, new Comparator<File>() {
141 public int compare(File arg0, File arg1) {
142 return arg0.getName().compareToIgnoreCase(arg1.getName());
146 Arrays.sort(mDirs, new Comparator<File>() {
147 public int compare(File arg0, File arg1) {
148 return arg0.getName().compareToIgnoreCase(arg1.getName());
154 adapter.add(new ChoosePDFItem(ChoosePDFItem.Type.PARENT, getString(R.string.parent_directory)));
156 adapter.add(new ChoosePDFItem(ChoosePDFItem.Type.DIR, f.getName()));
157 for (File f : mFiles)
158 adapter.add(new ChoosePDFItem(ChoosePDFItem.Type.DOC, f.getName()));
164 // Start initial file scan...
165 mHandler.post(mUpdateFiles);
167 // ...and observe the directory and scan files upon changes.
168 FileObserver observer = new FileObserver(mDirectory.getPath(), FileObserver.CREATE | FileObserver.DELETE) {
169 public void onEvent(int event, String path) {
170 mHandler.post(mUpdateFiles);
173 observer.startWatching();
176 private void lastPosition() {
177 String p = mDirectory.getAbsolutePath();
178 if (mPositions.containsKey(p))
179 getListView().setSelection(mPositions.get(p));
183 protected void onListItemClick(ListView l, View v, int position, long id) {
184 super.onListItemClick(l, v, position, id);
186 mPositions.put(mDirectory.getAbsolutePath(), getListView().getFirstVisiblePosition());
188 if (position < (mParent == null ? 0 : 1)) {
189 mDirectory = mParent;
190 mHandler.post(mUpdateFiles);
194 position -= (mParent == null ? 0 : 1);
196 if (position < mDirs.length) {
197 mDirectory = mDirs[position];
198 mHandler.post(mUpdateFiles);
202 position -= mDirs.length;
204 Uri uri = Uri.parse(mFiles[position].getAbsolutePath());
205 Intent intent = new Intent(this,MuPDFActivity.class);
206 intent.setAction(Intent.ACTION_VIEW);
210 // Start an activity to display the PDF file
211 startActivity(intent);
214 // Return the uri to the caller
215 setResult(RESULT_OK, intent);
222 protected void onPause() {
224 if (mDirectory != null)
225 mPositions.put(mDirectory.getAbsolutePath(), getListView().getFirstVisiblePosition());