summaryrefslogtreecommitdiffstats
path: root/src/com/android/providers/downloads/OpenHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/providers/downloads/OpenHelper.java')
-rw-r--r--src/com/android/providers/downloads/OpenHelper.java57
1 files changed, 56 insertions, 1 deletions
diff --git a/src/com/android/providers/downloads/OpenHelper.java b/src/com/android/providers/downloads/OpenHelper.java
index c88902b7..19cfee95 100644
--- a/src/com/android/providers/downloads/OpenHelper.java
+++ b/src/com/android/providers/downloads/OpenHelper.java
@@ -29,11 +29,13 @@ import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInstaller;
+import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Process;
import android.provider.DocumentsContract;
import android.provider.Downloads.Impl.RequestHeaders;
+import android.provider.MediaStore;
import android.util.Log;
import java.io.File;
@@ -51,6 +53,10 @@ public class OpenHelper {
}
intent.addFlags(intentFlags);
+ return startViewIntent(context, intent);
+ }
+
+ public static boolean startViewIntent(Context context, Intent intent) {
try {
context.startActivity(intent);
return true;
@@ -60,6 +66,42 @@ public class OpenHelper {
}
}
+ public static Intent buildViewIntentForMediaStoreDownload(Context context,
+ Uri documentUri) {
+ final long mediaStoreId = MediaStoreDownloadsHelper.getMediaStoreId(
+ DocumentsContract.getDocumentId(documentUri));
+ final Uri queryUri = ContentUris.withAppendedId(
+ MediaStore.Downloads.EXTERNAL_CONTENT_URI, mediaStoreId);
+ try (Cursor cursor = context.getContentResolver().query(
+ queryUri, null, null, null)) {
+ if (cursor.moveToFirst()) {
+ final String mimeType = cursor.getString(
+ cursor.getColumnIndex(MediaStore.Downloads.MIME_TYPE));
+
+ final Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setDataAndType(documentUri, mimeType);
+ intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
+ | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+
+ if ("application/vnd.android.package-archive".equals(mimeType)) {
+ // Also splice in details about where it came from
+ intent.putExtra(Intent.EXTRA_ORIGINATING_URI,
+ getCursorUri(cursor, MediaStore.Downloads.DOWNLOAD_URI));
+ intent.putExtra(Intent.EXTRA_REFERRER,
+ getCursorUri(cursor, MediaStore.Downloads.REFERER_URI));
+ final String ownerPackageName = getCursorString(cursor,
+ MediaStore.Downloads.OWNER_PACKAGE_NAME);
+ final int ownerUid = getPackageUid(context, ownerPackageName);
+ if (ownerUid > 0) {
+ intent.putExtra(Intent.EXTRA_ORIGINATING_UID, ownerUid);
+ }
+ }
+ return intent;
+ }
+ }
+ return null;
+ }
+
/**
* Build an {@link Intent} to view the download with given ID, handling
* subtleties around installing packages.
@@ -140,12 +182,25 @@ public class OpenHelper {
return PackageInstaller.SessionParams.UID_UNKNOWN;
}
+ private static int getPackageUid(Context context, String packageName) {
+ if (packageName == null) {
+ return -1;
+ }
+ try {
+ return context.getPackageManager().getPackageUid(packageName, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "Couldn't get uid for " + packageName, e);
+ return -1;
+ }
+ }
+
private static String getCursorString(Cursor cursor, String column) {
return cursor.getString(cursor.getColumnIndexOrThrow(column));
}
private static Uri getCursorUri(Cursor cursor, String column) {
- return Uri.parse(getCursorString(cursor, column));
+ final String uriString = cursor.getString(cursor.getColumnIndexOrThrow(column));
+ return uriString == null ? null : Uri.parse(uriString);
}
private static File getCursorFile(Cursor cursor, String column) {