diff --git a/res/xml/accessibility_daltonizer_settings.xml b/res/xml/accessibility_daltonizer_settings.xml index 0d9911c984a..b2ab5efb59c 100644 --- a/res/xml/accessibility_daltonizer_settings.xml +++ b/res/xml/accessibility_daltonizer_settings.xml @@ -53,7 +53,7 @@ + android:key="daltonizer_footer_category"> + xmlns:settings="http://schemas.android.com/apk/res-auto" + android:title="@string/accessibility_global_gesture_preference_title"> + android:fragment="com.android.settings.accessibility.ShortcutServicePickerFragment" + android:key="accessibility_shortcut_service" + android:title="@string/accessibility_shortcut_service_title" /> + android:key="accessibility_shortcut_on_lock_screen" + android:title="@string/accessibility_shortcut_service_on_lock_screen_title" /> - \ No newline at end of file + android:title="@string/accessibility_shortcut_description" + settings:searchable="false" /> + + diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java index 55edf50ede2..659eacadd79 100644 --- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java +++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java @@ -15,6 +15,9 @@ */ package com.android.settings.accessibility; +import static com.android.settings.accessibility.AccessibilityUtil.State.OFF; +import static com.android.settings.accessibility.AccessibilityUtil.State.ON; + import android.accessibilityservice.AccessibilityServiceInfo; import android.annotation.Nullable; import android.app.settings.SettingsEnums; @@ -28,15 +31,14 @@ import android.os.UserHandle; import android.provider.Settings; import android.view.View; import android.view.accessibility.AccessibilityManager; -import android.widget.Switch; import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; import com.android.internal.accessibility.AccessibilityShortcutController; import com.android.settings.R; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settings.widget.SwitchBar; import com.android.settingslib.accessibility.AccessibilityUtils; import com.android.settingslib.search.Indexable; import com.android.settingslib.search.SearchIndexable; @@ -79,7 +81,7 @@ public class AccessibilityShortcutPreferenceFragment extends ToggleFeaturePrefer mOnLockScreenSwitchPreference.setOnPreferenceChangeListener((Preference p, Object o) -> { Settings.Secure.putInt(getContentResolver(), Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, - ((Boolean) o) ? 1 : 0); + ((Boolean) o) ? ON : OFF); return true; }); } @@ -87,7 +89,12 @@ public class AccessibilityShortcutPreferenceFragment extends ToggleFeaturePrefer @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - mShortcutPreference.setVisible(false); + + final PreferenceScreen preferenceScreen = getPreferenceScreen(); + preferenceScreen.findPreference(KEY_GENERAL_CATEGORY).setVisible(false); + + preferenceScreen.setOrderingAsAdded(false); + mToggleServiceDividerSwitchPreference.setOrder(mServicePreference.getOrder() - 1); } @Override @@ -111,34 +118,42 @@ public class AccessibilityShortcutPreferenceFragment extends ToggleFeaturePrefer } @Override - protected void onInstallSwitchBarToggleSwitch() { - super.onInstallSwitchBarToggleSwitch(); - mSwitchBar.addOnSwitchChangeListener((Switch switchView, boolean enabled) -> { + protected void onRemoveSwitchPreferenceToggleSwitch() { + super.onRemoveSwitchPreferenceToggleSwitch(); + mToggleServiceDividerSwitchPreference.setOnPreferenceClickListener(null); + } + + @Override + protected void onInstallSwitchPreferenceToggleSwitch() { + super.onInstallSwitchPreferenceToggleSwitch(); + mToggleServiceDividerSwitchPreference.setOnPreferenceClickListener((preference) -> { + boolean enabled = ((SwitchPreference) preference).isChecked(); Context context = getContext(); if (enabled && !shortcutFeatureAvailable(context)) { - // If no service is configured, we'll disable the shortcut shortly. Give the - // user a chance to select a service. We'll update the preferences when we resume. - Settings.Secure.putInt( - getContentResolver(), Settings.Secure.ACCESSIBILITY_SHORTCUT_ENABLED, 1); + // If no service is configured, we'll disable the shortcut shortly. Give the user + // a chance to select a service. We'll update the preferences when we resume. + Settings.Secure.putInt(getContentResolver(), + Settings.Secure.ACCESSIBILITY_SHORTCUT_ENABLED, ON); mServicePreference.setEnabled(true); mServicePreference.performClick(); } else { onPreferenceToggled(Settings.Secure.ACCESSIBILITY_SHORTCUT_ENABLED, enabled); } + return true; }); } @Override protected void onPreferenceToggled(String preferenceKey, boolean enabled) { - Settings.Secure.putInt(getContentResolver(), preferenceKey, enabled ? 1 : 0); + Settings.Secure.putInt(getContentResolver(), preferenceKey, enabled ? ON : OFF); updatePreferences(); } @Override - protected void updateSwitchBarText(SwitchBar switchBar) { + protected void updateToggleServiceTitle(SwitchPreference switchPreference) { final String switchBarText = getString(R.string.accessibility_service_master_switch_title, getString(R.string.accessibility_global_gesture_preference_title)); - switchBar.setSwitchBarText(switchBarText, switchBarText); + switchPreference.setTitle(switchBarText); } private void updatePreferences() { @@ -148,21 +163,21 @@ public class AccessibilityShortcutPreferenceFragment extends ToggleFeaturePrefer if (!shortcutFeatureAvailable(context)) { // If no service is configured, make sure the overall shortcut is turned off Settings.Secure.putInt( - getContentResolver(), Settings.Secure.ACCESSIBILITY_SHORTCUT_ENABLED, 0); + getContentResolver(), Settings.Secure.ACCESSIBILITY_SHORTCUT_ENABLED, OFF); } boolean isEnabled = Settings.Secure - .getInt(cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_ENABLED, 1) == 1; - mSwitchBar.setChecked(isEnabled); + .getInt(cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_ENABLED, ON) == ON; + mToggleServiceDividerSwitchPreference.setChecked(isEnabled); // The shortcut is enabled by default on the lock screen as long as the user has // enabled the shortcut with the warning dialog final int dialogShown = Settings.Secure.getInt( - cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, 0); + cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, OFF); final boolean enabledFromLockScreen = Settings.Secure.getInt( - cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, dialogShown) == 1; + cr, Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, dialogShown) == ON; mOnLockScreenSwitchPreference.setChecked(enabledFromLockScreen); // Only enable changing the service and lock screen behavior if the shortcut is on - mServicePreference.setEnabled(mToggleSwitch.isChecked()); - mOnLockScreenSwitchPreference.setEnabled(mToggleSwitch.isChecked()); + mServicePreference.setEnabled(mToggleServiceDividerSwitchPreference.isChecked()); + mOnLockScreenSwitchPreference.setEnabled(mToggleServiceDividerSwitchPreference.isChecked()); } /** diff --git a/src/com/android/settings/accessibility/DividerSwitchPreference.java b/src/com/android/settings/accessibility/DividerSwitchPreference.java new file mode 100644 index 00000000000..34b0429570c --- /dev/null +++ b/src/com/android/settings/accessibility/DividerSwitchPreference.java @@ -0,0 +1,69 @@ +/* + * 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. + */ + +package com.android.settings.accessibility; + +import android.content.Context; + +import androidx.preference.PreferenceViewHolder; +import androidx.preference.SwitchPreference; + +/** + * A switch preference that has a divider below and above. Used for Accessibility Settings use + * service. + */ +public final class DividerSwitchPreference extends SwitchPreference { + + private Boolean mDividerAllowedAbove; + private Boolean mDividerAllowBelow; + + public DividerSwitchPreference(Context context) { + super(context); + mDividerAllowedAbove = true; + mDividerAllowBelow = true; + } + + /** + * Sets divider whether to show in preference above. + * + * @param allowed true will be drawn on above this item + */ + public void setDividerAllowedAbove(boolean allowed) { + if (mDividerAllowedAbove != allowed) { + mDividerAllowedAbove = allowed; + notifyChanged(); + } + } + + /** + * Sets divider whether to show in preference below. + * + * @param allowed true will be drawn on below this item + */ + public void setDividerAllowedBelow(boolean allowed) { + if (mDividerAllowedAbove != allowed) { + mDividerAllowBelow = allowed; + notifyChanged(); + } + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + holder.setDividerAllowedAbove(mDividerAllowedAbove); + holder.setDividerAllowedBelow(mDividerAllowBelow); + } +} diff --git a/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java index a48b71f15fa..93064c5015d 100644 --- a/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/InvisibleToggleAccessibilityServicePreferenceFragment.java @@ -17,29 +17,27 @@ package com.android.settings.accessibility; import android.accessibilityservice.AccessibilityServiceInfo; -import android.os.Bundle; import android.view.View; import com.android.settings.R; -import com.android.settings.SettingsActivity; -import com.android.settings.widget.SwitchBar; import com.android.settingslib.accessibility.AccessibilityUtils; /** - * For accessibility services that target SDK > Q, and - * {@link AccessibilityServiceInfo#FLAG_REQUEST_ACCESSIBILITY_BUTTON} - * is set. + * Fragment that does not have toggle bar to turn on service to use. + * + *

The child {@link ToggleAccessibilityServicePreferenceFragment} shows the actual UI for + * providing basic accessibility service setup. + * + *

For accessibility services that target SDK > Q, and + * {@link AccessibilityServiceInfo#FLAG_REQUEST_ACCESSIBILITY_BUTTON} is set. */ public class InvisibleToggleAccessibilityServicePreferenceFragment extends ToggleAccessibilityServicePreferenceFragment implements ShortcutPreference.OnClickListener{ @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - final SettingsActivity activity = (SettingsActivity) getActivity(); - final SwitchBar mSwitchBar = activity.getSwitchBar(); - mSwitchBar.hide(); + protected void onInstallSwitchPreferenceToggleSwitch() { + super.onInstallSwitchPreferenceToggleSwitch(); + mToggleServiceDividerSwitchPreference.setVisible(false); } /** diff --git a/src/com/android/settings/accessibility/LegacyAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/LegacyAccessibilityServicePreferenceFragment.java index 0a65709e9da..2739b6bbe91 100644 --- a/src/com/android/settings/accessibility/LegacyAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/LegacyAccessibilityServicePreferenceFragment.java @@ -25,7 +25,14 @@ import com.android.settings.R; import com.google.common.collect.ImmutableSet; -/** For accessibility services that target SDK <= Q. */ +/** + * Fragment that only allowed hardware {@link UserShortcutType} for shortcut to open. + * + *

The child {@link ToggleAccessibilityServicePreferenceFragment} shows the actual UI for + * providing basic accessibility service setup. + * + *

For accessibility services that target SDK <= Q. + */ public class LegacyAccessibilityServicePreferenceFragment extends ToggleAccessibilityServicePreferenceFragment { @@ -38,7 +45,6 @@ public class LegacyAccessibilityServicePreferenceFragment extends mShortcutPreference.setSummary(hardwareTitle); mShortcutPreference.setSettingsVisibility(View.GONE); - // Only allowed hardware PreferredShortcutType in this fragment. setAllowedPreferredShortcutType(UserShortcutType.HARDWARE); } diff --git a/src/com/android/settings/accessibility/LegacyToggleScreenReaderPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/LegacyToggleScreenReaderPreferenceFragmentForSetupWizard.java index c9257a96b78..82d80e08325 100644 --- a/src/com/android/settings/accessibility/LegacyToggleScreenReaderPreferenceFragmentForSetupWizard.java +++ b/src/com/android/settings/accessibility/LegacyToggleScreenReaderPreferenceFragmentForSetupWizard.java @@ -28,7 +28,7 @@ public class LegacyToggleScreenReaderPreferenceFragmentForSetupWizard @Override protected void onProcessArguments(Bundle arguments) { super.onProcessArguments(arguments); - mToggleSwitchWasInitiallyChecked = mToggleSwitch.isChecked(); + mToggleSwitchWasInitiallyChecked = mToggleServiceDividerSwitchPreference.isChecked(); } @Override @@ -39,10 +39,10 @@ public class LegacyToggleScreenReaderPreferenceFragmentForSetupWizard @Override public void onStop() { // Log the final choice in value if it's different from the previous value. - if (mToggleSwitch.isChecked() != mToggleSwitchWasInitiallyChecked) { + if (mToggleServiceDividerSwitchPreference.isChecked() != mToggleSwitchWasInitiallyChecked) { mMetricsFeatureProvider.action(getContext(), SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_READER, - mToggleSwitch.isChecked()); + mToggleServiceDividerSwitchPreference.isChecked()); } super.onStop(); diff --git a/src/com/android/settings/accessibility/LegacyToggleSelectToSpeakPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/LegacyToggleSelectToSpeakPreferenceFragmentForSetupWizard.java index 2c8485b4faf..9953faf27a9 100644 --- a/src/com/android/settings/accessibility/LegacyToggleSelectToSpeakPreferenceFragmentForSetupWizard.java +++ b/src/com/android/settings/accessibility/LegacyToggleSelectToSpeakPreferenceFragmentForSetupWizard.java @@ -28,7 +28,7 @@ public class LegacyToggleSelectToSpeakPreferenceFragmentForSetupWizard @Override protected void onProcessArguments(Bundle arguments) { super.onProcessArguments(arguments); - mToggleSwitchWasInitiallyChecked = mToggleSwitch.isChecked(); + mToggleSwitchWasInitiallyChecked = mToggleServiceDividerSwitchPreference.isChecked(); } @Override @@ -39,10 +39,10 @@ public class LegacyToggleSelectToSpeakPreferenceFragmentForSetupWizard @Override public void onStop() { // Log the final choice in value if it's different from the previous value. - if (mToggleSwitch.isChecked() != mToggleSwitchWasInitiallyChecked) { + if (mToggleServiceDividerSwitchPreference.isChecked() != mToggleSwitchWasInitiallyChecked) { mMetricsFeatureProvider.action(getContext(), SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SELECT_TO_SPEAK, - mToggleSwitch.isChecked()); + mToggleServiceDividerSwitchPreference.isChecked()); } super.onStop(); diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java index 6d64a231517..a75c536d7de 100644 --- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java @@ -39,12 +39,13 @@ import android.view.MenuInflater; import android.view.View; import android.view.accessibility.AccessibilityManager; +import androidx.preference.Preference; +import androidx.preference.SwitchPreference; + import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; import com.android.settings.accessibility.AccessibilityUtil.UserShortcutType; import com.android.settings.password.ConfirmDeviceCredentialActivity; -import com.android.settings.widget.SwitchBar; -import com.android.settings.widget.ToggleSwitch; import com.android.settingslib.accessibility.AccessibilityUtils; import java.util.List; @@ -186,21 +187,21 @@ public class ToggleAccessibilityServicePreferenceFragment extends } @Override - protected void updateSwitchBarText(SwitchBar switchBar) { + protected void updateToggleServiceTitle(SwitchPreference switchPreference) { final AccessibilityServiceInfo info = getAccessibilityServiceInfo(); final String switchBarText = (info == null) ? "" : getString(R.string.accessibility_service_master_switch_title, info.getResolveInfo().loadLabel(getPackageManager())); - switchBar.setSwitchBarText(switchBarText, switchBarText); + switchPreference.setTitle(switchBarText); } private void updateSwitchBarToggleSwitch() { final boolean checked = AccessibilityUtils.getEnabledServicesFromSettings(getPrefContext()) .contains(mComponentName); - if (mSwitchBar.isChecked() == checked) { + if (mToggleServiceDividerSwitchPreference.isChecked() == checked) { return; } - mSwitchBar.setCheckedInternal(checked); + mToggleServiceDividerSwitchPreference.setChecked(checked); } /** @@ -251,7 +252,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends } private void handleConfirmServiceEnabled(boolean confirmed) { - mSwitchBar.setCheckedInternal(confirmed); + mToggleServiceDividerSwitchPreference.setChecked(confirmed); getArguments().putBoolean(AccessibilitySettings.EXTRA_CHECKED, confirmed); onPreferenceToggled(mPreferenceKey, confirmed); } @@ -274,9 +275,9 @@ public class ToggleAccessibilityServicePreferenceFragment extends } @Override - protected void onInstallSwitchBarToggleSwitch() { - super.onInstallSwitchBarToggleSwitch(); - mToggleSwitch.setOnBeforeCheckedChangeListener(this::onBeforeCheckedChanged); + protected void onInstallSwitchPreferenceToggleSwitch() { + super.onInstallSwitchPreferenceToggleSwitch(); + mToggleServiceDividerSwitchPreference.setOnPreferenceClickListener(this::onPreferenceClick); } @Override @@ -410,9 +411,10 @@ public class ToggleAccessibilityServicePreferenceFragment extends mDialog.dismiss(); } - private boolean onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked) { + private boolean onPreferenceClick(Preference preference) { + boolean checked = ((DividerSwitchPreference) preference).isChecked(); if (checked) { - mSwitchBar.setCheckedInternal(false); + mToggleServiceDividerSwitchPreference.setChecked(false); getArguments().putBoolean(AccessibilitySettings.EXTRA_CHECKED, /* disableService */ false); if (!mShortcutPreference.getChecked()) { @@ -424,7 +426,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends } } } else { - mSwitchBar.setCheckedInternal(true); + mToggleServiceDividerSwitchPreference.setChecked(true); getArguments().putBoolean(AccessibilitySettings.EXTRA_CHECKED, /* enableService */ true); showDialog(DialogEnums.DISABLE_WARNING_FROM_TOGGLE); diff --git a/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java index d25be83a1b0..ffde1e3df04 100644 --- a/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java @@ -31,10 +31,10 @@ import android.view.ViewGroup; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; import com.android.settings.R; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settings.widget.SwitchBar; import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; @@ -66,22 +66,22 @@ public class ToggleColorInversionPreferenceFragment extends ToggleFeaturePrefere } @Override - protected void onRemoveSwitchBarToggleSwitch() { - super.onRemoveSwitchBarToggleSwitch(); - mToggleSwitch.setOnBeforeCheckedChangeListener(null); + protected void onRemoveSwitchPreferenceToggleSwitch() { + super.onRemoveSwitchPreferenceToggleSwitch(); + mToggleServiceDividerSwitchPreference.setOnPreferenceClickListener(null); } @Override - protected void updateSwitchBarText(SwitchBar switchBar) { - switchBar.setSwitchBarText(R.string.accessibility_display_inversion_switch_title, - R.string.accessibility_display_inversion_switch_title); + protected void updateToggleServiceTitle(SwitchPreference switchPreference) { + switchPreference.setTitle(R.string.accessibility_display_inversion_switch_title); } @Override - protected void onInstallSwitchBarToggleSwitch() { - super.onInstallSwitchBarToggleSwitch(); + protected void onInstallSwitchPreferenceToggleSwitch() { + super.onInstallSwitchPreferenceToggleSwitch(); updateSwitchBarToggleSwitch(); - mToggleSwitch.setOnBeforeCheckedChangeListener((toggleSwitch, checked) -> { + mToggleServiceDividerSwitchPreference.setOnPreferenceClickListener((preference) -> { + boolean checked = ((SwitchPreference) preference).isChecked(); onPreferenceToggled(mPreferenceKey, checked); return false; }); @@ -135,10 +135,10 @@ public class ToggleColorInversionPreferenceFragment extends ToggleFeaturePrefere private void updateSwitchBarToggleSwitch() { final boolean checked = Settings.Secure.getInt(getContentResolver(), ENABLED, OFF) == ON; - if (mSwitchBar.isChecked() == checked) { + if (mToggleServiceDividerSwitchPreference.isChecked() == checked) { return; } - mSwitchBar.setCheckedInternal(checked); + mToggleServiceDividerSwitchPreference.setChecked(checked); } public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = diff --git a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java index 9a6aefd1563..f2b84e52a24 100644 --- a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java @@ -34,10 +34,10 @@ import android.view.ViewGroup; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; import com.android.settings.R; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settings.widget.SwitchBar; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.search.SearchIndexable; @@ -51,6 +51,7 @@ public final class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePrefe private static final String ENABLED = Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED; private static final String CATEGORY_FOOTER_KEY = "daltonizer_footer_category"; + private static final String CATEGORY_MODE_KEY = "daltonizer_mode_category"; private static final List sControllers = new ArrayList<>(); private final Handler mHandler = new Handler(); private SettingsContentObserver mSettingsContentObserver; @@ -98,6 +99,11 @@ public final class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePrefe super.onViewCreated(view, savedInstanceState); final PreferenceScreen preferenceScreen = getPreferenceScreen(); preferenceScreen.setOrderingAsAdded(false); + + final PreferenceCategory modeCategory = preferenceScreen.findPreference( + CATEGORY_MODE_KEY); + modeCategory.setOrder(Integer.MAX_VALUE - 1); + final PreferenceCategory footerCategory = preferenceScreen.findPreference( CATEGORY_FOOTER_KEY); footerCategory.setOrder(Integer.MAX_VALUE); @@ -148,22 +154,22 @@ public final class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePrefe } @Override - protected void onRemoveSwitchBarToggleSwitch() { - super.onRemoveSwitchBarToggleSwitch(); - mToggleSwitch.setOnBeforeCheckedChangeListener(null); + protected void onRemoveSwitchPreferenceToggleSwitch() { + super.onRemoveSwitchPreferenceToggleSwitch(); + mToggleServiceDividerSwitchPreference.setOnPreferenceClickListener(null); } @Override - protected void updateSwitchBarText(SwitchBar switchBar) { - switchBar.setSwitchBarText(R.string.accessibility_daltonizer_master_switch_title, - R.string.accessibility_daltonizer_master_switch_title); + protected void updateToggleServiceTitle(SwitchPreference switchPreference) { + switchPreference.setTitle(R.string.accessibility_daltonizer_master_switch_title); } @Override - protected void onInstallSwitchBarToggleSwitch() { - super.onInstallSwitchBarToggleSwitch(); + protected void onInstallSwitchPreferenceToggleSwitch() { + super.onInstallSwitchPreferenceToggleSwitch(); updateSwitchBarToggleSwitch(); - mToggleSwitch.setOnBeforeCheckedChangeListener((toggleSwitch, checked) -> { + mToggleServiceDividerSwitchPreference.setOnPreferenceClickListener((preference) -> { + boolean checked = ((SwitchPreference) preference).isChecked(); onPreferenceToggled(mPreferenceKey, checked); return false; }); @@ -177,10 +183,10 @@ public final class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePrefe private void updateSwitchBarToggleSwitch() { final boolean checked = Settings.Secure.getInt(getContentResolver(), ENABLED, OFF) == ON; - if (mSwitchBar.isChecked() == checked) { + if (mToggleServiceDividerSwitchPreference.isChecked() == checked) { return; } - mSwitchBar.setCheckedInternal(checked); + mToggleServiceDividerSwitchPreference.setChecked(checked); } public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java index 8764b127e99..3521aa58fa7 100644 --- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java @@ -40,13 +40,13 @@ import android.widget.ImageView; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.accessibility.AccessibilityUtil.UserShortcutType; import com.android.settings.widget.SwitchBar; -import com.android.settings.widget.ToggleSwitch; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -64,8 +64,7 @@ import java.util.stream.Collectors; public abstract class ToggleFeaturePreferenceFragment extends SettingsPreferenceFragment implements ShortcutPreference.OnClickListener { - protected SwitchBar mSwitchBar; - protected ToggleSwitch mToggleSwitch; + protected DividerSwitchPreference mToggleServiceDividerSwitchPreference; protected ShortcutPreference mShortcutPreference; protected Preference mSettingsPreference; protected String mPreferenceKey; @@ -80,7 +79,7 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference protected CharSequence mHtmlDescription; private static final String ANCHOR_TAG = "a"; private static final String DRAWABLE_FOLDER = "drawable"; - + protected static final String KEY_GENERAL_CATEGORY = "categories"; private static final String KEY_SHORTCUT_PREFERENCE = "shortcut_preference"; private static final String EXTRA_SHORTCUT_TYPE = "shortcut_type"; private TouchExplorationStateChangeListener mTouchExplorationStateChangeListener; @@ -133,12 +132,9 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - SettingsActivity activity = (SettingsActivity) getActivity(); - mSwitchBar = activity.getSwitchBar(); - mToggleSwitch = mSwitchBar.getSwitch(); - - onProcessArguments(getArguments()); - updateSwitchBarText(mSwitchBar); + final SettingsActivity activity = (SettingsActivity) getActivity(); + final SwitchBar switchBar = activity.getSwitchBar(); + switchBar.hide(); PreferenceScreen preferenceScreen = getPreferenceScreen(); if (mImageUri != null) { @@ -149,12 +145,19 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference preferenceScreen.addPreference(animatedImagePreference); } - final PreferenceCategory category = new PreferenceCategory(getPrefContext()); - category.setTitle(R.string.accessibility_screen_option); - preferenceScreen.addPreference(category); + mToggleServiceDividerSwitchPreference = new DividerSwitchPreference(getPrefContext()); + preferenceScreen.addPreference(mToggleServiceDividerSwitchPreference); + + onProcessArguments(getArguments()); + updateToggleServiceTitle(mToggleServiceDividerSwitchPreference); + + final PreferenceCategory groupCategory = new PreferenceCategory(getPrefContext()); + groupCategory.setKey(KEY_GENERAL_CATEGORY); + groupCategory.setTitle(R.string.accessibility_screen_option); + preferenceScreen.addPreference(groupCategory); initShortcutPreference(savedInstanceState); - category.addPreference(mShortcutPreference); + groupCategory.addPreference(mShortcutPreference); // Show the "Settings" menu as if it were a preference screen. if (mSettingsTitle != null && mSettingsIntent != null) { @@ -166,7 +169,7 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference // The downloaded app may not show Settings. The framework app has Settings. if (mSettingsPreference != null) { - category.addPreference(mSettingsPreference); + groupCategory.addPreference(mSettingsPreference); } if (mStaticDescription != null || mHtmlDescription != null) { @@ -311,31 +314,27 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference removeActionBarToggleSwitch(); } - protected void updateSwitchBarText(SwitchBar switchBar) { - // Implement this to provide meaningful text in switch bar. - switchBar.setSwitchBarText(R.string.accessibility_service_master_switch_title, - R.string.accessibility_service_master_switch_title); + protected void updateToggleServiceTitle(SwitchPreference switchPreference) { + switchPreference.setTitle(R.string.accessibility_service_master_switch_title); } protected abstract void onPreferenceToggled(String preferenceKey, boolean enabled); - protected void onInstallSwitchBarToggleSwitch() { + protected void onInstallSwitchPreferenceToggleSwitch() { // Implement this to set a checked listener. } - protected void onRemoveSwitchBarToggleSwitch() { + protected void onRemoveSwitchPreferenceToggleSwitch() { // Implement this to reset a checked listener. } private void installActionBarToggleSwitch() { - mSwitchBar.show(); - onInstallSwitchBarToggleSwitch(); + onInstallSwitchPreferenceToggleSwitch(); } private void removeActionBarToggleSwitch() { - mToggleSwitch.setOnBeforeCheckedChangeListener(null); - onRemoveSwitchBarToggleSwitch(); - mSwitchBar.hide(); + mToggleServiceDividerSwitchPreference.setOnPreferenceClickListener(null); + onRemoveSwitchPreferenceToggleSwitch(); } public void setTitle(String title) { @@ -349,7 +348,7 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference // Enabled. if (arguments.containsKey(AccessibilitySettings.EXTRA_CHECKED)) { final boolean enabled = arguments.getBoolean(AccessibilitySettings.EXTRA_CHECKED); - mSwitchBar.setCheckedInternal(enabled); + mToggleServiceDividerSwitchPreference.setChecked(enabled); } // Title. @@ -493,8 +492,9 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference if (info.isEmpty()) { info = new HashSet<>(); } else { - final Set filtered = info.stream().filter( - str -> str.contains(componentName)).collect(Collectors.toSet()); + final Set filtered = info.stream() + .filter(str -> str.contains(componentName)) + .collect(Collectors.toSet()); info.removeAll(filtered); } final AccessibilityUserShortcutType shortcut = new AccessibilityUserShortcutType( @@ -538,9 +538,9 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference final Set info = SharedPreferenceUtils.getUserShortcutType(context); final String componentName = mComponentName.flattenToString(); - final Set filtered = info.stream().filter( - str -> str.contains(componentName)).collect( - Collectors.toSet()); + final Set filtered = info.stream() + .filter(str -> str.contains(componentName)) + .collect(Collectors.toSet()); if (filtered.isEmpty()) { return defaultValue; } diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java index 518259330d0..7ca2abfc7d1 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java @@ -60,10 +60,13 @@ import java.util.Set; import java.util.StringJoiner; import java.util.stream.Collectors; +/** + * Fragment that shows the actual UI for providing basic magnification accessibility service setup + * and does not have toggle bar to turn on service to use. + */ public class ToggleScreenMagnificationPreferenceFragment extends ToggleFeaturePreferenceFragment { - private static final String SETTINGS_KEY = "screen_magnification_settings"; private static final String EXTRA_SHORTCUT_TYPE = "shortcut_type"; private static final String KEY_SHORTCUT_PREFERENCE = "shortcut_preference"; private TouchExplorationStateChangeListener mTouchExplorationStateChangeListener; @@ -429,11 +432,9 @@ public class ToggleScreenMagnificationPreferenceFragment extends } @Override - protected void onInstallSwitchBarToggleSwitch() { - super.onInstallSwitchBarToggleSwitch(); - - // Magnify is temporary-use app which uses shortcut to magnify screen, not by toggle. - mSwitchBar.hide(); + protected void onInstallSwitchPreferenceToggleSwitch() { + super.onInstallSwitchPreferenceToggleSwitch(); + mToggleServiceDividerSwitchPreference.setVisible(false); } @Override diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java index 5fe62a7e021..3b786ff3107 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java @@ -32,11 +32,12 @@ public class ToggleScreenMagnificationPreferenceFragmentForSetupWizard // Log the final choice in value if it's different from the previous value. Bundle args = getArguments(); if ((args != null) && args.containsKey(AccessibilitySettings.EXTRA_CHECKED)) { - if (mToggleSwitch.isChecked() != args.getBoolean(AccessibilitySettings.EXTRA_CHECKED)) { + if (mToggleServiceDividerSwitchPreference.isChecked() != args.getBoolean( + AccessibilitySettings.EXTRA_CHECKED)) { // TODO: Distinguish between magnification modes mMetricsFeatureProvider.action(getContext(), SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION, - mToggleSwitch.isChecked()); + mToggleServiceDividerSwitchPreference.isChecked()); } } super.onStop(); diff --git a/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java index 29c031d4691..0f114fdc5ca 100644 --- a/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java +++ b/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java @@ -27,7 +27,7 @@ public class ToggleScreenReaderPreferenceFragmentForSetupWizard @Override protected void onProcessArguments(Bundle arguments) { super.onProcessArguments(arguments); - mToggleSwitchWasInitiallyChecked = mToggleSwitch.isChecked(); + mToggleSwitchWasInitiallyChecked = mToggleServiceDividerSwitchPreference.isChecked(); } @Override @@ -38,11 +38,11 @@ public class ToggleScreenReaderPreferenceFragmentForSetupWizard @Override public void onStop() { // Log the final choice in value if it's different from the previous value. - if (mToggleSwitch.isChecked() != mToggleSwitchWasInitiallyChecked) { + if (mToggleServiceDividerSwitchPreference.isChecked() != mToggleSwitchWasInitiallyChecked) { mMetricsFeatureProvider.action(getContext(), - SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_READER, mToggleSwitch.isChecked()); + SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_READER, + mToggleServiceDividerSwitchPreference.isChecked()); } - super.onStop(); } } diff --git a/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java index da94abc10ef..09598f6fcfc 100644 --- a/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java +++ b/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java @@ -27,7 +27,7 @@ public class ToggleSelectToSpeakPreferenceFragmentForSetupWizard @Override protected void onProcessArguments(Bundle arguments) { super.onProcessArguments(arguments); - mToggleSwitchWasInitiallyChecked = mToggleSwitch.isChecked(); + mToggleSwitchWasInitiallyChecked = mToggleServiceDividerSwitchPreference.isChecked(); } @Override @@ -38,10 +38,10 @@ public class ToggleSelectToSpeakPreferenceFragmentForSetupWizard @Override public void onStop() { // Log the final choice in value if it's different from the previous value. - if (mToggleSwitch.isChecked() != mToggleSwitchWasInitiallyChecked) { + if (mToggleServiceDividerSwitchPreference.isChecked() != mToggleSwitchWasInitiallyChecked) { mMetricsFeatureProvider.action(getContext(), SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SELECT_TO_SPEAK, - mToggleSwitch.isChecked()); + mToggleServiceDividerSwitchPreference.isChecked()); } super.onStop(); diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java index 9bebc9acea6..35a2d19ca8b 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java @@ -32,7 +32,6 @@ import androidx.fragment.app.FragmentActivity; import com.android.settings.R; import com.android.settings.accessibility.ToggleFeaturePreferenceFragment.AccessibilityUserShortcutType; -import com.android.settings.widget.SwitchBar; import org.junit.Test; import org.junit.runner.RunWith; @@ -82,9 +81,9 @@ public class ToggleFeaturePreferenceFragmentTest { mySet.add(TEST_SERVICE_KEY_2); mySet.add(TEST_SERVICE_KEY_3); - final Set filtered = mySet.stream().filter( - str -> str.contains(TEST_SERVICE_NAME_1)).collect( - Collectors.toSet()); + final Set filtered = mySet.stream() + .filter(str -> str.contains(TEST_SERVICE_NAME_1)) + .collect(Collectors.toSet()); mySet.removeAll(filtered); assertThat(mySet).doesNotContain(TEST_SERVICE_KEY_1); @@ -93,28 +92,26 @@ public class ToggleFeaturePreferenceFragmentTest { @Test public void stringSet_convertA11yUserShortcutType_shouldReturnPreferredShortcut() { - int type = 0; Set mySet = new HashSet<>(); mySet.add(TEST_SERVICE_KEY_1); mySet.add(TEST_SERVICE_KEY_2); mySet.add(TEST_SERVICE_KEY_3); - final Set filtered = mySet.stream().filter( - str -> str.contains(TEST_SERVICE_NAME_1)).collect( - Collectors.toSet()); - for (String str : filtered) { - final AccessibilityUserShortcutType shortcut = new AccessibilityUserShortcutType(str); - type = shortcut.getUserShortcutType(); - } + final Set filtered = mySet.stream() + .filter(str -> str.contains(TEST_SERVICE_NAME_1)) + .collect(Collectors.toSet()); + final String str = (String) filtered.toArray()[0]; + final AccessibilityUserShortcutType shortcut = new AccessibilityUserShortcutType(str); + final int type = shortcut.getUserShortcutType(); assertThat(type).isEqualTo(TEST_SERVICE_VALUE_1); } @Test public void createFragment_shouldOnlyAddPreferencesOnce() { mFragment = spy(new ToggleFeaturePreferenceFragmentTestable()); - FragmentController.setupFragment(mFragment, FragmentActivity.class, 0 /* containerViewId*/, - null /* bundle */); + FragmentController.setupFragment(mFragment, FragmentActivity.class, + /* containerViewId= */ 0, /* bundle= */null); // execute exactly once verify(mFragment).addPreferencesFromResource(R.xml.placeholder_prefs); @@ -152,11 +149,5 @@ public class ToggleFeaturePreferenceFragmentTest { public void onViewCreated(View view, Bundle savedInstanceState) { // do nothing } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - mSwitchBar = mock(SwitchBar.class); - super.onActivityCreated(savedInstanceState); - } } }