summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Zimuzo Ezeozue <zezeozue@google.com> 2020-06-02 11:15:05 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2020-06-02 11:15:05 +0000
commitb8dd27d2162afe70a39d2e07614b016a38bb53ce (patch)
tree11df8ff2e915acd7e8f9d2409fc0cd354eedb6d9
parentd589cdeb17daac01fa687a4a0575d17154effd0c (diff)
parent46ca9f3dddff3f70afc89e0036f2b5ae234b38c0 (diff)
Merge "Support apps sharing file:// URIs with the camera API" into rvc-dev am: efbc3f2d5e am: d371efcfb2 am: 46ca9f3ddd
Original change: undetermined Change-Id: Ie3e406e4ae7a56b6b1c4e213032f8b005047dd15
-rw-r--r--core/java/android/app/Activity.java6
-rw-r--r--core/java/android/app/ContextImpl.java2
-rw-r--r--core/java/android/app/Instrumentation.java12
-rw-r--r--core/java/android/app/PendingIntent.java8
-rw-r--r--core/java/android/content/Intent.java40
-rw-r--r--core/java/android/service/voice/VoiceInteractionSession.java4
6 files changed, 53 insertions, 19 deletions
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 87fc8fe392f0..6c10682adc0e 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -5568,7 +5568,7 @@ public class Activity extends ContextThemeWrapper
options = transferSpringboardActivityOptions(options);
String resolvedType = null;
if (fillInIntent != null) {
- fillInIntent.migrateExtraStreamToClipData();
+ fillInIntent.migrateExtraStreamToClipData(this);
fillInIntent.prepareToLeaveProcess(this);
resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
}
@@ -5823,7 +5823,7 @@ public class Activity extends ContextThemeWrapper
if (referrer != null) {
intent.putExtra(Intent.EXTRA_REFERRER, referrer);
}
- intent.migrateExtraStreamToClipData();
+ intent.migrateExtraStreamToClipData(this);
intent.prepareToLeaveProcess(this);
result = ActivityTaskManager.getService()
.startActivity(mMainThread.getApplicationThread(), getBasePackageName(),
@@ -5894,7 +5894,7 @@ public class Activity extends ContextThemeWrapper
@Nullable Bundle options) {
if (mParent == null) {
try {
- intent.migrateExtraStreamToClipData();
+ intent.migrateExtraStreamToClipData(this);
intent.prepareToLeaveProcess(this);
return ActivityTaskManager.getService()
.startNextMatchingActivity(mToken, intent, options);
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 48160e475d50..86a3579effe1 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -1087,7 +1087,7 @@ class ContextImpl extends Context {
try {
String resolvedType = null;
if (fillInIntent != null) {
- fillInIntent.migrateExtraStreamToClipData();
+ fillInIntent.migrateExtraStreamToClipData(this);
fillInIntent.prepareToLeaveProcess(this);
resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
}
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index e233adeb3f65..721525d9af9d 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -1718,7 +1718,7 @@ public class Instrumentation {
}
}
try {
- intent.migrateExtraStreamToClipData();
+ intent.migrateExtraStreamToClipData(who);
intent.prepareToLeaveProcess(who);
int result = ActivityTaskManager.getService().startActivity(whoThread,
who.getBasePackageName(), who.getAttributionTag(), intent,
@@ -1788,7 +1788,7 @@ public class Instrumentation {
try {
String[] resolvedTypes = new String[intents.length];
for (int i=0; i<intents.length; i++) {
- intents[i].migrateExtraStreamToClipData();
+ intents[i].migrateExtraStreamToClipData(who);
intents[i].prepareToLeaveProcess(who);
resolvedTypes[i] = intents[i].resolveTypeIfNeeded(who.getContentResolver());
}
@@ -1857,7 +1857,7 @@ public class Instrumentation {
}
}
try {
- intent.migrateExtraStreamToClipData();
+ intent.migrateExtraStreamToClipData(who);
intent.prepareToLeaveProcess(who);
int result = ActivityTaskManager.getService().startActivity(whoThread,
who.getBasePackageName(), who.getAttributionTag(), intent,
@@ -1924,7 +1924,7 @@ public class Instrumentation {
}
}
try {
- intent.migrateExtraStreamToClipData();
+ intent.migrateExtraStreamToClipData(who);
intent.prepareToLeaveProcess(who);
int result = ActivityTaskManager.getService().startActivityAsUser(whoThread,
who.getBasePackageName(), who.getAttributionTag(), intent,
@@ -1970,7 +1970,7 @@ public class Instrumentation {
}
}
try {
- intent.migrateExtraStreamToClipData();
+ intent.migrateExtraStreamToClipData(who);
intent.prepareToLeaveProcess(who);
int result = ActivityTaskManager.getService()
.startActivityAsCaller(whoThread, who.getBasePackageName(), intent,
@@ -2017,7 +2017,7 @@ public class Instrumentation {
}
}
try {
- intent.migrateExtraStreamToClipData();
+ intent.migrateExtraStreamToClipData(who);
intent.prepareToLeaveProcess(who);
int result = appTask.startActivity(whoThread.asBinder(), who.getBasePackageName(),
who.getAttributionTag(), intent,
diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java
index 792f840638a9..cd352e141994 100644
--- a/core/java/android/app/PendingIntent.java
+++ b/core/java/android/app/PendingIntent.java
@@ -351,7 +351,7 @@ public final class PendingIntent implements Parcelable {
String resolvedType = intent != null ? intent.resolveTypeIfNeeded(
context.getContentResolver()) : null;
try {
- intent.migrateExtraStreamToClipData();
+ intent.migrateExtraStreamToClipData(context);
intent.prepareToLeaveProcess(context);
IIntentSender target =
ActivityManager.getService().getIntentSenderWithFeature(
@@ -377,7 +377,7 @@ public final class PendingIntent implements Parcelable {
String resolvedType = intent != null ? intent.resolveTypeIfNeeded(
context.getContentResolver()) : null;
try {
- intent.migrateExtraStreamToClipData();
+ intent.migrateExtraStreamToClipData(context);
intent.prepareToLeaveProcess(context);
IIntentSender target =
ActivityManager.getService().getIntentSenderWithFeature(
@@ -491,7 +491,7 @@ public final class PendingIntent implements Parcelable {
String packageName = context.getPackageName();
String[] resolvedTypes = new String[intents.length];
for (int i=0; i<intents.length; i++) {
- intents[i].migrateExtraStreamToClipData();
+ intents[i].migrateExtraStreamToClipData(context);
intents[i].prepareToLeaveProcess(context);
resolvedTypes[i] = intents[i].resolveTypeIfNeeded(context.getContentResolver());
}
@@ -517,7 +517,7 @@ public final class PendingIntent implements Parcelable {
String packageName = context.getPackageName();
String[] resolvedTypes = new String[intents.length];
for (int i=0; i<intents.length; i++) {
- intents[i].migrateExtraStreamToClipData();
+ intents[i].migrateExtraStreamToClipData(context);
intents[i].prepareToLeaveProcess(context);
resolvedTypes[i] = intents[i].resolveTypeIfNeeded(context.getContentResolver());
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index baaf8f76797a..e331471a33db 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -11272,6 +11272,19 @@ public class Intent implements Parcelable, Cloneable {
* @hide
*/
public boolean migrateExtraStreamToClipData() {
+ return migrateExtraStreamToClipData(AppGlobals.getInitialApplication());
+ }
+
+ /**
+ * Migrate any {@link #EXTRA_STREAM} in {@link #ACTION_SEND} and
+ * {@link #ACTION_SEND_MULTIPLE} to {@link ClipData}. Also inspects nested
+ * intents in {@link #ACTION_CHOOSER}.
+ *
+ * @param context app context
+ * @return Whether any contents were migrated.
+ * @hide
+ */
+ public boolean migrateExtraStreamToClipData(Context context) {
// Refuse to touch if extras already parcelled
if (mExtras != null && mExtras.isParcelled()) return false;
@@ -11289,7 +11302,7 @@ public class Intent implements Parcelable, Cloneable {
try {
final Intent intent = getParcelableExtra(EXTRA_INTENT);
if (intent != null) {
- migrated |= intent.migrateExtraStreamToClipData();
+ migrated |= intent.migrateExtraStreamToClipData(context);
}
} catch (ClassCastException e) {
}
@@ -11299,7 +11312,7 @@ public class Intent implements Parcelable, Cloneable {
for (int i = 0; i < intents.length; i++) {
final Intent intent = (Intent) intents[i];
if (intent != null) {
- migrated |= intent.migrateExtraStreamToClipData();
+ migrated |= intent.migrateExtraStreamToClipData(context);
}
}
}
@@ -11362,13 +11375,17 @@ public class Intent implements Parcelable, Cloneable {
} catch (ClassCastException e) {
}
} else if (isImageCaptureIntent()) {
- final Uri output;
+ Uri output;
try {
output = getParcelableExtra(MediaStore.EXTRA_OUTPUT);
} catch (ClassCastException e) {
return false;
}
+
if (output != null) {
+ output = maybeConvertFileToContentUri(context, output);
+ putExtra(MediaStore.EXTRA_OUTPUT, output);
+
setClipData(ClipData.newRawUri("", output));
addFlags(FLAG_GRANT_WRITE_URI_PERMISSION|FLAG_GRANT_READ_URI_PERMISSION);
return true;
@@ -11378,6 +11395,23 @@ public class Intent implements Parcelable, Cloneable {
return false;
}
+ private Uri maybeConvertFileToContentUri(Context context, Uri uri) {
+ if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())
+ && context.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.R) {
+ File file = new File(uri.getPath());
+ try {
+ if (!file.exists()) file.createNewFile();
+ uri = MediaStore.scanFile(context.getContentResolver(), new File(uri.getPath()));
+ if (uri != null) {
+ return uri;
+ }
+ } catch (IOException e) {
+ Log.e(TAG, "Ignoring failure to create file " + file, e);
+ }
+ }
+ return uri;
+ }
+
/**
* Convert the dock state to a human readable format.
* @hide
diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java
index 4a0dd870f797..0341b6d96b29 100644
--- a/core/java/android/service/voice/VoiceInteractionSession.java
+++ b/core/java/android/service/voice/VoiceInteractionSession.java
@@ -1311,7 +1311,7 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall
throw new IllegalStateException("Can't call before onCreate()");
}
try {
- intent.migrateExtraStreamToClipData();
+ intent.migrateExtraStreamToClipData(mContext);
intent.prepareToLeaveProcess(mContext);
int res = mSystemService.startVoiceActivity(mToken, intent,
intent.resolveType(mContext.getContentResolver()),
@@ -1340,7 +1340,7 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall
throw new IllegalStateException("Can't call before onCreate()");
}
try {
- intent.migrateExtraStreamToClipData();
+ intent.migrateExtraStreamToClipData(mContext);
intent.prepareToLeaveProcess(mContext);
int res = mSystemService.startAssistantActivity(mToken, intent,
intent.resolveType(mContext.getContentResolver()),