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

Commit c240b278 authored by menghanli's avatar menghanli
Browse files

Add back "Tapping Stop will stop x" dialog while turning off an accessibility service

Bug: 146539308
Test: make RunSettingsRoboTests2
Change-Id: Ic572f9245db016bd79a272030f97004a21f4b672
parent a85a1456
Loading
Loading
Loading
Loading
+19 −7
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTE
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.os.storage.StorageManager;
import android.text.BidiFormatter;
@@ -59,13 +60,7 @@ public class AccessibilityServiceWarning {
        return false;
    };

    /**
     * Gets a content View for a dialog to confirm that they want to enable a service.
     *
     * @param context A valid context
     * @param info The info about a service
     * @return A content view suitable for viewing
     */
    /** Returns a {@link Dialog} to be shown to confirm that they want to enable a service. */
    public static Dialog createCapabilitiesDialog(Context context,
            AccessibilityServiceInfo info, View.OnClickListener listener) {
        final AlertDialog ad = new AlertDialog.Builder(context)
@@ -137,6 +132,23 @@ public class AccessibilityServiceWarning {
        return content;
    }

    /** Returns a {@link Dialog} to be shown to confirm that they want to disable a service. */
    public static Dialog createDisableDialog(Context context,
            AccessibilityServiceInfo info, DialogInterface.OnClickListener listener) {
        final AlertDialog dialog = new AlertDialog.Builder(context)
                .setTitle(context.getString(R.string.disable_service_title,
                        info.getResolveInfo().loadLabel(context.getPackageManager())))
                .setMessage(context.getString(R.string.disable_service_message,
                        context.getString(R.string.accessibility_dialog_button_stop),
                        getServiceName(context, info)))
                .setCancelable(true)
                .setPositiveButton(R.string.accessibility_dialog_button_stop, listener)
                .setNegativeButton(R.string.accessibility_dialog_button_cancel, listener)
                .create();

        return dialog;
    }

    // Get the service name and bidi wrap it to protect from bidi side effects.
    private static CharSequence getServiceName(Context context, AccessibilityServiceInfo info) {
        final Locale locale = context.getResources().getConfiguration().getLocales().get(0);
+46 −14
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
@@ -129,7 +130,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends
                }
                mDialog = AccessibilityServiceWarning
                        .createCapabilitiesDialog(getPrefContext(), info,
                                this::onDialogButtonFromToggleClicked);
                                this::onDialogButtonFromEnableToggleClicked);
                break;
            }
            case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT: {
@@ -142,6 +143,16 @@ public class ToggleAccessibilityServicePreferenceFragment extends
                                this::onDialogButtonFromShortcutClicked);
                break;
            }
            case DialogEnums.DISABLE_WARNING_FROM_TOGGLE: {
                final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
                if (info == null) {
                    return null;
                }
                mDialog = AccessibilityServiceWarning
                        .createDisableDialog(getPrefContext(), info,
                                this::onDialogButtonFromDisableToggleClicked);
                break;
            }
            case DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL: {
                if (AccessibilityUtil.isGestureNavigateEnabled(getPrefContext())) {
                    mDialog = AccessibilityGestureNavigationTutorial
@@ -165,6 +176,8 @@ public class ToggleAccessibilityServicePreferenceFragment extends
            case DialogEnums.ENABLE_WARNING_FROM_TOGGLE:
            case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT:
                return SettingsEnums.DIALOG_ACCESSIBILITY_SERVICE_ENABLE;
            case DialogEnums.DISABLE_WARNING_FROM_TOGGLE:
                return SettingsEnums.DIALOG_ACCESSIBILITY_SERVICE_DISABLE;
            case DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL:
                return AccessibilityUtil.isGestureNavigateEnabled(getPrefContext())
                        ? SettingsEnums.DIALOG_TOGGLE_SCREEN_GESTURE_NAVIGATION
@@ -203,7 +216,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == ACTIVITY_REQUEST_CONFIRM_CREDENTIAL_FOR_WEAKER_ENCRYPTION) {
            if (resultCode == Activity.RESULT_OK) {
                handleConfirmServiceEnabled(true);
                handleConfirmServiceEnabled(/* confirmed= */ true);
                // The user confirmed that they accept weaker encryption when
                // enabling the accessibility service, so change encryption.
                // Since we came here asynchronously, check encryption again.
@@ -213,7 +226,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends
                            Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT, 0);
                }
            } else {
                handleConfirmServiceEnabled(false);
                handleConfirmServiceEnabled(/* confirmed= */ false);
            }
        }
    }
@@ -323,17 +336,31 @@ public class ToggleAccessibilityServicePreferenceFragment extends
                getPackageManager());
    }

    private void onDialogButtonFromToggleClicked(View view) {
        if (view.getId() == R.id.permission_enable_allow_button) {
            onAllowButtonFromToggleClicked();
        } else if (view.getId() == R.id.permission_enable_deny_button) {
            onDenyButtonFromToggleClicked();
    private void onDialogButtonFromDisableToggleClicked(DialogInterface dialog, int which) {
        switch (which) {
            case DialogInterface.BUTTON_POSITIVE:
                handleConfirmServiceEnabled(/* confirmed= */ false);
                break;
            case DialogInterface.BUTTON_NEGATIVE:
                handleConfirmServiceEnabled(/* confirmed= */ true);
                break;
            default:
                throw new IllegalArgumentException("Unexpected button identifier");
        }
    }

    private void onDialogButtonFromEnableToggleClicked(View view) {
        final int viewId = view.getId();
        if (viewId == R.id.permission_enable_allow_button) {
            onAllowButtonFromEnableToggleClicked();
        } else if (viewId == R.id.permission_enable_deny_button) {
            onDenyButtonFromEnableToggleClicked();
        } else {
            throw new IllegalArgumentException("Unexpected view id");
        }
    }

    private void onAllowButtonFromToggleClicked() {
    private void onAllowButtonFromEnableToggleClicked() {
        if (isFullDiskEncrypted()) {
            final String title = createConfirmCredentialReasonMessage();
            final Intent intent = ConfirmDeviceCredentialActivity.createIntent(title, /* details= */
@@ -351,15 +378,16 @@ public class ToggleAccessibilityServicePreferenceFragment extends
        mDialog.dismiss();
    }

    private void onDenyButtonFromToggleClicked() {
    private void onDenyButtonFromEnableToggleClicked() {
        handleConfirmServiceEnabled(/* confirmed= */ false);
        mDialog.dismiss();
    }

    void onDialogButtonFromShortcutClicked(View view) {
        if (view.getId() == R.id.permission_enable_allow_button) {
        final int viewId = view.getId();
        if (viewId == R.id.permission_enable_allow_button) {
            onAllowButtonFromShortcutClicked();
        } else if (view.getId() == R.id.permission_enable_deny_button) {
        } else if (viewId == R.id.permission_enable_deny_button) {
            onDenyButtonFromShortcutClicked();
        } else {
            throw new IllegalArgumentException("Unexpected view id");
@@ -384,7 +412,8 @@ public class ToggleAccessibilityServicePreferenceFragment extends
    private boolean onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked) {
        if (checked) {
            mSwitchBar.setCheckedInternal(false);
            getArguments().putBoolean(AccessibilitySettings.EXTRA_CHECKED, false);
            getArguments().putBoolean(AccessibilitySettings.EXTRA_CHECKED,
                    /* disableService */ false);
            if (!mShortcutPreference.getChecked()) {
                showPopupDialog(DialogEnums.ENABLE_WARNING_FROM_TOGGLE);
            } else {
@@ -394,7 +423,10 @@ public class ToggleAccessibilityServicePreferenceFragment extends
                }
            }
        } else {
            handleConfirmServiceEnabled(/* confirmed= */ false);
            mSwitchBar.setCheckedInternal(true);
            getArguments().putBoolean(AccessibilitySettings.EXTRA_CHECKED,
                    /* enableService */ true);
            showDialog(DialogEnums.DISABLE_WARNING_FROM_TOGGLE);
        }
        return true;
    }
+21 −10
Original line number Diff line number Diff line
@@ -258,6 +258,7 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
    /** Denotes the dialog emuns for show dialog */
    @Retention(RetentionPolicy.SOURCE)
    protected @interface DialogEnums {

        /** OPEN: Settings > Accessibility > Any toggle service > Shortcut > Settings. */
        int EDIT_SHORTCUT = 1;

@@ -265,28 +266,38 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
        int MAGNIFICATION_EDIT_SHORTCUT = 1001;

        /**
         * OPEN: Settings > Accessibility > Magnification > Toggle user service in gesture
         * navigation.
         * OPEN: Settings > Accessibility > Downloaded toggle service > Toggle use service to
         * enable service.
         */
        int GESTURE_NAVIGATION_TUTORIAL = 1002;
        int ENABLE_WARNING_FROM_TOGGLE = 1002;


        /** OPEN: Settings > Accessibility > Downloaded toggle service > Shortcut checkbox. */
        int ENABLE_WARNING_FROM_SHORTCUT = 1003;

        /**
         * OPEN: Settings > Accessibility > Downloaded toggle service > Toggle use service to
         * disable service.
         */
        int DISABLE_WARNING_FROM_TOGGLE = 1004;

        /**
         * OPEN: Settings > Accessibility > Magnification > Toggle user service in button
         * navigation.
         */
        int ACCESSIBILITY_BUTTON_TUTORIAL = 1003;

        /** OPEN: Settings > Accessibility > Downloaded toggle service > Toggle user service. */
        int ENABLE_WARNING_FROM_TOGGLE = 1004;
        int ACCESSIBILITY_BUTTON_TUTORIAL = 1005;

        /** OPEN: Settings > Accessibility > Downloaded toggle service > Shortcut checkbox. */
        int ENABLE_WARNING_FROM_SHORTCUT = 1005;
        /**
         * OPEN: Settings > Accessibility > Magnification > Toggle user service in gesture
         * navigation.
         */
        int GESTURE_NAVIGATION_TUTORIAL = 1006;

        /**
         * OPEN: Settings > Accessibility > Downloaded toggle service > Toggle user service > Show
         * launch tutorial.
         */
        int LAUNCH_ACCESSIBILITY_TUTORIAL = 1006;
        int LAUNCH_ACCESSIBILITY_TUTORIAL = 1007;
    }

    @Override