diff --git a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java index 0ca16cb99b0..773c9878e9d 100644 --- a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java +++ b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java @@ -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(); } diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java index 00f280440a9..3a3011c54c4 100644 --- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java +++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java @@ -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(); + } } diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java index a1c98cdc0c4..ce9cf1599c9 100644 --- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java @@ -168,9 +168,9 @@ public class ToggleAccessibilityServicePreferenceFragment extends @Override public Dialog onCreateDialog(int dialogId) { + final AccessibilityServiceInfo info = getAccessibilityServiceInfo(); switch (dialogId) { - case DialogEnums.ENABLE_WARNING_FROM_TOGGLE: { - final AccessibilityServiceInfo info = getAccessibilityServiceInfo(); + 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); } - return mWarningDialog; } @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) { diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java index cf0ce96bf60..6efdcf7a7e2 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java @@ -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); + } }