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

Commit 9855997b authored by menghanli's avatar menghanli
Browse files

Show quick setting tooltips after shortcut tutorial dialog dismiss

- ToggleAccessibilityServicePreferenceFragment for unbundle
accessibility service
- LaunchAccessibilityActivityPreferenceFragment for unbundle
accessibility shortcut-activity

Bug: 210356011
Test: make RunSettingsRoboTests ROBOTEST_FILTER=AccessibilityGestureNavigationTutorialTest
Change-Id: I6f9e7e206ae7642d91e658ceb18b9e7ce4244a22
parent 553f84de
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RawRes;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
@@ -125,9 +126,15 @@ public final class AccessibilityGestureNavigationTutorial {
    }

    static AlertDialog createAccessibilityTutorialDialog(Context context, int shortcutTypes) {
        return createAccessibilityTutorialDialog(context, shortcutTypes, mOnClickListener);
    }

    static AlertDialog createAccessibilityTutorialDialog(Context context, int shortcutTypes,
            @Nullable DialogInterface.OnClickListener negativeButtonListener) {
        return new AlertDialog.Builder(context)
                .setView(createShortcutNavigationContentView(context, shortcutTypes))
                .setNegativeButton(R.string.accessibility_tutorial_dialog_button, mOnClickListener)
                .setNegativeButton(R.string.accessibility_tutorial_dialog_button,
                        negativeButtonListener)
                .create();
    }

+27 −0
Original line number Diff line number Diff line
@@ -20,9 +20,11 @@ import static com.android.settings.accessibility.AccessibilityStatsLogUtils.logA

import android.accessibilityservice.AccessibilityShortcutInfo;
import android.app.ActivityOptions;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.net.Uri;
@@ -124,6 +126,20 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature
        return null;
    }

    @Override
    public Dialog onCreateDialog(int dialogId) {
        switch (dialogId) {
            case AccessibilityDialogUtils.DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL:
                final Dialog dialog = AccessibilityGestureNavigationTutorial
                        .createAccessibilityTutorialDialog(getPrefContext(),
                                getUserShortcutTypes(), this::callOnTutorialDialogButtonClicked);
                dialog.setCanceledOnTouchOutside(false);
                return dialog;
            default:
                return super.onCreateDialog(dialogId);
        }
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Do not call super. We don't want to see the "Help & feedback" option on this page so as
@@ -208,4 +224,15 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature

        return settingsIntent;
    }

    /**
     * This method will be invoked when a button in the tutorial dialog is clicked.
     *
     * @param dialog The dialog that received the click
     * @param which  The button that was clicked
     */
    private void callOnTutorialDialogButtonClicked(DialogInterface dialog, int which) {
        dialog.dismiss();
        showQuickSettingsTooltipIfNeeded();
    }
}
+28 −20
Original line number Diff line number Diff line
@@ -168,9 +168,9 @@ public class ToggleAccessibilityServicePreferenceFragment extends

    @Override
    public Dialog onCreateDialog(int dialogId) {
        switch (dialogId) {
            case DialogEnums.ENABLE_WARNING_FROM_TOGGLE: {
        final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
        switch (dialogId) {
            case DialogEnums.ENABLE_WARNING_FROM_TOGGLE:
                if (info == null) {
                    return null;
                }
@@ -178,10 +178,8 @@ public class ToggleAccessibilityServicePreferenceFragment extends
                        .createCapabilitiesDialog(getPrefContext(), info,
                                this::onDialogButtonFromEnableToggleClicked,
                                this::onDialogButtonFromUninstallClicked);
                break;
            }
            case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT_TOGGLE: {
                final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
                return mWarningDialog;
            case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT_TOGGLE:
                if (info == null) {
                    return null;
                }
@@ -189,10 +187,8 @@ public class ToggleAccessibilityServicePreferenceFragment extends
                        .createCapabilitiesDialog(getPrefContext(), info,
                                this::onDialogButtonFromShortcutToggleClicked,
                                this::onDialogButtonFromUninstallClicked);
                break;
            }
            case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT: {
                final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
                return mWarningDialog;
            case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT:
                if (info == null) {
                    return null;
                }
@@ -200,23 +196,24 @@ public class ToggleAccessibilityServicePreferenceFragment extends
                        .createCapabilitiesDialog(getPrefContext(), info,
                                this::onDialogButtonFromShortcutClicked,
                                this::onDialogButtonFromUninstallClicked);
                break;
            }
            case DialogEnums.DISABLE_WARNING_FROM_TOGGLE: {
                final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
                return mWarningDialog;
            case DialogEnums.DISABLE_WARNING_FROM_TOGGLE:
                if (info == null) {
                    return null;
                }
                mWarningDialog = AccessibilityServiceWarning
                        .createDisableDialog(getPrefContext(), info,
                                this::onDialogButtonFromDisableToggleClicked);
                break;
            }
            default: {
                mWarningDialog = super.onCreateDialog(dialogId);
            }
        }
                return mWarningDialog;
            case DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL:
                final Dialog dialog = AccessibilityGestureNavigationTutorial
                        .createAccessibilityTutorialDialog(getPrefContext(),
                                getUserShortcutTypes(), this::callOnTutorialDialogButtonClicked);
                dialog.setCanceledOnTouchOutside(false);
                return dialog;
            default:
                return super.onCreateDialog(dialogId);
        }
    }

    @Override
@@ -488,6 +485,17 @@ public class ToggleAccessibilityServicePreferenceFragment extends
        mWarningDialog.dismiss();
    }

    /**
     * This method will be invoked when a button in the tutorial dialog is clicked.
     *
     * @param dialog The dialog that received the click
     * @param which  The button that was clicked
     */
    private void callOnTutorialDialogButtonClicked(DialogInterface dialog, int which) {
        dialog.dismiss();
        showQuickSettingsTooltipIfNeeded();
    }

    void onDialogButtonFromShortcutClicked(View view) {
        final int viewId = view.getId();
        if (viewId == R.id.permission_enable_allow_button) {
+42 −3
Original line number Diff line number Diff line
@@ -22,26 +22,41 @@ import static com.android.settings.accessibility.AccessibilityUtil.UserShortcutT

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.verify;

import android.content.Context;
import android.content.DialogInterface;

import androidx.appcompat.app.AlertDialog;
import androidx.test.core.app.ApplicationProvider;

import com.android.settings.R;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;

/** Tests for {@link AccessibilityGestureNavigationTutorial}. */
@RunWith(RobolectricTestRunner.class)
public final class AccessibilityGestureNavigationTutorialTest {

    private Context mContext;
    @Rule
    public final MockitoRule mMockitoRule = MockitoJUnit.rule();

    @Mock
    private DialogInterface.OnClickListener mMockOnClickListener;

    private final Context mContext = ApplicationProvider.getApplicationContext();
    private int mShortcutTypes;

    @Before
    public void setUp() {
        mContext = RuntimeEnvironment.application;
        mContext.setTheme(R.style.Theme_AppCompat);
        mShortcutTypes = /* initial */ 0;
    }

@@ -86,4 +101,28 @@ public final class AccessibilityGestureNavigationTutorialTest {
                mShortcutTypes)).hasSize(/* expectedSize= */ 2);
        assertThat(alertDialog).isNotNull();
    }

    @Test
    public void performClickOnNegativeButton_turnOnSoftwareShortcut_dismiss() {
        mShortcutTypes |= UserShortcutType.SOFTWARE;
        final AlertDialog alertDialog =
                createAccessibilityTutorialDialog(mContext, mShortcutTypes);
        alertDialog.show();

        alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();

        assertThat(alertDialog.isShowing()).isFalse();
    }

    @Test
    public void performClickOnNegativeButton_turnOnSoftwareShortcut_callOnClickListener() {
        mShortcutTypes |= UserShortcutType.SOFTWARE;
        final AlertDialog alertDialog =
                createAccessibilityTutorialDialog(mContext, mShortcutTypes, mMockOnClickListener);
        alertDialog.show();

        alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();

        verify(mMockOnClickListener).onClick(alertDialog, DialogInterface.BUTTON_NEGATIVE);
    }
}