diff --git a/res/values/strings.xml b/res/values/strings.xml index cfcb62e000c..462c6774876 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -98,10 +98,10 @@ Make larger - Use Auto-rotate + Use auto-rotate - Face Detection uses the front-facing camera to improve Auto-rotate accuracy. Images are never stored or sent to Google. + Face Detection uses the front-facing camera to improve auto-rotate accuracy. Images are never stored or sent to Google. Sample text @@ -2926,7 +2926,11 @@ On - Face-based - Enable Face Detection + Face Detection + + Automatically adjust the screen orientation when you move your phone between portrait and landscape + + Learn more about auto-rotate Screen resolution @@ -12453,6 +12457,9 @@ + + + diff --git a/res/xml/auto_rotate_settings.xml b/res/xml/auto_rotate_settings.xml index 0c120d68fff..38aa5f0047e 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" > + + + + + settings:searchable="false"/> diff --git a/src/com/android/settings/display/AutoRotateSwitchBarController.java b/src/com/android/settings/display/AutoRotateSwitchBarController.java index 48dedfd1fa3..d76104aef7f 100644 --- a/src/com/android/settings/display/AutoRotateSwitchBarController.java +++ b/src/com/android/settings/display/AutoRotateSwitchBarController.java @@ -18,86 +18,78 @@ package com.android.settings.display; 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 9fda03c4d5f..1b4e998db87 100644 --- a/src/com/android/settings/display/SmartAutoRotatePreferenceFragment.java +++ b/src/com/android/settings/display/SmartAutoRotatePreferenceFragment.java @@ -20,7 +20,7 @@ import static com.android.settings.display.SmartAutoRotateController.isRotationR 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 android.view.ViewGroup; 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 @@ public class SmartAutoRotatePreferenceFragment extends DashboardFragment { 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 @@ public class SmartAutoRotatePreferenceFragment extends DashboardFragment { 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 @@ public class SmartAutoRotatePreferenceFragment extends DashboardFragment { 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 @@ public class SmartAutoRotatePreferenceFragment extends DashboardFragment { 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 942fed6f619..e5374196681 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.SettingsActivity; 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 @@ public class SmartAutoRotatePreferenceFragmentTest { private SmartAutoRotatePreferenceFragment mFragment; - private SettingsMainSwitchBar mSwitchBar; - @Mock private PackageManager mPackageManager; @@ -87,6 +85,9 @@ public class SmartAutoRotatePreferenceFragmentTest { private Resources mResources; private Context mContext; + @Mock + private Preference mRotateMainSwitchPreference; + @Before public void setUp() { MockitoAnnotations.initMocks(this); @@ -112,21 +113,21 @@ public class SmartAutoRotatePreferenceFragmentTest { 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 @@ public class SmartAutoRotatePreferenceFragmentTest { mFragment.createHeader(mActivity); - verify(mSwitchBar, never()).show(); + verify(mRotateMainSwitchPreference, times(1)).setVisible(false); verify(mRotateSwitchPreference, never()).setVisible(false); } @@ -147,7 +148,7 @@ public class SmartAutoRotatePreferenceFragmentTest { mFragment.createHeader(mActivity); - verify(mSwitchBar, never()).show(); + verify(mRotateMainSwitchPreference, times(1)).setVisible(false); verify(mRotateSwitchPreference, never()).setVisible(false); } @@ -176,6 +177,19 @@ public class SmartAutoRotatePreferenceFragmentTest { 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(