From ed7673eadd314c98ea6727e5e0cf360835a9663d Mon Sep 17 00:00:00 2001 From: Abel Tesfaye Date: Thu, 11 Feb 2021 01:25:49 +0000 Subject: [PATCH] Check for available rotation resolver service and camera permission before showing setting for face based auto-rotation Test: locally with crosshatch & make -j64 RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings.display.SmartAutoRotateControllerTest" Bug: 172857585 Change-Id: I825b0c2471c71a3de59532b39a47c5442f234fb5 --- AndroidManifest.xml | 2 +- res/values/strings.xml | 2 - res/xml/auto_rotate_settings.xml | 7 ++ .../AutoRotatePreferenceController.java | 1 + .../display/SmartAutoRotateController.java | 34 ++++- .../SmartAutoRotatePermissionController.java | 63 ++++++++++ .../SmartAutoRotatePreferenceFragment.java | 54 ++------ .../SmartAutoRotateControllerTest.java | 117 ++++++++++++++++++ 8 files changed, 234 insertions(+), 46 deletions(-) create mode 100644 src/com/android/settings/display/SmartAutoRotatePermissionController.java create mode 100644 tests/robotests/src/com/android/settings/display/SmartAutoRotateControllerTest.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ee11802232f..3bd481519f0 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -954,7 +954,7 @@ + android:value="com.android.settings.display.SmartAutoRotatePreferenceFragment" /> diff --git a/res/values/strings.xml b/res/values/strings.xml index 1ac3a281f6a..9e99251929b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2713,8 +2713,6 @@ Display - - com.android.settings.DisplaySettings Auto-rotate screen diff --git a/res/xml/auto_rotate_settings.xml b/res/xml/auto_rotate_settings.xml index dfa31f71aaa..a316b8fb29f 100644 --- a/res/xml/auto_rotate_settings.xml +++ b/res/xml/auto_rotate_settings.xml @@ -20,6 +20,13 @@ xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/accelerometer_title" > + + createPreferenceControllers(Context context) { - return buildPreferenceControllers(context); - } - - private static List buildPreferenceControllers( - Context context) { - final List controllers = new ArrayList<>(); - controllers.add( - new SmartAutoRotatePreferenceController(context, SMART_AUTO_ROTATE_CONTROLLER_KEY)); - return controllers; - } - @Override protected String getLogTag() { return TAG; } public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider(R.xml.auto_rotate_settings) { - - @Override - public List createPreferenceControllers( - Context context) { - return buildPreferenceControllers(context); - } - - @Override - protected boolean isPageSearchEnabled(Context context) { - return false; - } - }; + new BaseSearchIndexProvider(R.xml.auto_rotate_settings); } diff --git a/tests/robotests/src/com/android/settings/display/SmartAutoRotateControllerTest.java b/tests/robotests/src/com/android/settings/display/SmartAutoRotateControllerTest.java new file mode 100644 index 00000000000..2d56c0efd88 --- /dev/null +++ b/tests/robotests/src/com/android/settings/display/SmartAutoRotateControllerTest.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2021 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.display; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING; +import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; + +import android.Manifest; +import android.content.ContentResolver; +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; +import android.os.UserHandle; +import android.provider.Settings; + +import androidx.preference.Preference; + +import com.android.settings.testutils.ResolveInfoBuilder; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class SmartAutoRotateControllerTest { + + private static final String PACKAGE_NAME = "package_name"; + + private SmartAutoRotateController mController; + @Mock + private PackageManager mPackageManager; + @Mock + private Preference mPreference; + private ContentResolver mContentResolver; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + final Context context = Mockito.spy(RuntimeEnvironment.application); + mContentResolver = RuntimeEnvironment.application.getContentResolver(); + when(context.getPackageManager()).thenReturn(mPackageManager); + when(context.getContentResolver()).thenReturn(mContentResolver); + doReturn(PACKAGE_NAME).when(mPackageManager).getRotationResolverPackageName(); + doReturn(PackageManager.PERMISSION_GRANTED).when(mPackageManager).checkPermission( + Manifest.permission.CAMERA, PACKAGE_NAME); + mController = new SmartAutoRotateController(context, "test_key"); + doReturn(mController.getPreferenceKey()).when(mPreference).getKey(); + + final ResolveInfo resolveInfo = new ResolveInfoBuilder(PACKAGE_NAME).build(); + resolveInfo.serviceInfo = new ServiceInfo(); + when(mPackageManager.resolveService(any(), anyInt())).thenReturn(resolveInfo); + enableAutoRotation(); + } + + @Test + public void getAvailabilityStatus_returnAvailable() { + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); + } + + @Test + public void getAvailabilityStatus_resolveInfoIsNull_returnUnsupportedOnDevice() { + when(mPackageManager.resolveService(any(), anyInt())).thenReturn(null); + assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); + } + + @Test + public void getAvailabilityStatus_noCameraPermission_returnDisableDependentSetting() { + doReturn(PackageManager.PERMISSION_DENIED).when(mPackageManager).checkPermission( + Manifest.permission.CAMERA, PACKAGE_NAME); + + assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_DEPENDENT_SETTING); + } + + @Test + public void getAvailabilityStatus_rotationLocked_returnDisableDependentSetting() { + disableAutoRotation(); + assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_DEPENDENT_SETTING); + } + + private void enableAutoRotation() { + Settings.System.putIntForUser(mContentResolver, + Settings.System.ACCELEROMETER_ROTATION, 1, UserHandle.USER_CURRENT); + } + + private void disableAutoRotation() { + Settings.System.putIntForUser(mContentResolver, + Settings.System.ACCELEROMETER_ROTATION, 0, UserHandle.USER_CURRENT); + } +}