Merge "Update auto-rotate strings/toggles for better accessibility" into tm-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index cfcb62e..462c677 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -98,10 +98,10 @@
<string name="font_size_make_larger_desc">Make larger</string>
<!-- Auto rotate switchbar title. [CHAR_LIMIT=NONE] -->
- <string name="auto_rotate_settings_primary_switch_title">Use Auto-rotate</string>
+ <string name="auto_rotate_settings_primary_switch_title">Use auto-rotate</string>
<!-- Disclaimer for camera based rotate [CHAR_LIMIT=NONE] -->
- <string name="smart_rotate_text_headline">Face Detection uses the front-facing camera to improve Auto-rotate accuracy. Images are never stored or sent to Google.</string>
+ <string name="smart_rotate_text_headline">Face Detection uses the front-facing camera to improve auto-rotate accuracy. Images are never stored or sent to Google.</string>
<string name="font_size_preview_text_headline">Sample text</string>
<string name="font_size_preview_text_title"
translation_description="Title text in sample text used to illustrate how the currently selected font size will appear to the user. NOTE: Translate manually. No not adopt any copyrighted material for translation.">
@@ -2926,7 +2926,11 @@
<!-- Sound & display settings screen, face-based rotation check box label [CHAR LIMIT=30] -->
<string name="auto_rotate_option_face_based">On - Face-based</string>
<!-- SmartAutoRotatePreferenceFragment settings screen, face-based rotation switch label [CHAR LIMIT=30] -->
- <string name="auto_rotate_switch_face_based">Enable Face Detection</string>
+ <string name="auto_rotate_switch_face_based">Face Detection</string>
+ <!-- Preference summary to enable auto rotate[CHAR_LIMIT=NONE]-->
+ <string name="auto_rotate_screen_summary">Automatically adjust the screen orientation when you move your phone between portrait and landscape</string>
+ <!-- Accessibility description for auto rotate learn more link [CHAR LIMIT=NONE] -->
+ <string name="auto_rotate_link_a11y">Learn more about auto-rotate</string>
<!-- Display settings screen, screen resolution settings title [CHAR LIMIT=30] -->
<string name="screen_resolution_title">Screen resolution</string>
@@ -12453,6 +12457,9 @@
<!-- Help URI, battery saver page [DO NOT TRANSLATE] -->
<string name="help_url_battery_saver_settings" translatable="false"></string>
+ <!-- Help URI, auto rotate page [DO NOT TRANSLATE] -->
+ <string name="help_url_auto_rotate_settings" translatable="false"></string>
+
<!-- Help URI, app usage page [DO NOT TRANSLATE] -->
<string name="help_url_app_usage_settings" translatable="false"></string>
diff --git a/res/xml/auto_rotate_settings.xml b/res/xml/auto_rotate_settings.xml
index 0c120d6..38aa5f0 100644
--- a/res/xml/auto_rotate_settings.xml
+++ b/res/xml/auto_rotate_settings.xml
@@ -20,6 +20,14 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/accelerometer_title" >
+ <com.android.settingslib.widget.TopIntroPreference
+ android:title="@string/auto_rotate_screen_summary"/>
+
+ <com.android.settingslib.widget.MainSwitchPreference
+ android:key="auto_rotate_main_switch"
+ android:title="@string/auto_rotate_settings_primary_switch_title"
+ settings:controller="com.android.settings.display.AutoRotateSwitchBarController"/>
+
<SwitchPreference
android:key="auto_rotate_switch"
android:title="@string/auto_rotate_settings_primary_switch_title"
@@ -48,8 +56,9 @@
settings:controller="com.android.settings.display.SmartAutoRotateController" />
<com.android.settingslib.widget.FooterPreference
- android:icon="@drawable/ic_privacy_shield_24dp"
+ android:key="auto_rotate_footer_preference"
+ android:title="@string/smart_rotate_text_headline"
android:selectable="false"
- settings:searchable="false" />
+ settings:searchable="false"/>
</PreferenceScreen>
diff --git a/src/com/android/settings/display/AutoRotateSwitchBarController.java b/src/com/android/settings/display/AutoRotateSwitchBarController.java
index 48dedfd..d76104a 100644
--- a/src/com/android/settings/display/AutoRotateSwitchBarController.java
+++ b/src/com/android/settings/display/AutoRotateSwitchBarController.java
@@ -18,86 +18,78 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
-import android.widget.Switch;
import com.android.internal.view.RotationPolicy;
+import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.SettingsMainSwitchBar;
+import com.android.settings.widget.SettingsMainSwitchPreferenceController;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
-import com.android.settingslib.widget.OnMainSwitchChangeListener;
/**
- * The switch controller for auto-rotate.
+ * The main switch controller for auto-rotate.
*/
-public class AutoRotateSwitchBarController implements OnMainSwitchChangeListener,
+public class AutoRotateSwitchBarController extends SettingsMainSwitchPreferenceController implements
LifecycleObserver, OnStart, OnStop {
- private final SettingsMainSwitchBar mSwitchBar;
- private final Context mContext;
- private boolean mValidListener;
private final MetricsFeatureProvider mMetricsFeatureProvider;
+ private RotationPolicy.RotationPolicyListener mRotationPolicyListener;
- public AutoRotateSwitchBarController(Context context, SettingsMainSwitchBar switchBar,
- Lifecycle lifecycle) {
- mSwitchBar = switchBar;
- mContext = context;
+ public AutoRotateSwitchBarController(Context context, String key) {
+ super(context, key);
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
- if (lifecycle != null) {
- lifecycle.addObserver(this);
- }
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return RotationPolicy.isRotationLockToggleVisible(mContext)
+ && !DeviceStateAutoRotationHelper.isDeviceStateRotationEnabled(mContext)
+ ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
@Override
public void onStart() {
- if (!mValidListener) {
- mSwitchBar.addOnSwitchChangeListener(this);
- mValidListener = true;
+ if (mRotationPolicyListener == null) {
+ mRotationPolicyListener = new RotationPolicy.RotationPolicyListener() {
+ @Override
+ public void onChange() {
+ if (mSwitchPreference != null) {
+ updateState(mSwitchPreference);
+ }
+ }
+ };
}
- onChange();
+ RotationPolicy.registerRotationPolicyListener(mContext,
+ mRotationPolicyListener);
}
@Override
public void onStop() {
- if (mValidListener) {
- mSwitchBar.removeOnSwitchChangeListener(this);
- mValidListener = false;
+ if (mRotationPolicyListener != null) {
+ RotationPolicy.unregisterRotationPolicyListener(mContext, mRotationPolicyListener);
}
}
- /**
- * Listens to the state change of the rotation primary switch.
- */
@Override
- public void onSwitchChanged(Switch switchView, boolean isChecked) {
- setRotationLock(isChecked);
+ public boolean isChecked() {
+ return !RotationPolicy.isRotationLocked(mContext);
}
-
- protected void onChange() {
- final boolean isEnabled = !RotationPolicy.isRotationLocked(mContext);
- if (isEnabled != mSwitchBar.isChecked()) {
- // set listener to null so that that code below doesn't trigger onCheckedChanged()
- if (mValidListener) {
- mSwitchBar.removeOnSwitchChangeListener(this);
- }
- mSwitchBar.setChecked(isEnabled);
- if (mValidListener) {
- mSwitchBar.addOnSwitchChangeListener(this);
- }
- }
- }
-
- private boolean setRotationLock(boolean isChecked) {
+ @Override
+ public boolean setChecked(boolean isChecked) {
final boolean isLocked = !isChecked;
mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_ROTATE_ROTATE_MASTER_TOGGLE,
- isChecked);
+ isLocked);
RotationPolicy.setRotationLock(mContext, isLocked);
return true;
}
+ @Override
+ public int getSliceHighlightMenuRes() {
+ return R.string.menu_key_display;
+ }
+
}
diff --git a/src/com/android/settings/display/SmartAutoRotatePreferenceFragment.java b/src/com/android/settings/display/SmartAutoRotatePreferenceFragment.java
index 9fda03c..1b4e998 100644
--- a/src/com/android/settings/display/SmartAutoRotatePreferenceFragment.java
+++ b/src/com/android/settings/display/SmartAutoRotatePreferenceFragment.java
@@ -20,7 +20,7 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle;
-import android.text.Html;
+import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -28,12 +28,11 @@
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
-import com.android.internal.view.RotationPolicy;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.widget.SettingsMainSwitchBar;
+import com.android.settingslib.HelpUtils;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexable;
@@ -51,9 +50,11 @@
private static final String TAG = "SmartAutoRotatePreferenceFragment";
- private RotationPolicy.RotationPolicyListener mRotationPolicyListener;
- private AutoRotateSwitchBarController mSwitchBarController;
- @VisibleForTesting static final String AUTO_ROTATE_SWITCH_PREFERENCE_ID = "auto_rotate_switch";
+ @VisibleForTesting
+ static final String AUTO_ROTATE_MAIN_SWITCH_PREFERENCE_KEY = "auto_rotate_main_switch";
+ @VisibleForTesting
+ static final String AUTO_ROTATE_SWITCH_PREFERENCE_KEY = "auto_rotate_switch";
+ private static final String KEY_FOOTER_PREFERENCE = "auto_rotate_footer_preference";
@Override
protected int getPreferenceScreenResId() {
@@ -81,11 +82,10 @@
final View view = super.onCreateView(inflater, container, savedInstanceState);
final SettingsActivity activity = (SettingsActivity) getActivity();
createHeader(activity);
- final Preference footerPreference = findPreference(FooterPreference.KEY_FOOTER);
+ final Preference footerPreference = findPreference(KEY_FOOTER_PREFERENCE);
if (footerPreference != null) {
- footerPreference.setTitle(Html.fromHtml(getString(R.string.smart_rotate_text_headline),
- Html.FROM_HTML_MODE_COMPACT));
footerPreference.setVisible(isRotationResolverServiceAvailable(activity));
+ setupFooter();
}
return view;
}
@@ -95,39 +95,9 @@
boolean deviceStateRotationEnabled =
DeviceStateAutoRotationHelper.isDeviceStateRotationEnabled(activity);
if (isRotationResolverServiceAvailable(activity) && !deviceStateRotationEnabled) {
- final SettingsMainSwitchBar switchBar = activity.getSwitchBar();
- switchBar.setTitle(
- getContext().getString(R.string.auto_rotate_settings_primary_switch_title));
- switchBar.show();
- mSwitchBarController = new AutoRotateSwitchBarController(activity, switchBar,
- getSettingsLifecycle());
- findPreference(AUTO_ROTATE_SWITCH_PREFERENCE_ID).setVisible(false);
- }
- }
-
- @Override
- public void onResume() {
- super.onResume();
- if (mRotationPolicyListener == null) {
- mRotationPolicyListener = new RotationPolicy.RotationPolicyListener() {
- @Override
- public void onChange() {
- if (mSwitchBarController != null) {
- mSwitchBarController.onChange();
- }
- }
- };
- }
- RotationPolicy.registerRotationPolicyListener(getPrefContext(),
- mRotationPolicyListener);
- }
-
- @Override
- public void onPause() {
- super.onPause();
- if (mRotationPolicyListener != null) {
- RotationPolicy.unregisterRotationPolicyListener(getPrefContext(),
- mRotationPolicyListener);
+ findPreference(AUTO_ROTATE_SWITCH_PREFERENCE_KEY).setVisible(false);
+ } else {
+ findPreference(AUTO_ROTATE_MAIN_SWITCH_PREFERENCE_KEY).setVisible(false);
}
}
@@ -141,6 +111,34 @@
return TAG;
}
+ @Override
+ public int getHelpResource() {
+ return R.string.help_url_auto_rotate_settings;
+ }
+
+ // Updates the footer for this page.
+ @VisibleForTesting
+ void setupFooter() {
+ final String mHelpUri = getString(getHelpResource());
+ if (!TextUtils.isEmpty(mHelpUri)) {
+ addHelpLink();
+ }
+ }
+
+ // Changes the text to include a learn more link if the link is defined.
+ @VisibleForTesting
+ void addHelpLink() {
+ final FooterPreference pref = findPreference(KEY_FOOTER_PREFERENCE);
+ if (pref != null) {
+ pref.setLearnMoreAction(v -> {
+ startActivityForResult(HelpUtils.getHelpIntent(getContext(),
+ getString(getHelpResource()),
+ /*backupContext=*/ ""), /*requestCode=*/ 0);
+ });
+ pref.setLearnMoreContentDescription(getString(R.string.auto_rotate_link_a11y));
+ }
+ }
+
public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.auto_rotate_settings) {
diff --git a/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceFragmentTest.java
index 942fed6..e537419 100644
--- a/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceFragmentTest.java
@@ -16,7 +16,8 @@
package com.android.settings.display;
-import static com.android.settings.display.SmartAutoRotatePreferenceFragment.AUTO_ROTATE_SWITCH_PREFERENCE_ID;
+import static com.android.settings.display.SmartAutoRotatePreferenceFragment.AUTO_ROTATE_MAIN_SWITCH_PREFERENCE_KEY;
+import static com.android.settings.display.SmartAutoRotatePreferenceFragment.AUTO_ROTATE_SWITCH_PREFERENCE_KEY;
import static com.google.common.truth.Truth.assertThat;
@@ -45,7 +46,6 @@
import com.android.settings.testutils.ResolveInfoBuilder;
import com.android.settings.testutils.shadow.ShadowDeviceStateRotationLockSettingsManager;
import com.android.settings.testutils.shadow.ShadowRotationPolicy;
-import com.android.settings.widget.SettingsMainSwitchBar;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.devicestate.DeviceStateRotationLockSettingsManager;
@@ -71,8 +71,6 @@
private SmartAutoRotatePreferenceFragment mFragment;
- private SettingsMainSwitchBar mSwitchBar;
-
@Mock
private PackageManager mPackageManager;
@@ -87,6 +85,9 @@
private Resources mResources;
private Context mContext;
+ @Mock
+ private Preference mRotateMainSwitchPreference;
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
@@ -112,21 +113,21 @@
when(mFragment.getContext()).thenReturn(mContext);
doReturn(mView).when(mFragment).getView();
- when(mFragment.findPreference(AUTO_ROTATE_SWITCH_PREFERENCE_ID)).thenReturn(
+ when(mFragment.findPreference(AUTO_ROTATE_SWITCH_PREFERENCE_KEY)).thenReturn(
mRotateSwitchPreference);
- mSwitchBar = spy(new SettingsMainSwitchBar(mContext));
- when(mActivity.getSwitchBar()).thenReturn(mSwitchBar);
- doReturn(mSwitchBar).when(mView).findViewById(R.id.switch_bar);
- ShadowDeviceStateRotationLockSettingsManager.setDeviceStateRotationLockEnabled(false);
+
+ when(mFragment.findPreference(AUTO_ROTATE_MAIN_SWITCH_PREFERENCE_KEY)).thenReturn(
+ mRotateMainSwitchPreference);
}
@Test
public void createHeader_faceDetectionSupported_switchBarIsEnabled() {
+ ShadowDeviceStateRotationLockSettingsManager.setDeviceStateRotationLockEnabled(false);
mFragment.createHeader(mActivity);
- verify(mSwitchBar, times(1)).show();
+ verify(mRotateMainSwitchPreference, never()).setVisible(false);
verify(mRotateSwitchPreference, times(1)).setVisible(false);
}
@@ -137,7 +138,7 @@
mFragment.createHeader(mActivity);
- verify(mSwitchBar, never()).show();
+ verify(mRotateMainSwitchPreference, times(1)).setVisible(false);
verify(mRotateSwitchPreference, never()).setVisible(false);
}
@@ -147,7 +148,7 @@
mFragment.createHeader(mActivity);
- verify(mSwitchBar, never()).show();
+ verify(mRotateMainSwitchPreference, times(1)).setVisible(false);
verify(mRotateSwitchPreference, never()).setVisible(false);
}
@@ -176,6 +177,19 @@
DeviceStateAutoRotateSettingController.class);
}
+ @Test
+ public void setupFooter_linkAddedWhenAppropriate() {
+ doReturn("").when(mFragment).getText(anyInt());
+ doReturn("").when(mFragment).getString(anyInt());
+ mFragment.setupFooter();
+ verify(mFragment, never()).addHelpLink();
+
+ doReturn("testString").when(mFragment).getText(anyInt());
+ doReturn("testString").when(mFragment).getString(anyInt());
+ mFragment.setupFooter();
+ verify(mFragment, times(1)).addHelpLink();
+ }
+
private void enableDeviceStateSettableRotationStates(String[] settableStates,
String[] settableStatesDescriptions) {
when(mResources.getStringArray(