Apply new flow to hint user about triple-tap will delay when user select triple-tap shortcut on window-mode.

Root Cause: Original content in magnification switch shortcut dialog needs to have different versions for different accessibility software shortcuts. Use the generic content and new flow to replace it.

Solution: Apply new flow from UX suggestion.

Bug: 210593079
Test: make RunSettingsRoboTests ROBOTEST_FILTER=MagnificationModePreferenceControllerTest
Test: make RunSettingsRoboTests ROBOTEST_FILTER=AccessibilityDialogUtilsTest
Change-Id: Id09b8847cca4fce1f3fb77770a03bff53ae05855
This commit is contained in:
jasonwshsu
2022-03-16 17:31:11 +08:00
parent ca73aa40ef
commit 3b96a2c57e
6 changed files with 179 additions and 231 deletions

View File

@@ -1,63 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!--
Copyright (C) 2020 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
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarStyle="outsideOverlay">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="24dp">
<ImageView
android:id="@+id/image"
android:layout_width="@dimen/accessibility_imageview_size"
android:layout_height="@dimen/accessibility_imageview_size"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="@dimen/accessibility_textview_layout_margin_bottom"
android:scaleType="fitCenter"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/accessibility_magnification_switch_shortcut_message"
android:textAppearance="?android:attr/textAppearanceListItemSecondary"
android:textColor="?android:attr/textColorSecondary"
android:layout_marginBottom="@dimen/accessibility_textview_layout_margin_bottom"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:id="@+id/custom_positive_button"
style="@style/AccessibilityDialogButton"
android:gravity="center|end"
android:text="@string/accessibility_magnification_switch_shortcut_positive_button"/>
<Button
android:id="@+id/custom_negative_button"
style="@style/AccessibilityDialogButton"
android:gravity="center|end"
android:text="@string/accessibility_magnification_switch_shortcut_negative_button"/>
</LinearLayout>
</LinearLayout>
</ScrollView>

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2022 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
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbarStyle="outsideOverlay">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="?android:attr/dialogPreferredPadding"
android:paddingStart="?android:attr/dialogPreferredPadding"
android:paddingEnd="?android:attr/dialogPreferredPadding">
<TextView
android:id="@+id/message"
android:text="@string/accessibility_magnification_triple_tap_warning_message"
style="@style/AccessibilityDialogDescription" />
</LinearLayout>
</ScrollView>

View File

@@ -36,7 +36,6 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.AbsListView; import android.widget.AbsListView;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@@ -131,7 +130,6 @@ public class AccessibilityDialogUtils {
DialogType.EDIT_SHORTCUT_GENERIC_SUW, DialogType.EDIT_SHORTCUT_GENERIC_SUW,
DialogType.EDIT_SHORTCUT_MAGNIFICATION, DialogType.EDIT_SHORTCUT_MAGNIFICATION,
DialogType.EDIT_SHORTCUT_MAGNIFICATION_SUW, DialogType.EDIT_SHORTCUT_MAGNIFICATION_SUW,
DialogType.EDIT_MAGNIFICATION_SWITCH_SHORTCUT,
}) })
public @interface DialogType { public @interface DialogType {
@@ -139,7 +137,6 @@ public class AccessibilityDialogUtils {
int EDIT_SHORTCUT_GENERIC_SUW = 1; int EDIT_SHORTCUT_GENERIC_SUW = 1;
int EDIT_SHORTCUT_MAGNIFICATION = 2; int EDIT_SHORTCUT_MAGNIFICATION = 2;
int EDIT_SHORTCUT_MAGNIFICATION_SUW = 3; int EDIT_SHORTCUT_MAGNIFICATION_SUW = 3;
int EDIT_MAGNIFICATION_SWITCH_SHORTCUT = 4;
} }
/** /**
@@ -159,27 +156,6 @@ public class AccessibilityDialogUtils {
return alertDialog; return alertDialog;
} }
/**
* Method to show the magnification edit shortcut dialog in Magnification.
*
* @param context A valid context
* @param positiveBtnListener The positive button listener
* @return A magnification edit shortcut dialog in Magnification
*/
public static Dialog createMagnificationSwitchShortcutDialog(Context context,
CustomButtonsClickListener positiveBtnListener) {
final View contentView = createSwitchShortcutDialogContentView(context);
final AlertDialog alertDialog = new AlertDialog.Builder(context)
.setView(contentView)
.setTitle(context.getString(
R.string.accessibility_magnification_switch_shortcut_title))
.create();
setCustomButtonsClickListener(alertDialog, contentView,
positiveBtnListener, /* negativeBtnListener= */ null);
setScrollIndicators(contentView);
return alertDialog;
}
/** /**
* Updates the software shortcut in edit shortcut dialog. * Updates the software shortcut in edit shortcut dialog.
* *
@@ -233,56 +209,6 @@ public class AccessibilityDialogUtils {
View.SCROLL_INDICATOR_TOP | View.SCROLL_INDICATOR_BOTTOM); View.SCROLL_INDICATOR_TOP | View.SCROLL_INDICATOR_BOTTOM);
} }
interface CustomButtonsClickListener {
void onClick(@CustomButton int which);
}
/**
* Annotation for customized dialog button type.
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef({
CustomButton.POSITIVE,
CustomButton.NEGATIVE,
})
public @interface CustomButton {
int POSITIVE = 1;
int NEGATIVE = 2;
}
private static void setCustomButtonsClickListener(Dialog dialog, View contentView,
CustomButtonsClickListener positiveBtnListener,
CustomButtonsClickListener negativeBtnListener) {
final Button positiveButton = contentView.findViewById(
R.id.custom_positive_button);
final Button negativeButton = contentView.findViewById(
R.id.custom_negative_button);
if (positiveButton != null) {
positiveButton.setOnClickListener(v -> {
if (positiveBtnListener != null) {
positiveBtnListener.onClick(CustomButton.POSITIVE);
}
dialog.dismiss();
});
}
if (negativeButton != null) {
negativeButton.setOnClickListener(v -> {
if (negativeBtnListener != null) {
negativeBtnListener.onClick(CustomButton.NEGATIVE);
}
dialog.dismiss();
});
}
}
private static View createSwitchShortcutDialogContentView(Context context) {
return createEditDialogContentView(context, DialogType.EDIT_MAGNIFICATION_SWITCH_SHORTCUT);
}
/** /**
* Get a content View for the edit shortcut dialog. * Get a content View for the edit shortcut dialog.
* *
@@ -325,12 +251,6 @@ public class AccessibilityDialogUtils {
initMagnifyShortcut(context, contentView); initMagnifyShortcut(context, contentView);
initAdvancedWidget(contentView); initAdvancedWidget(contentView);
break; break;
case DialogType.EDIT_MAGNIFICATION_SWITCH_SHORTCUT:
contentView = inflater.inflate(
R.layout.accessibility_edit_magnification_shortcut, null);
final ImageView image = contentView.findViewById(R.id.image);
image.setImageResource(retrieveSoftwareShortcutImageResId(context));
break;
default: default:
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
@@ -548,18 +468,24 @@ public class AccessibilityDialogUtils {
* @param context A valid context * @param context A valid context
* @param dialogTitle The title of the dialog * @param dialogTitle The title of the dialog
* @param customView The customized view * @param customView The customized view
* @param listener This listener will be invoked when the positive button in the dialog is * @param positiveButtonText The text of the positive button
* clicked * @param positiveListener This listener will be invoked when the positive button in the dialog
* is clicked
* @param negativeButtonText The text of the negative button
* @param negativeListener This listener will be invoked when the negative button in the dialog
* is clicked
* @return the {@link Dialog} with the given view * @return the {@link Dialog} with the given view
*/ */
public static Dialog createCustomDialog(Context context, CharSequence dialogTitle, public static Dialog createCustomDialog(Context context, CharSequence dialogTitle,
View customView, DialogInterface.OnClickListener listener) { View customView, CharSequence positiveButtonText,
DialogInterface.OnClickListener positiveListener, CharSequence negativeButtonText,
DialogInterface.OnClickListener negativeListener) {
final AlertDialog alertDialog = new AlertDialog.Builder(context) final AlertDialog alertDialog = new AlertDialog.Builder(context)
.setView(customView) .setView(customView)
.setTitle(dialogTitle) .setTitle(dialogTitle)
.setCancelable(true) .setCancelable(true)
.setPositiveButton(R.string.save, listener) .setPositiveButton(positiveButtonText, positiveListener)
.setNegativeButton(R.string.cancel, null) .setNegativeButton(negativeButtonText, negativeListener)
.create(); .create();
if (customView instanceof ScrollView || customView instanceof AbsListView) { if (customView instanceof ScrollView || customView instanceof AbsListView) {
setScrollIndicators(customView); setScrollIndicators(customView);

View File

@@ -16,8 +16,6 @@
package com.android.settings.accessibility; package com.android.settings.accessibility;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
import static com.android.settings.accessibility.AccessibilityDialogUtils.CustomButton;
import static com.android.settings.accessibility.AccessibilityUtil.State.OFF; import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
import static com.android.settings.accessibility.AccessibilityUtil.State.ON; import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
@@ -27,7 +25,6 @@ import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@@ -52,7 +49,6 @@ import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.StringJoiner;
/** Controller that shows the magnification area mode summary and the preference click behavior. */ /** Controller that shows the magnification area mode summary and the preference click behavior. */
public class MagnificationModePreferenceController extends BasePreferenceController implements public class MagnificationModePreferenceController extends BasePreferenceController implements
@@ -63,16 +59,16 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
@VisibleForTesting @VisibleForTesting
static final int DIALOG_MAGNIFICATION_MODE = DIALOG_ID_BASE + 1; static final int DIALOG_MAGNIFICATION_MODE = DIALOG_ID_BASE + 1;
@VisibleForTesting @VisibleForTesting
static final int DIALOG_MAGNIFICATION_SWITCH_SHORTCUT = DIALOG_ID_BASE + 2; static final int DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING = DIALOG_ID_BASE + 2;
@VisibleForTesting @VisibleForTesting
static final String EXTRA_MODE = "mode"; static final String EXTRA_MODE = "mode";
private static final String TAG = "MagnificationModePreferenceController"; private static final String TAG = "MagnificationModePreferenceController";
private static final char COMPONENT_NAME_SEPARATOR = ':';
private DialogHelper mDialogHelper; private DialogHelper mDialogHelper;
// The magnification mode in the dialog. // The magnification mode in the dialog.
private int mMode = MagnificationMode.NONE; @MagnificationMode
private int mModeCache = MagnificationMode.NONE;
private Preference mModePreference; private Preference mModePreference;
@VisibleForTesting @VisibleForTesting
@@ -113,7 +109,7 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
if (savedInstanceState != null) { if (savedInstanceState != null) {
mMode = savedInstanceState.getInt(EXTRA_MODE, MagnificationMode.NONE); mModeCache = savedInstanceState.getInt(EXTRA_MODE, MagnificationMode.NONE);
} }
} }
@@ -122,7 +118,7 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
super.displayPreference(screen); super.displayPreference(screen);
mModePreference = screen.findPreference(getPreferenceKey()); mModePreference = screen.findPreference(getPreferenceKey());
mModePreference.setOnPreferenceClickListener(preference -> { mModePreference.setOnPreferenceClickListener(preference -> {
mMode = MagnificationCapabilities.getCapabilities(mContext); mModeCache = MagnificationCapabilities.getCapabilities(mContext);
mDialogHelper.showDialog(DIALOG_MAGNIFICATION_MODE); mDialogHelper.showDialog(DIALOG_MAGNIFICATION_MODE);
return true; return true;
}); });
@@ -130,7 +126,7 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
@Override @Override
public void onSaveInstanceState(Bundle outState) { public void onSaveInstanceState(Bundle outState) {
outState.putInt(EXTRA_MODE, mMode); outState.putInt(EXTRA_MODE, mModeCache);
} }
/** /**
@@ -147,8 +143,8 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
case DIALOG_MAGNIFICATION_MODE: case DIALOG_MAGNIFICATION_MODE:
return createMagnificationModeDialog(); return createMagnificationModeDialog();
case DIALOG_MAGNIFICATION_SWITCH_SHORTCUT: case DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING:
return createMagnificationShortCutConfirmDialog(); return createMagnificationTripleTapWarningDialog();
} }
return null; return null;
} }
@@ -158,8 +154,8 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
switch (dialogId) { switch (dialogId) {
case DIALOG_MAGNIFICATION_MODE: case DIALOG_MAGNIFICATION_MODE:
return SettingsEnums.DIALOG_MAGNIFICATION_CAPABILITY; return SettingsEnums.DIALOG_MAGNIFICATION_CAPABILITY;
case DIALOG_MAGNIFICATION_SWITCH_SHORTCUT: case DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING:
return SettingsEnums.DIALOG_MAGNIFICATION_SWITCH_SHORTCUT; return SettingsEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING;
default: default:
return 0; return 0;
} }
@@ -178,29 +174,40 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
mMagnificationModesListView.setItemChecked(computeSelectionIndex(), true); mMagnificationModesListView.setItemChecked(computeSelectionIndex(), true);
final CharSequence title = mContext.getString( final CharSequence title = mContext.getString(
R.string.accessibility_magnification_mode_dialog_title); R.string.accessibility_magnification_mode_dialog_title);
final CharSequence positiveBtnText = mContext.getString(R.string.save);
final CharSequence negativeBtnText = mContext.getString(R.string.cancel);
return AccessibilityDialogUtils.createCustomDialog(mContext, title, return AccessibilityDialogUtils.createCustomDialog(mContext, title,
mMagnificationModesListView, this::onMagnificationModeDialogPositiveButtonClicked); mMagnificationModesListView,
positiveBtnText, this::onMagnificationModeDialogPositiveButtonClicked,
negativeBtnText, /* negativeListener= */ null);
} }
private void onMagnificationModeDialogPositiveButtonClicked(DialogInterface dialogInterface, @VisibleForTesting
void onMagnificationModeDialogPositiveButtonClicked(DialogInterface dialogInterface,
int which) { int which) {
final int selectedIndex = mMagnificationModesListView.getCheckedItemPosition(); final int selectedIndex = mMagnificationModesListView.getCheckedItemPosition();
if (selectedIndex != AdapterView.INVALID_POSITION) { if (selectedIndex == AdapterView.INVALID_POSITION) {
final MagnificationModeInfo modeInfo =
(MagnificationModeInfo) mMagnificationModesListView.getItemAtPosition(
selectedIndex);
setMode(modeInfo.mMagnificationMode);
} else {
Log.w(TAG, "invalid index"); Log.w(TAG, "invalid index");
return;
}
mModeCache = ((MagnificationModeInfo) mMagnificationModesListView.getItemAtPosition(
selectedIndex)).mMagnificationMode;
// Do not save mode until user clicks positive button in triple tap warning dialog.
if (isTripleTapEnabled(mContext) && mModeCache != MagnificationMode.FULLSCREEN) {
mDialogHelper.showDialog(DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
} else { // Save mode (capabilities) value, don't need to show dialog to confirm.
updateCapabilitiesAndSummary(mModeCache);
} }
} }
private void setMode(int mode) { private void updateCapabilitiesAndSummary(@MagnificationMode int mode) {
mMode = mode; mModeCache = mode;
MagnificationCapabilities.setCapabilities(mContext, mMode); MagnificationCapabilities.setCapabilities(mContext, mModeCache);
mModePreference.setSummary( mModePreference.setSummary(
MagnificationCapabilities.getSummary(mContext, mMode)); MagnificationCapabilities.getSummary(mContext, mModeCache));
} }
private void onMagnificationModeSelected(AdapterView<?> parent, View view, int position, private void onMagnificationModeSelected(AdapterView<?> parent, View view, int position,
@@ -208,19 +215,16 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
final MagnificationModeInfo modeInfo = final MagnificationModeInfo modeInfo =
(MagnificationModeInfo) mMagnificationModesListView.getItemAtPosition( (MagnificationModeInfo) mMagnificationModesListView.getItemAtPosition(
position); position);
if (modeInfo.mMagnificationMode == mMode) { if (modeInfo.mMagnificationMode == mModeCache) {
return; return;
} }
mMode = modeInfo.mMagnificationMode; mModeCache = modeInfo.mMagnificationMode;
if (isTripleTapEnabled(mContext) && mMode != MagnificationMode.FULLSCREEN) {
mDialogHelper.showDialog(DIALOG_MAGNIFICATION_SWITCH_SHORTCUT);
}
} }
private int computeSelectionIndex() { private int computeSelectionIndex() {
final int modesSize = mModeInfos.size(); final int modesSize = mModeInfos.size();
for (int i = 0; i < modesSize; i++) { for (int i = 0; i < modesSize; i++) {
if (mModeInfos.get(i).mMagnificationMode == mMode) { if (mModeInfos.get(i).mMagnificationMode == mModeCache) {
return i + mMagnificationModesListView.getHeaderViewsCount(); return i + mMagnificationModesListView.getHeaderViewsCount();
} }
} }
@@ -234,41 +238,32 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, OFF) == ON; Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, OFF) == ON;
} }
private Dialog createMagnificationShortCutConfirmDialog() { private Dialog createMagnificationTripleTapWarningDialog() {
return AccessibilityDialogUtils.createMagnificationSwitchShortcutDialog(mContext, final View contentView = LayoutInflater.from(mContext).inflate(
this::onSwitchShortcutDialogButtonClicked); R.layout.magnification_triple_tap_warning_dialog, /* root= */ null);
final CharSequence title = mContext.getString(
R.string.accessibility_magnification_triple_tap_warning_title);
final CharSequence positiveBtnText = mContext.getString(
R.string.accessibility_magnification_triple_tap_warning_positive_button);
final CharSequence negativeBtnText = mContext.getString(
R.string.accessibility_magnification_triple_tap_warning_negative_button);
return AccessibilityDialogUtils.createCustomDialog(mContext, title, contentView,
positiveBtnText, this::onMagnificationTripleTapWarningDialogPositiveButtonClicked,
negativeBtnText, this::onMagnificationTripleTapWarningDialogNegativeButtonClicked);
} }
@VisibleForTesting @VisibleForTesting
void onSwitchShortcutDialogButtonClicked(@CustomButton int which) { void onMagnificationTripleTapWarningDialogNegativeButtonClicked(
optOutMagnificationFromTripleTap(); DialogInterface dialogInterface, int which) {
//TODO(b/147990389): Merge this function into AccessibilityUtils after the format of mModeCache = MagnificationCapabilities.getCapabilities(mContext);
// magnification target is changed to ComponentName. mDialogHelper.showDialog(DIALOG_MAGNIFICATION_MODE);
optInMagnificationToAccessibilityButton();
} }
private void optOutMagnificationFromTripleTap() { @VisibleForTesting
Settings.Secure.putInt(mContext.getContentResolver(), void onMagnificationTripleTapWarningDialogPositiveButtonClicked(
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, OFF); DialogInterface dialogInterface, int which) {
} updateCapabilitiesAndSummary(mModeCache);
private void optInMagnificationToAccessibilityButton() {
final String targetKey = Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS;
final String targetString = Settings.Secure.getString(mContext.getContentResolver(),
targetKey);
if (targetString != null && targetString.contains(MAGNIFICATION_CONTROLLER_NAME)) {
return;
}
final StringJoiner joiner = new StringJoiner(String.valueOf(COMPONENT_NAME_SEPARATOR));
if (!TextUtils.isEmpty(targetString)) {
joiner.add(targetString);
}
joiner.add(MAGNIFICATION_CONTROLLER_NAME);
Settings.Secure.putString(mContext.getContentResolver(), targetKey,
joiner.toString());
} }
// TODO(b/186731461): Remove it when this controller is used in DashBoardFragment only. // TODO(b/186731461): Remove it when this controller is used in DashBoardFragment only.
@@ -277,7 +272,6 @@ public class MagnificationModePreferenceController extends BasePreferenceControl
updateState(mModePreference); updateState(mModePreference);
} }
/** /**
* An interface to help the delegate to show the dialog. It will be injected to the delegate. * An interface to help the delegate to show the dialog. It will be injected to the delegate.
*/ */

View File

@@ -18,6 +18,7 @@ package com.android.settings.accessibility;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import android.app.Dialog;
import android.content.Context; import android.content.Context;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
@@ -58,4 +59,14 @@ public class AccessibilityDialogUtilsTest {
assertThat(AccessibilityDialogUtils.updateSoftwareShortcutInDialog(mContext, assertThat(AccessibilityDialogUtils.updateSoftwareShortcutInDialog(mContext,
dialog)).isFalse(); dialog)).isFalse();
} }
@Test
public void showDialog_createCustomDialog_isShowing() {
final Dialog dialog = AccessibilityDialogUtils.createCustomDialog(mContext,
"Title", /* customView= */ null, "positiveButton", /* positiveListener= */ null,
"negativeButton", /* negativeListener= */ null);
dialog.show();
assertThat(dialog.isShowing()).isTrue();
}
} }

View File

@@ -16,7 +16,6 @@
package com.android.settings.accessibility; package com.android.settings.accessibility;
import static com.android.settings.accessibility.AccessibilityDialogUtils.CustomButton;
import static com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode; import static com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode;
import static com.android.settings.accessibility.MagnificationModePreferenceController.MagnificationModeInfo; import static com.android.settings.accessibility.MagnificationModePreferenceController.MagnificationModeInfo;
import static com.android.settings.accessibility.MagnificationPreferenceFragment.ON; import static com.android.settings.accessibility.MagnificationPreferenceFragment.ON;
@@ -28,14 +27,17 @@ import static org.mockito.Mockito.verify;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.text.TextUtils;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.ListView; import android.widget.ListView;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.DialogCreatable; import com.android.settings.DialogCreatable;
import com.android.settings.R; import com.android.settings.R;
@@ -48,7 +50,6 @@ import org.mockito.Spy;
import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
/** Tests for {@link MagnificationModePreferenceController}. */ /** Tests for {@link MagnificationModePreferenceController}. */
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@@ -68,7 +69,8 @@ public class MagnificationModePreferenceControllerTest {
@Before @Before
public void setUp() { public void setUp() {
mContext = RuntimeEnvironment.application; mContext = ApplicationProvider.getApplicationContext();
mContext.setTheme(R.style.Theme_AppCompat);
final PreferenceManager preferenceManager = new PreferenceManager(mContext); final PreferenceManager preferenceManager = new PreferenceManager(mContext);
mScreen = preferenceManager.createPreferenceScreen(mContext); mScreen = preferenceManager.createPreferenceScreen(mContext);
mModePreference = new Preference(mContext); mModePreference = new Preference(mContext);
@@ -83,8 +85,8 @@ public class MagnificationModePreferenceControllerTest {
public void clickPreference_settingsModeIsDefault_checkedModeInDialogIsDefault() { public void clickPreference_settingsModeIsDefault_checkedModeInDialogIsDefault() {
mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference); mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference);
assertThat(getCheckedModeFromDialog()).isEqualTo( assertThat(getCheckedModeFromDialog()).isEqualTo(MAGNIFICATION_MODE_DEFAULT);
MAGNIFICATION_MODE_DEFAULT);
} }
@Test @Test
@@ -109,52 +111,88 @@ public class MagnificationModePreferenceControllerTest {
} }
@Test @Test
public void chooseWindowMode_tripleTapEnabled_showSwitchShortcutDialog() { public void chooseFullscreenMode_tripleTapEnabled_notShowTripleTapWarningDialog() {
enableTripleTap();
mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference);
performItemClickWith(MagnificationMode.FULLSCREEN);
mController.onMagnificationModeDialogPositiveButtonClicked(mDialogHelper.getDialog(),
DialogInterface.BUTTON_POSITIVE);
verify(mDialogHelper, never()).showDialog(
MagnificationModePreferenceController.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
}
@Test
public void chooseWindowMode_tripleTapEnabled_showTripleTapWarningDialog() {
enableTripleTap(); enableTripleTap();
mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference); mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference);
performItemClickWith(MagnificationMode.WINDOW); performItemClickWith(MagnificationMode.WINDOW);
mController.onMagnificationModeDialogPositiveButtonClicked(mDialogHelper.getDialog(),
DialogInterface.BUTTON_POSITIVE);
verify(mDialogHelper).showDialog( verify(mDialogHelper).showDialog(
MagnificationModePreferenceController.DIALOG_MAGNIFICATION_SWITCH_SHORTCUT); MagnificationModePreferenceController.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
} }
@Test @Test
public void chooseModeAll_modeAllInSettingsAndTripleTapEnabled_notShowShortcutDialog() { public void chooseAllMode_tripleTapEnabled_showTripleTapWarningDialog() {
enableTripleTap(); enableTripleTap();
mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference); mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference);
performItemClickWith(MagnificationMode.ALL); performItemClickWith(MagnificationMode.ALL);
mController.onMagnificationModeDialogPositiveButtonClicked(mDialogHelper.getDialog(),
DialogInterface.BUTTON_POSITIVE);
verify(mDialogHelper, never()).showDialog( verify(mDialogHelper).showDialog(
MagnificationModePreferenceController.DIALOG_MAGNIFICATION_SWITCH_SHORTCUT); MagnificationModePreferenceController.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
} }
@Test @Test
public void onSwitchShortcutDialogPositiveButtonClicked_TripleTapEnabled_TripleTapDisabled() { public void onTripleTapWarningDialogNegativeButtonClicked_showModeDialog() {
mDialogHelper.showDialog(
MagnificationModePreferenceController.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING);
mController.onMagnificationTripleTapWarningDialogNegativeButtonClicked(
mDialogHelper.getDialog(), DialogInterface.BUTTON_NEGATIVE);
verify(mDialogHelper).showDialog(
MagnificationModePreferenceController.DIALOG_MAGNIFICATION_MODE);
}
@Test
public void onTripleTapWarningDialogPositiveButtonClicked_chooseAllMode_returnAllSummary() {
enableTripleTap(); enableTripleTap();
mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference);
performItemClickWith(MagnificationMode.ALL);
mController.onMagnificationModeDialogPositiveButtonClicked(mDialogHelper.getDialog(),
DialogInterface.BUTTON_POSITIVE);
mController.onSwitchShortcutDialogButtonClicked(CustomButton.POSITIVE); mController.onMagnificationTripleTapWarningDialogPositiveButtonClicked(
mDialogHelper.getDialog(), DialogInterface.BUTTON_POSITIVE);
assertThat(MagnificationModePreferenceController.isTripleTapEnabled(mContext)).isFalse(); final String allSummary = mContext.getString(
R.string.accessibility_magnification_area_settings_all_summary);
assertThat(TextUtils.equals(mController.getSummary(), allSummary)).isTrue();
} }
@Test @Test
public void getSummary_saveWindowScreen_shouldReturnWindowScreenSummary() { public void getSummary_saveWindowScreen_shouldReturnWindowScreenSummary() {
MagnificationCapabilities.setCapabilities(mContext, MagnificationMode.WINDOW); MagnificationCapabilities.setCapabilities(mContext, MagnificationMode.WINDOW);
assertThat(mController.getSummary()) final String windowSummary = mContext.getString(
.isEqualTo(mContext.getString( R.string.accessibility_magnification_area_settings_window_screen_summary);
R.string.accessibility_magnification_area_settings_window_screen_summary)); assertThat(TextUtils.equals(mController.getSummary(), windowSummary)).isTrue();
} }
@Test @Test
public void getSummary_saveAll_shouldReturnAllSummary() { public void getSummary_saveAll_shouldReturnAllSummary() {
MagnificationCapabilities.setCapabilities(mContext, MagnificationMode.ALL); MagnificationCapabilities.setCapabilities(mContext, MagnificationMode.ALL);
assertThat(mController.getSummary()) final String allSummary = mContext.getString(
.isEqualTo(mContext.getString( R.string.accessibility_magnification_area_settings_all_summary);
R.string.accessibility_magnification_area_settings_all_summary)); assertThat(TextUtils.equals(mController.getSummary(), allSummary)).isTrue();
} }
private int getCheckedModeFromDialog() { private int getCheckedModeFromDialog() {
@@ -208,10 +246,11 @@ public class MagnificationModePreferenceControllerTest {
private static class TestDialogHelper implements DialogCreatable, private static class TestDialogHelper implements DialogCreatable,
MagnificationModePreferenceController.DialogHelper { MagnificationModePreferenceController.DialogHelper {
private DialogCreatable mDialogDelegate; private DialogCreatable mDialogDelegate;
private Dialog mDialog;
@Override @Override
public void showDialog(int dialogId) { public void showDialog(int dialogId) {
onCreateDialog(dialogId); mDialog = onCreateDialog(dialogId);
} }
@Override @Override
@@ -228,5 +267,9 @@ public class MagnificationModePreferenceControllerTest {
public int getDialogMetricsCategory(int dialogId) { public int getDialogMetricsCategory(int dialogId) {
return mDialogDelegate.getDialogMetricsCategory(dialogId); return mDialogDelegate.getDialogMetricsCategory(dialogId);
} }
public Dialog getDialog() {
return mDialog;
}
} }
} }