-
-
Notifications
You must be signed in to change notification settings - Fork 157
/
Copy pathResolveMediaTask.java
124 lines (98 loc) · 4.12 KB
/
ResolveMediaTask.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package org.thoughtcrime.securesms;
import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Process;
import android.provider.OpenableColumns;
import android.util.Log;
import org.thoughtcrime.securesms.providers.PersistentBlobProvider;
import org.thoughtcrime.securesms.util.FileUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.util.HashSet;
import static org.thoughtcrime.securesms.util.MediaUtil.getMimeType;
import de.cketti.safecontentresolver.SafeContentResolver;
import de.cketti.safecontentresolver.SafeContentResolverCompat;
public class ResolveMediaTask extends AsyncTask<Uri, Void, Uri> {
private static final String TAG = ResolveMediaTask.class.getSimpleName();
interface OnMediaResolvedListener {
void onMediaResolved(Uri uri);
}
private final WeakReference<Activity> contextRef;
private final WeakReference<OnMediaResolvedListener> listenerWeakReference;
private static final HashSet<ResolveMediaTask> instances = new HashSet<>();
ResolveMediaTask(Activity activityContext, ResolveMediaTask.OnMediaResolvedListener listener) {
this.contextRef = new WeakReference<>(activityContext);
this.listenerWeakReference = new WeakReference<>(listener);
instances.add(this);
}
@Override
protected Uri doInBackground(Uri... uris) {
try {
Uri uri = uris[0];
if (uris.length != 1 || uri == null) {
return null;
}
InputStream inputStream;
String fileName = null;
Long fileSize = null;
SafeContentResolver safeContentResolver = SafeContentResolverCompat.newInstance(contextRef.get());
inputStream = safeContentResolver.openInputStream(uri);
if (inputStream == null) {
return null;
}
Cursor cursor = contextRef.get().getContentResolver().query(uri, new String[]{OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE}, null, null, null);
try {
if (cursor != null && cursor.moveToFirst()) {
try {
fileName = cursor.getString(cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME));
fileSize = cursor.getLong(cursor.getColumnIndexOrThrow(OpenableColumns.SIZE));
} catch (IllegalArgumentException e) {
Log.w(TAG, e);
}
}
} finally {
if (cursor != null) cursor.close();
}
if (fileName == null) {
fileName = uri.getLastPathSegment();
}
String mimeType = getMimeType(contextRef.get(), uri);
return PersistentBlobProvider.getInstance().create(contextRef.get(), inputStream, mimeType, fileName, fileSize);
} catch (NullPointerException | FileNotFoundException ioe) {
Log.w(TAG, ioe);
return null;
}
}
@Override
protected void onPostExecute(Uri uri) {
instances.remove(this);
if (!this.isCancelled()) {
listenerWeakReference.get().onMediaResolved(uri);
}
}
@Override
protected void onCancelled() {
instances.remove(this);
super.onCancelled();
listenerWeakReference.get().onMediaResolved(null);
}
public static boolean isExecuting() {
return !instances.isEmpty();
}
public static void cancelTasks() {
for (ResolveMediaTask task : instances) {
task.cancel(true);
}
}
private boolean hasFileScheme(Uri uri) {
if (uri == null) {
return false;
}
return "file".equals(uri.getScheme());
}
}