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

Commit b21808bd authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Improvements on ACTION_REQUEST_SET_AUTOFILL_SERVICE:" into oc-dev

parents c028a7d9 aa7a23b4
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -3077,9 +3077,17 @@
            android:permission="android.permission.DUMP"
            android:enabled="@bool/config_has_help" />

        <activity android:name=".applications.defaultapps.AutofillPickerActivity"
                android:taskAffinity=""
                android:noHistory="true">
        <activity android:name=".applications.autofill.AutofillPickerActivity"
                android:excludeFromRecents="true"
                android:launchMode="singleInstance"
                android:exported="false">
        </activity>

        <activity android:name=".applications.autofill.AutofillPickerTrampolineActivity"
                android:theme="@android:style/Theme.NoDisplay"
                android:excludeFromRecents="true"
                android:launchMode="singleInstance"
                android:label="@string/autofill_app">
            <intent-filter android:priority="1">
                <action android:name="android.settings.REQUEST_SET_AUTOFILL_SERVICE" />
                <category android:name="android.intent.category.DEFAULT" />
+3 −3
Original line number Diff line number Diff line
@@ -11,16 +11,17 @@
 * KIND, either express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
package com.android.settings.applications.defaultapps;
package com.android.settings.applications.autofill;

import android.content.Intent;
import android.os.Bundle;

import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.applications.defaultapps.DefaultAutofillPicker;

/**
 * Standalone activity used to launch {@link DefaultAppPickerFragment} from a
 * Standalone activity used to launch a {@link DefaultAutofillPicker} fragment from a
 * {@link android.provider.Settings#ACTION_REQUEST_SET_AUTOFILL_SERVICE} intent.
 */
public class AutofillPickerActivity extends SettingsActivity {
@@ -32,7 +33,6 @@ public class AutofillPickerActivity extends SettingsActivity {
        intent.putExtra(EXTRA_SHOW_FRAGMENT, DefaultAutofillPicker.class.getName());
        intent.putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, R.string.autofill_app);
        intent.putExtra(DefaultAutofillPicker.EXTRA_PACKAGE_NAME, packageName);

        super.onCreate(savedInstanceState);
    }

+63 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the
 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
package com.android.settings.applications.autofill;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.autofill.AutofillManager;

import com.android.settings.applications.defaultapps.DefaultAutofillPicker;

/**
 * Standalone activity used to launch a {@link DefaultAutofillPicker} fragment from a
 * {@link android.provider.Settings#ACTION_REQUEST_SET_AUTOFILL_SERVICE} intent.
 *
 * <p>It first check for cases that can fail fast, then forward to {@link AutofillPickerActivity}
 * if necessary.
 */
public class AutofillPickerTrampolineActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // First check if the current user's service already belongs to the app...
        final Intent intent = getIntent();
        final String packageName = intent.getData().getSchemeSpecificPart();
        final String currentService = DefaultAutofillPicker.getDefaultKey(this);
        if (currentService != null && currentService.startsWith(packageName)) {
            // ...and succeed right away if it does.
            setResult(RESULT_OK);
            finish();
            return;
        }

        // Then check if the Autofill is available for the current user...
        final AutofillManager afm = getSystemService(AutofillManager.class);
        if (afm == null || !afm.hasAutofillFeature() || !afm.isAutofillSupported()) {
            // ... and fail right away if it is not.
            setResult(RESULT_CANCELED);
            finish();
            return;
        }

        // Otherwise, go ahead and show the real UI...
        final Intent newIntent = new Intent(this, AutofillPickerActivity.class)
                .setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT)
                .setData(intent.getData());
        startActivity(newIntent);
        finish();
    }
}
+22 −4
Original line number Diff line number Diff line
@@ -55,8 +55,8 @@ public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment
        if (TextUtils.isEmpty(confirmationMessage)) {
            super.onRadioButtonClicked(selected);
        } else if (activity != null) {
            final DialogFragment fragment = ConfirmationDialogFragment.newInstance(
                    this, selectedKey, confirmationMessage);
            final DialogFragment fragment =
                    newConfirmationDialogFragment(selectedKey, confirmationMessage);
            fragment.show(activity.getFragmentManager(), ConfirmationDialogFragment.TAG);
        }
    }
@@ -74,6 +74,11 @@ public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment
        }
    }

    protected ConfirmationDialogFragment newConfirmationDialogFragment(String selectedKey,
            CharSequence confirmationMessage) {
        return ConfirmationDialogFragment.newInstance(this, selectedKey, confirmationMessage);
    }

    protected CharSequence getConfirmationMessage(CandidateInfo info) {
        return null;
    }
@@ -85,6 +90,12 @@ public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment
        public static final String EXTRA_KEY = "extra_key";
        public static final String EXTRA_MESSAGE = "extra_message";

        private final DialogInterface.OnClickListener mCancelListener;

        private ConfirmationDialogFragment(DialogInterface.OnClickListener cancelListener) {
            mCancelListener = cancelListener;
        }

        @Override
        public int getMetricsCategory() {
            return MetricsProto.MetricsEvent.DEFAULT_APP_PICKER_CONFIRMATION_DIALOG;
@@ -92,7 +103,14 @@ public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment

        public static ConfirmationDialogFragment newInstance(DefaultAppPickerFragment parent,
                String key, CharSequence message) {
            final ConfirmationDialogFragment fragment = new ConfirmationDialogFragment();
            return newInstance(parent, key, message, null);
        }

        // TODO: add test case for cancelListener
        public static ConfirmationDialogFragment newInstance(DefaultAppPickerFragment parent,
                String key, CharSequence message, DialogInterface.OnClickListener cancelListener) {
            final ConfirmationDialogFragment fragment = new ConfirmationDialogFragment(
                    cancelListener);
            final Bundle argument = new Bundle();
            argument.putString(EXTRA_KEY, key);
            argument.putCharSequence(EXTRA_MESSAGE, message);
@@ -107,7 +125,7 @@ public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment
            final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
                    .setMessage(bundle.getCharSequence(EXTRA_MESSAGE))
                    .setPositiveButton(android.R.string.ok, this)
                    .setNegativeButton(android.R.string.cancel, null);
                    .setNegativeButton(android.R.string.cancel, mCancelListener);
            return builder.create();
        }

+38 −2
Original line number Diff line number Diff line
@@ -18,10 +18,13 @@ package com.android.settings.applications.defaultapps;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
import android.provider.Settings;
import android.service.autofill.AutofillService;
import android.service.autofill.AutofillServiceInfo;
@@ -30,6 +33,7 @@ import android.text.TextUtils;

import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.applications.defaultapps.DefaultAppPickerFragment.ConfirmationDialogFragment;

import java.util.ArrayList;
import java.util.List;
@@ -39,7 +43,35 @@ public class DefaultAutofillPicker extends DefaultAppPickerFragment {
    static final String SETTING = Settings.Secure.AUTOFILL_SERVICE;
    static final Intent AUTOFILL_PROBE = new Intent(AutofillService.SERVICE_INTERFACE);

    static final String EXTRA_PACKAGE_NAME = "package_name";
    /**
     * Extra set when the fragment is implementing ACTION_REQUEST_SET_AUTOFILL_SERVICE.
     */
    public static final String EXTRA_PACKAGE_NAME = "package_name";

    /**
     * Set when the fragment is implementing ACTION_REQUEST_SET_AUTOFILL_SERVICE.
     */
    public DialogInterface.OnClickListener mCancelListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final Activity activity = getActivity();
        if (activity != null && activity.getIntent().getStringExtra(EXTRA_PACKAGE_NAME) != null) {
            mCancelListener = (d, w) -> {
                activity.setResult(Activity.RESULT_CANCELED);
                activity.finish();
            };
        }
    }

    @Override
    protected ConfirmationDialogFragment newConfirmationDialogFragment(String selectedKey,
            CharSequence confirmationMessage) {
        return ConfirmationDialogFragment.newInstance(this, selectedKey, confirmationMessage,
                mCancelListener);
    }

    @Override
    public int getMetricsCategory() {
@@ -63,9 +95,13 @@ public class DefaultAutofillPicker extends DefaultAppPickerFragment {
        return candidates;
    }

    public static String getDefaultKey(Context context) {
        return Settings.Secure.getString(context.getContentResolver(), SETTING);
    }

    @Override
    protected String getDefaultKey() {
        return Settings.Secure.getString(getContext().getContentResolver(), SETTING);
        return getDefaultKey(getContext());
    }

    @Override