Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc2ae6b4 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

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
parent c25d5460
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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.
+15 −1
Original line number Diff line number Diff line
@@ -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;
    }

+13 −10
Original line number Diff line number Diff line
@@ -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)) {
            setContentView(layoutId);
            mAdapterView = (AbsListView) findViewById(R.id.resolver_list);
            onPrepareAdapterView(mAdapterView, mAdapter, alwaysUseOption);
        } else if (count == 1) {
            safelyStartActivity(mAdapter.targetInfoForPosition(0, false));
        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 {
            setContentView(R.layout.resolver_list);