ShortcutPreference Toggle design (2/n)
- Removes edit shortcut disable condition. - Shows "off" if user removes all items in edit dialog. - Restores last time what user chosen options when show edit dialog. Bug: 148989269 Test: Manually test Change-Id: I105abda782999d38c92e3de9811e2fd378869e73
This commit is contained in:
@@ -44,19 +44,21 @@
|
||||
android:id="@+id/advanced_shortcut"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="?android:attr/listPreferredItemHeightSmall"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:scaleType="fitCenter"
|
||||
android:layout_gravity="center"
|
||||
android:contentDescription="@null"
|
||||
android:scaleType="centerCrop"
|
||||
android:src="@drawable/ic_keyboard_arrow_down" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center_vertical"
|
||||
android:minHeight="?android:attr/listPreferredItemHeightSmall"
|
||||
android:paddingStart="12dp"
|
||||
android:text="@string/accessibility_shortcut_edit_dialog_title_advance"
|
||||
android:textAppearance="?android:attr/textAppearanceListItem"
|
||||
|
@@ -73,7 +73,7 @@ final class AccessibilityUtil {
|
||||
/**
|
||||
* Annotation for different user shortcut type UI type.
|
||||
*
|
||||
* {@code DEFAULT} for displaying default value.
|
||||
* {@code EMPTY} for displaying default value.
|
||||
* {@code SOFTWARE} for displaying specifying the accessibility services or features which
|
||||
* choose accessibility button in the navigation bar as preferred shortcut.
|
||||
* {@code HARDWARE} for displaying specifying the accessibility services or features which
|
||||
@@ -83,7 +83,7 @@ final class AccessibilityUtil {
|
||||
*/
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({
|
||||
UserShortcutType.DEFAULT,
|
||||
UserShortcutType.EMPTY,
|
||||
UserShortcutType.SOFTWARE,
|
||||
UserShortcutType.HARDWARE,
|
||||
UserShortcutType.TRIPLETAP,
|
||||
@@ -91,7 +91,7 @@ final class AccessibilityUtil {
|
||||
|
||||
/** Denotes the user shortcut type. */
|
||||
public @interface UserShortcutType {
|
||||
int DEFAULT = 0;
|
||||
int EMPTY = 0;
|
||||
int SOFTWARE = 1; // 1 << 0
|
||||
int HARDWARE = 2; // 1 << 1
|
||||
int TRIPLETAP = 4; // 1 << 2
|
||||
@@ -323,7 +323,7 @@ final class AccessibilityUtil {
|
||||
*/
|
||||
static int getUserShortcutTypesFromSettings(Context context,
|
||||
@NonNull ComponentName componentName) {
|
||||
int shortcutTypes = UserShortcutType.DEFAULT;
|
||||
int shortcutTypes = UserShortcutType.EMPTY;
|
||||
if (hasValuesInSettings(context, UserShortcutType.SOFTWARE, componentName)) {
|
||||
shortcutTypes |= UserShortcutType.SOFTWARE;
|
||||
}
|
||||
|
@@ -417,6 +417,8 @@ public class ToggleAccessibilityServicePreferenceFragment extends
|
||||
AccessibilityUtil.optInAllValuesToSettings(getPrefContext(), shortcutTypes, mComponentName);
|
||||
|
||||
mDialog.dismiss();
|
||||
|
||||
mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext()));
|
||||
}
|
||||
|
||||
private void onDenyButtonFromShortcutToggleClicked() {
|
||||
|
@@ -90,9 +90,9 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
|
||||
private static final String KEY_SHORTCUT_PREFERENCE = "shortcut_preference";
|
||||
private static final String EXTRA_SHORTCUT_TYPE = "shortcut_type";
|
||||
private TouchExplorationStateChangeListener mTouchExplorationStateChangeListener;
|
||||
private int mUserShortcutType = UserShortcutType.DEFAULT;
|
||||
private int mUserShortcutType = UserShortcutType.EMPTY;
|
||||
// Used to restore the edit dialog status.
|
||||
private int mUserShortcutTypeCache = UserShortcutType.DEFAULT;
|
||||
private int mUserShortcutTypeCache = UserShortcutType.EMPTY;
|
||||
private CheckBox mSoftwareTypeCheckBox;
|
||||
private CheckBox mHardwareTypeCheckBox;
|
||||
|
||||
@@ -413,18 +413,18 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
|
||||
new TextUtils.SimpleStringSplitter(COMPONENT_NAME_SEPARATOR);
|
||||
|
||||
private String mComponentName;
|
||||
private int mUserShortcutType;
|
||||
private int mType;
|
||||
|
||||
AccessibilityUserShortcutType(String componentName, int userShortcutType) {
|
||||
AccessibilityUserShortcutType(String componentName, int type) {
|
||||
this.mComponentName = componentName;
|
||||
this.mUserShortcutType = userShortcutType;
|
||||
this.mType = type;
|
||||
}
|
||||
|
||||
AccessibilityUserShortcutType(String flattenedString) {
|
||||
sStringColonSplitter.setString(flattenedString);
|
||||
if (sStringColonSplitter.hasNext()) {
|
||||
this.mComponentName = sStringColonSplitter.next();
|
||||
this.mUserShortcutType = Integer.parseInt(sStringColonSplitter.next());
|
||||
this.mType = Integer.parseInt(sStringColonSplitter.next());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -436,18 +436,18 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
|
||||
this.mComponentName = componentName;
|
||||
}
|
||||
|
||||
int getUserShortcutType() {
|
||||
return mUserShortcutType;
|
||||
int getType() {
|
||||
return mType;
|
||||
}
|
||||
|
||||
void setUserShortcutType(int userShortcutType) {
|
||||
this.mUserShortcutType = userShortcutType;
|
||||
void setType(int type) {
|
||||
this.mType = type;
|
||||
}
|
||||
|
||||
String flattenToString() {
|
||||
final StringJoiner joiner = new StringJoiner(String.valueOf(COMPONENT_NAME_SEPARATOR));
|
||||
joiner.add(mComponentName);
|
||||
joiner.add(String.valueOf(mUserShortcutType));
|
||||
joiner.add(String.valueOf(mType));
|
||||
return joiner.toString();
|
||||
}
|
||||
}
|
||||
@@ -459,7 +459,6 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
|
||||
final View dialogHardwareView = dialog.findViewById(R.id.hardware_shortcut);
|
||||
mHardwareTypeCheckBox = dialogHardwareView.findViewById(R.id.checkbox);
|
||||
updateAlertDialogCheckState();
|
||||
updateAlertDialogEnableState();
|
||||
}
|
||||
|
||||
private void updateAlertDialogCheckState() {
|
||||
@@ -467,36 +466,28 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
|
||||
updateCheckStatus(mHardwareTypeCheckBox, UserShortcutType.HARDWARE);
|
||||
}
|
||||
|
||||
private void updateAlertDialogEnableState() {
|
||||
if (!mSoftwareTypeCheckBox.isChecked()) {
|
||||
mHardwareTypeCheckBox.setEnabled(false);
|
||||
} else if (!mHardwareTypeCheckBox.isChecked()) {
|
||||
mSoftwareTypeCheckBox.setEnabled(false);
|
||||
} else {
|
||||
mSoftwareTypeCheckBox.setEnabled(true);
|
||||
mHardwareTypeCheckBox.setEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateCheckStatus(CheckBox checkBox, @UserShortcutType int type) {
|
||||
checkBox.setChecked((mUserShortcutTypeCache & type) == type);
|
||||
checkBox.setOnClickListener(v -> {
|
||||
updateUserShortcutType(/* saveChanges= */ false);
|
||||
updateAlertDialogEnableState();
|
||||
});
|
||||
}
|
||||
|
||||
private void updateUserShortcutType(boolean saveChanges) {
|
||||
mUserShortcutTypeCache = UserShortcutType.DEFAULT;
|
||||
mUserShortcutTypeCache = UserShortcutType.EMPTY;
|
||||
if (mSoftwareTypeCheckBox.isChecked()) {
|
||||
mUserShortcutTypeCache |= UserShortcutType.SOFTWARE;
|
||||
}
|
||||
if (mHardwareTypeCheckBox.isChecked()) {
|
||||
mUserShortcutTypeCache |= UserShortcutType.HARDWARE;
|
||||
}
|
||||
|
||||
if (saveChanges) {
|
||||
final boolean isChanged = (mUserShortcutTypeCache != UserShortcutType.EMPTY);
|
||||
if (isChanged) {
|
||||
setUserShortcutType(getPrefContext(), mUserShortcutTypeCache);
|
||||
}
|
||||
mUserShortcutType = mUserShortcutTypeCache;
|
||||
setUserShortcutType(getPrefContext(), mUserShortcutType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -573,7 +564,7 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
|
||||
|
||||
final String str = (String) filtered.toArray()[0];
|
||||
final AccessibilityUserShortcutType shortcut = new AccessibilityUserShortcutType(str);
|
||||
return shortcut.getUserShortcutType();
|
||||
return shortcut.getType();
|
||||
}
|
||||
|
||||
private void callOnAlertDialogCheckboxClicked(DialogInterface dialog, int which) {
|
||||
@@ -582,13 +573,11 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
|
||||
}
|
||||
|
||||
updateUserShortcutType(/* saveChanges= */ true);
|
||||
if (mShortcutPreference.isChecked()) {
|
||||
AccessibilityUtil.optInAllValuesToSettings(getPrefContext(), mUserShortcutType,
|
||||
mComponentName);
|
||||
AccessibilityUtil.optOutAllValuesFromSettings(getPrefContext(), ~mUserShortcutType,
|
||||
mComponentName);
|
||||
}
|
||||
mShortcutPreference.setChecked(true);
|
||||
mShortcutPreference.setChecked(mUserShortcutType != UserShortcutType.EMPTY);
|
||||
mShortcutPreference.setSummary(
|
||||
getShortcutTypeSummary(getPrefContext()));
|
||||
}
|
||||
@@ -601,7 +590,7 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
|
||||
// Get the user shortcut type from settings provider.
|
||||
mUserShortcutType = AccessibilityUtil.getUserShortcutTypesFromSettings(getPrefContext(),
|
||||
mComponentName);
|
||||
if (mUserShortcutType != UserShortcutType.DEFAULT) {
|
||||
if (mUserShortcutType != UserShortcutType.EMPTY) {
|
||||
setUserShortcutType(getPrefContext(), mUserShortcutType);
|
||||
} else {
|
||||
// Get the user shortcut type from shared_prefs if cannot get from settings provider.
|
||||
@@ -613,7 +602,7 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference
|
||||
// Restore the user shortcut type.
|
||||
if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_SHORTCUT_TYPE)) {
|
||||
mUserShortcutTypeCache = savedInstanceState.getInt(EXTRA_SHORTCUT_TYPE,
|
||||
UserShortcutType.DEFAULT);
|
||||
UserShortcutType.EMPTY);
|
||||
}
|
||||
|
||||
// Initial the shortcut preference.
|
||||
|
@@ -70,9 +70,9 @@ public class ToggleScreenMagnificationPreferenceFragment extends
|
||||
private static final String EXTRA_SHORTCUT_TYPE = "shortcut_type";
|
||||
private static final String KEY_SHORTCUT_PREFERENCE = "shortcut_preference";
|
||||
private TouchExplorationStateChangeListener mTouchExplorationStateChangeListener;
|
||||
private int mUserShortcutType = UserShortcutType.DEFAULT;
|
||||
private int mUserShortcutType = UserShortcutType.EMPTY;
|
||||
// Used to restore the edit dialog status.
|
||||
private int mUserShortcutTypeCache = UserShortcutType.DEFAULT;
|
||||
private int mUserShortcutTypeCache = UserShortcutType.EMPTY;
|
||||
private CheckBox mSoftwareTypeCheckBox;
|
||||
private CheckBox mHardwareTypeCheckBox;
|
||||
private CheckBox mTripleTapTypeCheckBox;
|
||||
@@ -255,7 +255,6 @@ public class ToggleScreenMagnificationPreferenceFragment extends
|
||||
mTripleTapTypeCheckBox = dialogTripleTapView.findViewById(R.id.checkbox);
|
||||
final View advancedView = dialog.findViewById(R.id.advanced_shortcut);
|
||||
updateAlertDialogCheckState();
|
||||
updateAlertDialogEnableState();
|
||||
|
||||
// Window magnification mode doesn't support advancedView.
|
||||
if (isWindowMagnification(getPrefContext())) {
|
||||
@@ -275,30 +274,15 @@ public class ToggleScreenMagnificationPreferenceFragment extends
|
||||
updateCheckStatus(mTripleTapTypeCheckBox, UserShortcutType.TRIPLETAP);
|
||||
}
|
||||
|
||||
private void updateAlertDialogEnableState() {
|
||||
if (!mSoftwareTypeCheckBox.isChecked() && !mTripleTapTypeCheckBox.isChecked()) {
|
||||
mHardwareTypeCheckBox.setEnabled(false);
|
||||
} else if (!mHardwareTypeCheckBox.isChecked() && !mTripleTapTypeCheckBox.isChecked()) {
|
||||
mSoftwareTypeCheckBox.setEnabled(false);
|
||||
} else if (!mSoftwareTypeCheckBox.isChecked() && !mHardwareTypeCheckBox.isChecked()) {
|
||||
mTripleTapTypeCheckBox.setEnabled(false);
|
||||
} else {
|
||||
mSoftwareTypeCheckBox.setEnabled(true);
|
||||
mHardwareTypeCheckBox.setEnabled(true);
|
||||
mTripleTapTypeCheckBox.setEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateCheckStatus(CheckBox checkBox, @UserShortcutType int type) {
|
||||
checkBox.setChecked((mUserShortcutTypeCache & type) == type);
|
||||
checkBox.setOnClickListener(v -> {
|
||||
updateUserShortcutType(/* saveChanges= */ false);
|
||||
updateAlertDialogEnableState();
|
||||
});
|
||||
}
|
||||
|
||||
private void updateUserShortcutType(boolean saveChanges) {
|
||||
mUserShortcutTypeCache = UserShortcutType.DEFAULT;
|
||||
mUserShortcutTypeCache = UserShortcutType.EMPTY;
|
||||
if (mSoftwareTypeCheckBox.isChecked()) {
|
||||
mUserShortcutTypeCache |= UserShortcutType.SOFTWARE;
|
||||
}
|
||||
@@ -308,9 +292,13 @@ public class ToggleScreenMagnificationPreferenceFragment extends
|
||||
if (mTripleTapTypeCheckBox.isChecked()) {
|
||||
mUserShortcutTypeCache |= UserShortcutType.TRIPLETAP;
|
||||
}
|
||||
|
||||
if (saveChanges) {
|
||||
final boolean isChanged = (mUserShortcutTypeCache != UserShortcutType.EMPTY);
|
||||
if (isChanged) {
|
||||
setUserShortcutType(getPrefContext(), mUserShortcutTypeCache);
|
||||
}
|
||||
mUserShortcutType = mUserShortcutTypeCache;
|
||||
setUserShortcutType(getPrefContext(), mUserShortcutType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -336,7 +324,7 @@ public class ToggleScreenMagnificationPreferenceFragment extends
|
||||
return context.getText(R.string.switch_off_text);
|
||||
}
|
||||
|
||||
final int shortcutType = getUserShortcutType(context, UserShortcutType.DEFAULT);
|
||||
final int shortcutType = getUserShortcutType(context, UserShortcutType.EMPTY);
|
||||
int resId = R.string.accessibility_shortcut_edit_summary_software;
|
||||
if (AccessibilityUtil.isGestureNavigateEnabled(context)) {
|
||||
resId = AccessibilityUtil.isTouchExploreEnabled(context)
|
||||
@@ -381,16 +369,14 @@ public class ToggleScreenMagnificationPreferenceFragment extends
|
||||
|
||||
final String str = (String) filtered.toArray()[0];
|
||||
final AccessibilityUserShortcutType shortcut = new AccessibilityUserShortcutType(str);
|
||||
return shortcut.getUserShortcutType();
|
||||
return shortcut.getType();
|
||||
}
|
||||
|
||||
private void callOnAlertDialogCheckboxClicked(DialogInterface dialog, int which) {
|
||||
updateUserShortcutType(/* saveChanges= */ true);
|
||||
if (mShortcutPreference.isChecked()) {
|
||||
optInAllMagnificationValuesToSettings(getPrefContext(), mUserShortcutType);
|
||||
optOutAllMagnificationValuesFromSettings(getPrefContext(), ~mUserShortcutType);
|
||||
}
|
||||
mShortcutPreference.setChecked(true);
|
||||
mShortcutPreference.setChecked(mUserShortcutType != UserShortcutType.EMPTY);
|
||||
mShortcutPreference.setSummary(
|
||||
getShortcutTypeSummary(getPrefContext()));
|
||||
}
|
||||
@@ -467,7 +453,7 @@ public class ToggleScreenMagnificationPreferenceFragment extends
|
||||
private void updateShortcutPreferenceData() {
|
||||
// Get the user shortcut type from settings provider.
|
||||
mUserShortcutType = getUserShortcutTypeFromSettings(getPrefContext());
|
||||
if (mUserShortcutType != UserShortcutType.DEFAULT) {
|
||||
if (mUserShortcutType != UserShortcutType.EMPTY) {
|
||||
setUserShortcutType(getPrefContext(), mUserShortcutType);
|
||||
} else {
|
||||
// Get the user shortcut type from shared_prefs if cannot get from settings provider.
|
||||
@@ -626,7 +612,7 @@ public class ToggleScreenMagnificationPreferenceFragment extends
|
||||
}
|
||||
|
||||
private static int getUserShortcutTypeFromSettings(Context context) {
|
||||
int shortcutTypes = UserShortcutType.DEFAULT;
|
||||
int shortcutTypes = UserShortcutType.EMPTY;
|
||||
if (hasMagnificationValuesInSettings(context, UserShortcutType.SOFTWARE)) {
|
||||
shortcutTypes |= UserShortcutType.SOFTWARE;
|
||||
}
|
||||
|
@@ -60,7 +60,7 @@ public class ToggleFeaturePreferenceFragmentTest {
|
||||
TEST_SERVICE_KEY_1);
|
||||
|
||||
assertThat(shortcut.getComponentName()).isEqualTo(TEST_SERVICE_NAME_1);
|
||||
assertThat(shortcut.getUserShortcutType()).isEqualTo(TEST_SERVICE_VALUE_1);
|
||||
assertThat(shortcut.getType()).isEqualTo(TEST_SERVICE_VALUE_1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -69,7 +69,7 @@ public class ToggleFeaturePreferenceFragmentTest {
|
||||
TEST_SERVICE_KEY_2);
|
||||
|
||||
shortcut.setComponentName(TEST_SERVICE_NAME_1);
|
||||
shortcut.setUserShortcutType(TEST_SERVICE_VALUE_1);
|
||||
shortcut.setType(TEST_SERVICE_VALUE_1);
|
||||
|
||||
assertThat(shortcut.flattenToString()).isEqualTo(TEST_SERVICE_KEY_1);
|
||||
}
|
||||
@@ -103,7 +103,7 @@ public class ToggleFeaturePreferenceFragmentTest {
|
||||
|
||||
final String str = (String) filtered.toArray()[0];
|
||||
final AccessibilityUserShortcutType shortcut = new AccessibilityUserShortcutType(str);
|
||||
final int type = shortcut.getUserShortcutType();
|
||||
final int type = shortcut.getType();
|
||||
assertThat(type).isEqualTo(TEST_SERVICE_VALUE_1);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user