]> rtime.felk.cvut.cz Git - hornmich/skoda-qr-demo.git/blob - QRScanner/mobile/src/main/java/cz/cvut/fel/dce/qrscanner/mupdf/ChoosePDFActivity.java
Add MuPDF native source codes
[hornmich/skoda-qr-demo.git] / QRScanner / mobile / src / main / java / cz / cvut / fel / dce / qrscanner / mupdf / ChoosePDFActivity.java
1 package cz.cvut.fel.dce.qrscanner.mupdf;
2
3 import java.io.File;
4 import java.io.FileFilter;
5 import java.util.Arrays;
6 import java.util.Comparator;
7 import java.util.HashMap;
8 import java.util.Map;
9
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;
23
24 import cz.cvut.fel.dce.qrscanner.R;
25
26 enum Purpose {
27         PickPDF,
28         PickKeyFile
29 }
30
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>();
35         private File         mParent;
36         private File []      mDirs;
37         private File []      mFiles;
38         private Handler      mHandler;
39         private Runnable     mUpdateFiles;
40         private ChoosePDFAdapter adapter;
41         private Purpose      mPurpose;
42
43         @Override
44         protected void onCreate(Bundle savedInstanceState) {
45                 super.onCreate(savedInstanceState);
46
47                 mPurpose = PICK_KEY_FILE.equals(getIntent().getAction()) ? Purpose.PickKeyFile : Purpose.PickPDF;
48
49
50                 String storageState = Environment.getExternalStorageState();
51
52                 if (!Environment.MEDIA_MOUNTED.equals(storageState)
53                                 && !Environment.MEDIA_MOUNTED_READ_ONLY.equals(storageState))
54                 {
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) {
62                                                         finish();
63                                                 }
64                                         });
65                         alert.show();
66                         return;
67                 }
68
69                 if (mDirectory == null)
70                         mDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
71
72                 // Create a list adapter...
73                 adapter = new ChoosePDFAdapter(getLayoutInflater());
74                 setListAdapter(adapter);
75
76                 // ...that is updated dynamically when files are scanned
77                 mHandler = new Handler();
78                 mUpdateFiles = new Runnable() {
79                         public void run() {
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));
85
86                                 mParent = mDirectory.getParentFile();
87
88                                 mDirs = mDirectory.listFiles(new FileFilter() {
89
90                                         public boolean accept(File file) {
91                                                 return file.isDirectory();
92                                         }
93                                 });
94                                 if (mDirs == null)
95                                         mDirs = new File[0];
96
97                                 mFiles = mDirectory.listFiles(new FileFilter() {
98
99                                         public boolean accept(File file) {
100                                                 if (file.isDirectory())
101                                                         return false;
102                                                 String fname = file.getName().toLowerCase();
103                                                 switch (mPurpose) {
104                                                 case PickPDF:
105                                                         if (fname.endsWith(".pdf"))
106                                                                 return true;
107                                                         if (fname.endsWith(".xps"))
108                                                                 return true;
109                                                         if (fname.endsWith(".cbz"))
110                                                                 return true;
111                                                         if (fname.endsWith(".png"))
112                                                                 return true;
113                                                         if (fname.endsWith(".jpe"))
114                                                                 return true;
115                                                         if (fname.endsWith(".jpeg"))
116                                                                 return true;
117                                                         if (fname.endsWith(".jpg"))
118                                                                 return true;
119                                                         if (fname.endsWith(".jfif"))
120                                                                 return true;
121                                                         if (fname.endsWith(".jfif-tbnl"))
122                                                                 return true;
123                                                         if (fname.endsWith(".tif"))
124                                                                 return true;
125                                                         if (fname.endsWith(".tiff"))
126                                                                 return true;
127                                                         return false;
128                                                 case PickKeyFile:
129                                                         if (fname.endsWith(".pfx"))
130                                                                 return true;
131                                                         return false;
132                                                 default:
133                                                         return false;
134                                                 }
135                                         }
136                                 });
137                                 if (mFiles == null)
138                                         mFiles = new File[0];
139
140                                 Arrays.sort(mFiles, new Comparator<File>() {
141                                         public int compare(File arg0, File arg1) {
142                                                 return arg0.getName().compareToIgnoreCase(arg1.getName());
143                                         }
144                                 });
145
146                                 Arrays.sort(mDirs, new Comparator<File>() {
147                                         public int compare(File arg0, File arg1) {
148                                                 return arg0.getName().compareToIgnoreCase(arg1.getName());
149                                         }
150                                 });
151
152                                 adapter.clear();
153                                 if (mParent != null)
154                                         adapter.add(new ChoosePDFItem(ChoosePDFItem.Type.PARENT, getString(R.string.parent_directory)));
155                                 for (File f : mDirs)
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()));
159
160                                 lastPosition();
161                         }
162                 };
163
164                 // Start initial file scan...
165                 mHandler.post(mUpdateFiles);
166
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);
171                         }
172                 };
173                 observer.startWatching();
174         }
175
176         private void lastPosition() {
177                 String p = mDirectory.getAbsolutePath();
178                 if (mPositions.containsKey(p))
179                         getListView().setSelection(mPositions.get(p));
180         }
181
182         @Override
183         protected void onListItemClick(ListView l, View v, int position, long id) {
184                 super.onListItemClick(l, v, position, id);
185
186                 mPositions.put(mDirectory.getAbsolutePath(), getListView().getFirstVisiblePosition());
187
188                 if (position < (mParent == null ? 0 : 1)) {
189                         mDirectory = mParent;
190                         mHandler.post(mUpdateFiles);
191                         return;
192                 }
193
194                 position -= (mParent == null ? 0 : 1);
195
196                 if (position < mDirs.length) {
197                         mDirectory = mDirs[position];
198                         mHandler.post(mUpdateFiles);
199                         return;
200                 }
201
202                 position -= mDirs.length;
203
204                 Uri uri = Uri.parse(mFiles[position].getAbsolutePath());
205                 Intent intent = new Intent(this,MuPDFActivity.class);
206                 intent.setAction(Intent.ACTION_VIEW);
207                 intent.setData(uri);
208                 switch (mPurpose) {
209                 case PickPDF:
210                         // Start an activity to display the PDF file
211                         startActivity(intent);
212                         break;
213                 case PickKeyFile:
214                         // Return the uri to the caller
215                         setResult(RESULT_OK, intent);
216                         finish();
217                         break;
218                 }
219         }
220
221         @Override
222         protected void onPause() {
223                 super.onPause();
224                 if (mDirectory != null)
225                         mPositions.put(mDirectory.getAbsolutePath(), getListView().getFirstVisiblePosition());
226         }
227 }