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
This commit is contained in:
@@ -46,6 +46,7 @@ import androidx.annotation.ColorInt;
|
|||||||
import androidx.annotation.DrawableRes;
|
import androidx.annotation.DrawableRes;
|
||||||
import androidx.annotation.IntDef;
|
import androidx.annotation.IntDef;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.RawRes;
|
import androidx.annotation.RawRes;
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
@@ -125,9 +126,15 @@ public final class AccessibilityGestureNavigationTutorial {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static AlertDialog createAccessibilityTutorialDialog(Context context, int shortcutTypes) {
|
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)
|
return new AlertDialog.Builder(context)
|
||||||
.setView(createShortcutNavigationContentView(context, shortcutTypes))
|
.setView(createShortcutNavigationContentView(context, shortcutTypes))
|
||||||
.setNegativeButton(R.string.accessibility_tutorial_dialog_button, mOnClickListener)
|
.setNegativeButton(R.string.accessibility_tutorial_dialog_button,
|
||||||
|
negativeButtonListener)
|
||||||
.create();
|
.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -20,9 +20,11 @@ import static com.android.settings.accessibility.AccessibilityStatsLogUtils.logA
|
|||||||
|
|
||||||
import android.accessibilityservice.AccessibilityShortcutInfo;
|
import android.accessibilityservice.AccessibilityShortcutInfo;
|
||||||
import android.app.ActivityOptions;
|
import android.app.ActivityOptions;
|
||||||
|
import android.app.Dialog;
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.ActivityInfo;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
@@ -124,6 +126,20 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature
|
|||||||
return null;
|
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
|
@Override
|
||||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
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
|
// 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;
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -168,9 +168,9 @@ public class ToggleAccessibilityServicePreferenceFragment extends
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Dialog onCreateDialog(int dialogId) {
|
public Dialog onCreateDialog(int dialogId) {
|
||||||
switch (dialogId) {
|
|
||||||
case DialogEnums.ENABLE_WARNING_FROM_TOGGLE: {
|
|
||||||
final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
|
final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
|
||||||
|
switch (dialogId) {
|
||||||
|
case DialogEnums.ENABLE_WARNING_FROM_TOGGLE:
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -178,10 +178,8 @@ public class ToggleAccessibilityServicePreferenceFragment extends
|
|||||||
.createCapabilitiesDialog(getPrefContext(), info,
|
.createCapabilitiesDialog(getPrefContext(), info,
|
||||||
this::onDialogButtonFromEnableToggleClicked,
|
this::onDialogButtonFromEnableToggleClicked,
|
||||||
this::onDialogButtonFromUninstallClicked);
|
this::onDialogButtonFromUninstallClicked);
|
||||||
break;
|
return mWarningDialog;
|
||||||
}
|
case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT_TOGGLE:
|
||||||
case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT_TOGGLE: {
|
|
||||||
final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
|
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -189,10 +187,8 @@ public class ToggleAccessibilityServicePreferenceFragment extends
|
|||||||
.createCapabilitiesDialog(getPrefContext(), info,
|
.createCapabilitiesDialog(getPrefContext(), info,
|
||||||
this::onDialogButtonFromShortcutToggleClicked,
|
this::onDialogButtonFromShortcutToggleClicked,
|
||||||
this::onDialogButtonFromUninstallClicked);
|
this::onDialogButtonFromUninstallClicked);
|
||||||
break;
|
return mWarningDialog;
|
||||||
}
|
case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT:
|
||||||
case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT: {
|
|
||||||
final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
|
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -200,23 +196,24 @@ public class ToggleAccessibilityServicePreferenceFragment extends
|
|||||||
.createCapabilitiesDialog(getPrefContext(), info,
|
.createCapabilitiesDialog(getPrefContext(), info,
|
||||||
this::onDialogButtonFromShortcutClicked,
|
this::onDialogButtonFromShortcutClicked,
|
||||||
this::onDialogButtonFromUninstallClicked);
|
this::onDialogButtonFromUninstallClicked);
|
||||||
break;
|
return mWarningDialog;
|
||||||
}
|
case DialogEnums.DISABLE_WARNING_FROM_TOGGLE:
|
||||||
case DialogEnums.DISABLE_WARNING_FROM_TOGGLE: {
|
|
||||||
final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
|
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
mWarningDialog = AccessibilityServiceWarning
|
mWarningDialog = AccessibilityServiceWarning
|
||||||
.createDisableDialog(getPrefContext(), info,
|
.createDisableDialog(getPrefContext(), info,
|
||||||
this::onDialogButtonFromDisableToggleClicked);
|
this::onDialogButtonFromDisableToggleClicked);
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
mWarningDialog = super.onCreateDialog(dialogId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mWarningDialog;
|
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
|
@Override
|
||||||
@@ -488,6 +485,17 @@ public class ToggleAccessibilityServicePreferenceFragment extends
|
|||||||
mWarningDialog.dismiss();
|
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) {
|
void onDialogButtonFromShortcutClicked(View view) {
|
||||||
final int viewId = view.getId();
|
final int viewId = view.getId();
|
||||||
if (viewId == R.id.permission_enable_allow_button) {
|
if (viewId == R.id.permission_enable_allow_button) {
|
||||||
|
@@ -22,26 +22,41 @@ import static com.android.settings.accessibility.AccessibilityUtil.UserShortcutT
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
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.RobolectricTestRunner;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
/** Tests for {@link AccessibilityGestureNavigationTutorial}. */
|
/** Tests for {@link AccessibilityGestureNavigationTutorial}. */
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
public final class AccessibilityGestureNavigationTutorialTest {
|
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;
|
private int mShortcutTypes;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext.setTheme(R.style.Theme_AppCompat);
|
||||||
mShortcutTypes = /* initial */ 0;
|
mShortcutTypes = /* initial */ 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,4 +101,28 @@ public final class AccessibilityGestureNavigationTutorialTest {
|
|||||||
mShortcutTypes)).hasSize(/* expectedSize= */ 2);
|
mShortcutTypes)).hasSize(/* expectedSize= */ 2);
|
||||||
assertThat(alertDialog).isNotNull();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user