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:
@@ -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>
|
|
37
res/layout/magnification_triple_tap_warning_dialog.xml
Normal file
37
res/layout/magnification_triple_tap_warning_dialog.xml
Normal 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>
|
@@ -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);
|
||||||
|
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user