Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
7859 views
1
package com.artifex.mupdfdemo;
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
enum Purpose {
25
PickPDF,
26
PickKeyFile
27
}
28
29
public class ChoosePDFActivity extends ListActivity {
30
static public final String PICK_KEY_FILE = "com.artifex.mupdfdemo.PICK_KEY_FILE";
31
static private File mDirectory;
32
static private Map<String, Integer> mPositions = new HashMap<String, Integer>();
33
private File mParent;
34
private File [] mDirs;
35
private File [] mFiles;
36
private Handler mHandler;
37
private Runnable mUpdateFiles;
38
private ChoosePDFAdapter adapter;
39
private Purpose mPurpose;
40
41
@Override
42
protected void onCreate(Bundle savedInstanceState) {
43
super.onCreate(savedInstanceState);
44
45
mPurpose = PICK_KEY_FILE.equals(getIntent().getAction()) ? Purpose.PickKeyFile : Purpose.PickPDF;
46
47
48
String storageState = Environment.getExternalStorageState();
49
50
if (!Environment.MEDIA_MOUNTED.equals(storageState)
51
&& !Environment.MEDIA_MOUNTED_READ_ONLY.equals(storageState))
52
{
53
AlertDialog.Builder builder = new AlertDialog.Builder(this);
54
builder.setTitle(R.string.no_media_warning);
55
builder.setMessage(R.string.no_media_hint);
56
AlertDialog alert = builder.create();
57
alert.setButton(AlertDialog.BUTTON_POSITIVE,getString(R.string.dismiss),
58
new OnClickListener() {
59
public void onClick(DialogInterface dialog, int which) {
60
finish();
61
}
62
});
63
alert.show();
64
return;
65
}
66
67
if (mDirectory == null)
68
mDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
69
70
// Create a list adapter...
71
adapter = new ChoosePDFAdapter(getLayoutInflater());
72
setListAdapter(adapter);
73
74
// ...that is updated dynamically when files are scanned
75
mHandler = new Handler();
76
mUpdateFiles = new Runnable() {
77
public void run() {
78
Resources res = getResources();
79
String appName = res.getString(R.string.app_name);
80
String version = res.getString(R.string.version);
81
String title = res.getString(R.string.picker_title_App_Ver_Dir);
82
setTitle(String.format(title, appName, version, mDirectory));
83
84
mParent = mDirectory.getParentFile();
85
86
mDirs = mDirectory.listFiles(new FileFilter() {
87
88
public boolean accept(File file) {
89
return file.isDirectory();
90
}
91
});
92
if (mDirs == null)
93
mDirs = new File[0];
94
95
mFiles = mDirectory.listFiles(new FileFilter() {
96
97
public boolean accept(File file) {
98
if (file.isDirectory())
99
return false;
100
String fname = file.getName().toLowerCase();
101
switch (mPurpose) {
102
case PickPDF:
103
if (fname.endsWith(".pdf"))
104
return true;
105
if (fname.endsWith(".xps"))
106
return true;
107
if (fname.endsWith(".cbz"))
108
return true;
109
if (fname.endsWith(".epub"))
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
}
228
229