From cc2ae6b421353e03160df3b05ce9042b8a5ff8cc Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Tue, 29 Sep 2015 13:04:46 -0700 Subject: Relax auto-launch checks for GET_CONTENT. When a developer wraps an intent with Intent.createChooser(), they're indicating that the user should always be prompted, instead of using any "always use" defaults. A recent CL changed the chooser behavior to ensure that UI is always shown in the case where there is only one match. However, this caused us to start prompting for the GET_CONTENT intent, for which there is only ever one DocumentsUI system app. Since that app delivers on the createChooser() contract described above, we're okay automatically launching it. Bug: 24464358 Change-Id: I0279d3343479c134a35f41ddf3cb4204d0ae6a90 --- core/java/android/provider/DocumentsContract.java | 3 +++ .../com/android/internal/app/ChooserActivity.java | 16 ++++++++++++++- .../com/android/internal/app/ResolverActivity.java | 23 ++++++++++++---------- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index c7ba60768a72..f5221c652ec9 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -130,6 +130,9 @@ public final class DocumentsContract { */ private static final int THUMBNAIL_BUFFER_SIZE = (int) (128 * KB_IN_BYTES); + /** {@hide} */ + public static final String PACKAGE_DOCUMENTS_UI = "com.android.documentsui"; + /** * Constants related to a document, including {@link Cursor} column names * and flags. diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 3219dcb5ad8b..2e0bf0652c4a 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -40,6 +40,7 @@ import android.os.RemoteException; import android.os.ResultReceiver; import android.os.UserHandle; import android.os.UserManager; +import android.provider.DocumentsContract; import android.service.chooser.ChooserTarget; import android.service.chooser.ChooserTargetService; import android.service.chooser.IChooserTargetResult; @@ -269,7 +270,20 @@ public class ChooserActivity extends ResolverActivity { } @Override - boolean shouldAutoLaunchSingleChoice() { + boolean shouldAutoLaunchSingleChoice(TargetInfo target) { + final Intent intent = target.getResolvedIntent(); + final ResolveInfo resolve = target.getResolveInfo(); + + // When GET_CONTENT is handled by the DocumentsUI system component, + // we're okay automatically launching it, since it offers it's own + // intent disambiguation UI. + if (intent != null && Intent.ACTION_GET_CONTENT.equals(intent.getAction()) + && resolve != null && resolve.priority > 0 + && resolve.activityInfo != null && DocumentsContract.PACKAGE_DOCUMENTS_UI + .equals(resolve.activityInfo.packageName)) { + return true; + } + return false; } diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index ef9d1cebff57..17104894310e 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -796,7 +796,7 @@ public class ResolverActivity extends Activity { return false; } - boolean shouldAutoLaunchSingleChoice() { + boolean shouldAutoLaunchSingleChoice(TargetInfo target) { return true; } @@ -837,18 +837,21 @@ public class ResolverActivity extends Activity { mAlwaysUseOption = alwaysUseOption; int count = mAdapter.getUnfilteredCount(); - if ((!shouldAutoLaunchSingleChoice() && count > 0) - || count > 1 - || (count == 1 && mAdapter.getOtherProfile() != null)) { + if (count == 1 && mAdapter.getOtherProfile() == null) { + // Only one target, so we're a candidate to auto-launch! + final TargetInfo target = mAdapter.targetInfoForPosition(0, false); + if (shouldAutoLaunchSingleChoice(target)) { + safelyStartActivity(target); + mPackageMonitor.unregister(); + mRegistered = false; + finish(); + return true; + } + } + if (count > 0) { setContentView(layoutId); mAdapterView = (AbsListView) findViewById(R.id.resolver_list); onPrepareAdapterView(mAdapterView, mAdapter, alwaysUseOption); - } else if (count == 1) { - safelyStartActivity(mAdapter.targetInfoForPosition(0, false)); - mPackageMonitor.unregister(); - mRegistered = false; - finish(); - return true; } else { setContentView(R.layout.resolver_list); -- cgit v1.2.3-59-g8ed1b