Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ed7673ea authored by Abel Tesfaye's avatar Abel Tesfaye
Browse files

Check for available rotation resolver service and camera permission before...

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
parent c0c3bce1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -954,7 +954,7 @@
                <category android:name="com.android.settings.SHORTCUT" />
            </intent-filter>
            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                android:value="@string/rotate_settings_class" />
                android:value="com.android.settings.display.SmartAutoRotatePreferenceFragment" />
            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                android:value="true" />
        </activity>
+0 −2
Original line number Diff line number Diff line
@@ -2713,8 +2713,6 @@
    <!-- Display settings --><skip/>
    <!-- Sound & display settings screen, section header for settings related to display -->
    <string name="display_settings">Display</string>
    <!-- Sound & display settings screen, section header for settings related to display -->
    <string name="rotate_settings_class" translatable="false">com.android.settings.DisplaySettings</string>
    <!-- Sound & display settings screen, accelerometer-based rotation check box label -->
    <string name="accelerometer_title">Auto-rotate screen</string>
    <!-- Sound & display settings screen, locked rotation check box label [CHAR LIMIT=30] -->
+7 −0
Original line number Diff line number Diff line
@@ -20,6 +20,13 @@
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:title="@string/accelerometer_title" >

    <Preference
        android:key="face_rotate_permission"
        android:title="@string/adaptive_sleep_title_no_permission"
        android:summary="@string/adaptive_sleep_summary_no_permission"
        android:icon="@drawable/ic_info_outline_24"
        settings:controller="com.android.settings.display.SmartAutoRotatePermissionController" />

    <SwitchPreference
        android:key="face_based_rotate"
        android:title="@string/auto_rotate_switch_face_based"
+1 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;

// TODO b/180515542 this class is no longer needed on S+
public class AutoRotatePreferenceController extends TogglePreferenceController implements
        PreferenceControllerMixin, Preference.OnPreferenceChangeListener, LifecycleObserver,
        OnResume, OnPause {
+32 −2
Original line number Diff line number Diff line
@@ -17,9 +17,15 @@ package com.android.settings.display;

import static android.provider.Settings.Secure.CAMERA_AUTOROTATE;

import android.Manifest;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.provider.Settings;
import android.service.rotationresolver.RotationResolverService;
import android.text.TextUtils;

import androidx.preference.Preference;

@@ -43,13 +49,17 @@ public class SmartAutoRotateController extends TogglePreferenceController implem

    @Override
    public int getAvailabilityStatus() {
        return !RotationPolicy.isRotationLocked(mContext)
        if (!isRotationResolverServiceAvailable(mContext)) {
            return UNSUPPORTED_ON_DEVICE;
        }
        return !RotationPolicy.isRotationLocked(mContext) && hasSufficientPermission(mContext)
                ? AVAILABLE : DISABLED_DEPENDENT_SETTING;
    }

    @Override
    public boolean isChecked() {
        return Settings.Secure.getInt(mContext.getContentResolver(),
        return hasSufficientPermission(mContext) && Settings.Secure.getInt(
                mContext.getContentResolver(),
                CAMERA_AUTOROTATE, 0) == 1;
    }

@@ -62,4 +72,24 @@ public class SmartAutoRotateController extends TogglePreferenceController implem
                isChecked ? 1 : 0);
        return true;
    }

    static boolean isRotationResolverServiceAvailable(Context context) {
        final PackageManager packageManager = context.getPackageManager();
        final String resolvePackage = packageManager.getRotationResolverPackageName();
        if (TextUtils.isEmpty(resolvePackage)) {
            return false;
        }
        final Intent intent = new Intent(RotationResolverService.SERVICE_INTERFACE).setPackage(
                resolvePackage);
        final ResolveInfo resolveInfo = packageManager.resolveService(intent,
                PackageManager.MATCH_SYSTEM_ONLY);
        return resolveInfo != null && resolveInfo.serviceInfo != null;
    }

    static boolean hasSufficientPermission(Context context) {
        final PackageManager packageManager = context.getPackageManager();
        final String rotationPackage = packageManager.getRotationResolverPackageName();
        return rotationPackage != null && packageManager.checkPermission(
                Manifest.permission.CAMERA, rotationPackage) == PackageManager.PERMISSION_GRANTED;
    }
}
Loading