Android设备添加一个旋转屏幕开关(Android 10)

2022-03-03  本文已影响0人  gale_小米

客制需求:Android 10 设备添加一个旋转屏幕开关,设备没有装重力感应,所以不能自动旋转屏幕;

1.参考系统自动旋转屏幕:添加一个SwitchPreference ,和对应的控制器RotateScreenPreferenceController
2.声明:persist.sys.user_rotation 属性来记录旋转状态;

Index: android/device/softwinner/ceres-b3/overlay/packages/apps/Settings/res/xml/display_settings.xml
===================================================================
--- android/device/softwinner/ceres-b3/overlay/packages/apps/Settings/res/xml/display_settings.xml
+++ android/device/softwinner/ceres-b3/overlay/packages/apps/Settings/res/xml/display_settings.xml
@@ -53,8 +53,13 @@
         settings:useAdminDisabledSummary="true"
         settings:controller="com.android.settings.display.WallpaperPreferenceController">
     </com.android.settingslib.RestrictedPreference>
+     <!--    -->
+    <SwitchPreference
+        android:key="rotate_screen"
+        android:title="@string/rotate_screen_title"
+        android:summary="@string/keywords_auto_rotate1"
+        settings:controller="com.android.settings.display.RotateScreenPreferenceController" />
 
-
     <SwitchPreference
         android:key="dark_ui_mode"
         android:title="@string/dark_ui_mode"
Index: android/device/softwinner/ceres-c3/overlay/packages/apps/Settings/res/xml/display_settings.xml

@@ -270,6 +270,7 @@
 # set primary display orientation to 270
 PRODUCT_PROPERTY_OVERRIDES += \
     ro.surface_flinger.primary_display_orientation=ORIENTATION_$(SPRODUCT_SW_ROTATION) \
+    persist.sys.user_rotation=3
 
 PRODUCT_SYSTEM_DEFAULT_PROPERTIES += \
     ro.minui.default_rotation=ROTATION_$(shell _a=(NONE RIGHT DOWN LEFT); _i=$$((($(SPRODUCT_SW_ROTATION)+0)/90)); echo -n $${_a[$$_i]}) \
Index: android/packages/apps/Settings/src/com/android/settings/display/RotateScreenPreferenceController.java
===================================================================
--- android/packages/apps/Settings/src/com/android/settings/display/RotateScreenPreferenceController.java
+++ android/packages/apps/Settings/src/com/android/settings/display/RotateScreenPreferenceController.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2016 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 android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.text.TextUtils;
+
+import androidx.preference.Preference;
+
+import android.util.Log;
+import com.android.internal.view.RotationPolicy;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnPause;
+import com.android.settingslib.core.lifecycle.events.OnResume;
+import android.os.SystemProperties;
+
+public class RotateScreenPreferenceController extends TogglePreferenceController implements
+        PreferenceControllerMixin, Preference.OnPreferenceChangeListener, LifecycleObserver,
+        OnResume, OnPause {
+
+    private Preference mPreference;
+    private static final String TAG = "RotateScreenPreferenceController";
+    private static final String ROTATE_SCREEN_KEY =
+            "persist.sys.user_rotation";
+
+    public RotateScreenPreferenceController(Context context, String key) {
+        super(context, key);
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        mPreference = preference;
+        super.updateState(preference);
+    }
+
+    @Override
+    public void onResume() {
+    }
+
+    @Override
+    public void onPause() {
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public boolean isSliceable() {
+        return TextUtils.equals(getPreferenceKey(), "rotate_screen");
+    }
+
+    @Override
+    public boolean isChecked() {
+        int rotation = SystemProperties.getInt(ROTATE_SCREEN_KEY, 3);
+        Log.w(TAG, "rotation="+rotation);
+        return rotation ==0;
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        RotationPolicy.setRotation(mContext,isChecked);
+        return true;
+    }
+}

Property changes on: android/packages/apps/Settings/src/com/android/settings/display/RotateScreenPreferenceController.java
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: android/packages/apps/Settings/res/values-zh-rCN/strings.xml
===================================================================
--- android/packages/apps/Settings/res/values-zh-rCN/strings.xml
+++ android/packages/apps/Settings/res/values-zh-rCN/strings.xml
@@ -3162,6 +3162,8 @@
     <string name="keywords_display_auto_brightness" msgid="4561771351118904241">"降低屏幕亮度, 触摸屏, 电池, 智能亮度, 动态亮度, 自动调节亮度"</string>
     <string name="keywords_display_adaptive_sleep" msgid="6865504720946121402">"调暗屏幕, 休眠, 电池, 超时, 感知, 显示, 屏幕, 闲置"</string>
     <string name="keywords_auto_rotate" msgid="5620879898668211494">"旋转, 翻转, 纵向, 横向, 屏幕方向, 垂直, 水平"</string>
+    <string name="rotate_screen_title">旋转屏幕</string>
+    <string name="keywords_auto_rotate1">旋转屏幕</string>
     <string name="keywords_system_update_settings" msgid="7752189778843741773">"升级, android"</string>
     <string name="keywords_zen_mode_settings" msgid="6526742836231604995">"勿扰, 时间表, 通知, 屏蔽, 设为静音, 振动, 休眠, 工作, 焦点, 声音, 静音, 日, 工作日, 周末, 工作日晚上, 活动"</string>
     <string name="keywords_screen_timeout" msgid="8161370660970309476">"屏幕, 锁定时间, 超时, 锁屏"</string>
Index: android/packages/apps/Settings/res/xml/display_settings.xml
===================================================================
--- android/packages/apps/Settings/res/xml/display_settings.xml
+++ android/packages/apps/Settings/res/xml/display_settings.xml
@@ -20,7 +20,7 @@
     android:key="display_settings_screen"
     android:title="@string/display_settings"
     settings:keywords="@string/keywords_display"
-    settings:initialExpandedChildrenCount="5">
+    settings:initialExpandedChildrenCount="7">
 
     <com.android.settingslib.RestrictedPreference
         android:key="brightness"
@@ -54,6 +54,12 @@
         settings:controller="com.android.settings.display.WallpaperPreferenceController">
     </com.android.settingslib.RestrictedPreference>
 
+     <!--    -->
+    <SwitchPreference
+        android:key="rotate_screen"
+        android:title="@string/rotate_screen_title"
+        android:summary="@string/keywords_auto_rotate1"
+        settings:controller="com.android.settings.display.RotateScreenPreferenceController" />
 
     <SwitchPreference
         android:key="dark_ui_mode"
Index: android/packages/apps/Settings/res/values-zh-rTW/strings.xml
===================================================================
--- android/packages/apps/Settings/res/values-zh-rTW/strings.xml    
+++ android/packages/apps/Settings/res/values-zh-rTW/strings.xml    
@@ -3162,6 +3162,8 @@
     <string name="keywords_display_auto_brightness" msgid="4561771351118904241">"調暗螢幕, 觸控螢幕, 電池, 智慧型亮度, 動態亮度, 自動亮度"</string>
     <string name="keywords_display_adaptive_sleep" msgid="6865504720946121402">"調暗螢幕, 休眠, 電池, 自動關閉, 感知, 顯示, 螢幕, 閒置"</string>
     <string name="keywords_auto_rotate" msgid="5620879898668211494">"旋轉, 翻轉, 轉動, 直向, 橫向, 螢幕方向, 垂直, 水平"</string>
+    <string name="rotate_screen_title">旋转屏幕</string>
+    <string name="keywords_auto_rotate1">旋转屏幕</string>
     <string name="keywords_system_update_settings" msgid="7752189778843741773">"升級, android"</string>
     <string name="keywords_zen_mode_settings" msgid="6526742836231604995">"零打擾, 時間表, 通知, 封鎖, 靜音, 震動, 休眠, 工作, 焦點, 音效, 忽略, 天, 週間, 週末, 週間晚上, 活動"</string>
     <string name="keywords_screen_timeout" msgid="8161370660970309476">"螢幕, 鎖定時間, 自動關閉, 鎖定螢幕"</string>
Index: android/packages/apps/Settings/res/values-zh-rHK/strings.xml
===================================================================
--- android/packages/apps/Settings/res/values-zh-rHK/strings.xml    
+++ android/packages/apps/Settings/res/values-zh-rHK/strings.xml    
@@ -3160,6 +3160,8 @@
     <string name="keywords_display_auto_brightness" msgid="4561771351118904241">"調暗螢幕, 觸控螢幕, 電池, 智能亮度, 動態亮度, 自動調整亮度"</string>
     <string name="keywords_display_adaptive_sleep" msgid="6865504720946121402">"調暗螢幕, 休眠, 電池, 逾時, 注意, 顯示屏, 螢幕, 閒置"</string>
     <string name="keywords_auto_rotate" msgid="5620879898668211494">"旋轉, 翻轉, 旋轉, 直向, 橫向, 屏幕定向, 垂直, 水平"</string>
+    <string name="rotate_screen_title">旋转屏幕</string>
+    <string name="keywords_auto_rotate1">旋转屏幕</string>
     <string name="keywords_system_update_settings" msgid="7752189778843741773">"升級, Android"</string>
     <string name="keywords_zen_mode_settings" msgid="6526742836231604995">"請勿騷擾, 時間表, 通知, 封鎖, 靜音, 震動, 休眠, 工作, 焦點, 音效, 忽略, 天, 平日, 週末, 平日晚上, 活動"</string>
     <string name="keywords_screen_timeout" msgid="8161370660970309476">"螢幕, 鎖定時間, 逾時, 鎖定螢幕"</string>
Index: android/packages/apps/Settings/res/values/strings.xml
===================================================================
--- android/packages/apps/Settings/res/values/strings.xml   
+++ android/packages/apps/Settings/res/values/strings.xml   
@@ -7392,6 +7392,8 @@
 
     <!-- List of synonyms for the auto rotate (rotate the virtual display when the device rotates) setting, used to match in settings search [CHAR LIMIT=NONE] -->
     <string name="keywords_auto_rotate">rotate, flip, rotation, portrait, landscape, orientation, vertical, horizontal</string>
+    <string name="rotate_screen_title">Rotate screen</string>
+    <string name="keywords_auto_rotate1">rotate screen</string>
 
     <!-- List of synonyms for the System Update (update the operating system) setting, used to match in settings search [CHAR LIMIT=NONE] -->
     <string name="keywords_system_update_settings">upgrade, android</string>
 
Index: android/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/RotationLockControllerImpl.java
===================================================================
--- android/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/RotationLockControllerImpl.java (版本 16247)
+++ android/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/RotationLockControllerImpl.java (版本 16248)
@@ -25,6 +25,8 @@
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
+import android.util.Log;
+import android.os.SystemProperties;
 
 /** Platform implementation of the rotation lock controller. **/
 @Singleton
@@ -40,6 +42,7 @@
             notifyChanged();
         }
     };
+    private static final String TAG = "RotationLockControllerImpl";
 
     @Inject
     public RotationLockControllerImpl(Context context) {
@@ -68,8 +71,12 @@
         RotationPolicy.setRotationLock(mContext, locked);
     }
 
+    private static final String ROTATE_SCREEN_KEY =
+            "persist.sys.user_rotation";
     public void setRotationLockedAtAngle(boolean locked, int rotation){
-        RotationPolicy.setRotationLockAtAngle(mContext, locked, rotation);
+        int rotation_screen = SystemProperties.getInt(ROTATE_SCREEN_KEY, 3);
+        //Log.w(TAG, " setRotationLockedAtAngle rotation_screen="+rotation_screen+",locked="+locked);
+        RotationPolicy.setRotationLockAtAngle(mContext, locked, rotation_screen);
     }
 
     public boolean isRotationLockAffordanceVisible() {
Index: android/frameworks/base/core/java/com/android/internal/view/RotationPolicy.java
===================================================================
--- android/frameworks/base/core/java/com/android/internal/view/RotationPolicy.java
+++ android/frameworks/base/core/java/com/android/internal/view/RotationPolicy.java 
@@ -33,6 +33,7 @@
 import android.view.IWindowManager;
 import android.view.Surface;
 import android.view.WindowManagerGlobal;
+import android.content.Intent;
 
 import com.android.internal.R;
 
@@ -47,9 +48,18 @@
 
     private RotationPolicy() {
     }
+    private static final String ROTATE_SCREEN_KEY =
+            "persist.sys.user_rotation";
 
+
     private static int getNaturalRotation() {
+        /*
         int rotation = SystemProperties.getInt("ro.primary_display.user_rotation", 0);
+        // if (rotation==90) {
+        //    SystemProperties.set(ROTATE_SCREEN_KEY,"1");
+        // }else{
+        //    SystemProperties.set(ROTATE_SCREEN_KEY,"0");
+        // }
         switch (rotation) {
             case 90:
                 return Surface.ROTATION_90;
@@ -61,6 +71,10 @@
                 break;
         }
         return Surface.ROTATION_0;
+        */
+        int rotation = SystemProperties.getInt(ROTATE_SCREEN_KEY, 3);
+        Log.w(TAG, "getNaturalRotation = "+ rotation);
+        return rotation;
     }
 
     /**
@@ -133,6 +147,53 @@
         setRotationLockAtAngle(context, enabled, rotation);
     }
 
+
+    public static void  setRotation(Context context,final boolean enabled){       
+        //Log.e(TAG, " static setRotation enabled="+enabled);
+        if(enabled) {
+                    AsyncTask.execute(new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
+                                wm.freezeRotation(Surface.ROTATION_0);
+                                SystemProperties.set(ROTATE_SCREEN_KEY,"0");
+                            } catch (RemoteException exc) {
+                                Log.w(TAG, "Unable to save auto-rotate setting");
+                            }
+                            int rotation = SystemProperties.getInt(ROTATE_SCREEN_KEY, 0);
+                            //Log.w(TAG, "setRotation rotation="+rotation);
+                        }
+                    });
+                }else {
+                    AsyncTask.execute(new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
+                                //wm.thawRotation();
+                                wm.freezeRotation(Surface.ROTATION_270);
+                                SystemProperties.set(ROTATE_SCREEN_KEY,"3");
+                            } catch (RemoteException exc) {
+                                Log.w(TAG, "Unable to save auto-rotate setting");
+                            }
+                            int rotation = SystemProperties.getInt(ROTATE_SCREEN_KEY, 0);
+                            //Log.w(TAG, "setRotation rotation="+rotation);
+                        }
+                    });
+                }
+
+    }
+
+
+
+    private static void disableAutoRotation(Context context) {
+        Settings.System.putIntForUser(context.getContentResolver(),
+                Settings.System.ACCELEROMETER_ROTATION, 0, UserHandle.USER_CURRENT);
+    }
+
     /**
      * Enables or disables rotation lock at a specific rotation from system UI.
      */
@@ -141,7 +202,7 @@
         Settings.System.putIntForUser(context.getContentResolver(),
                 Settings.System.HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY, 0,
                 UserHandle.USER_CURRENT);
-
+        //Log.w(TAG, "setRotationLockAtAngle rotation="+rotation);
         setRotationLock(enabled, rotation);
     }
 
@@ -170,6 +231,8 @@
                     IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
                     if (params[0]) {
                         wm.freezeRotation(rotation);
+                        //Log.w(TAG, "Unable to save auto-rotate setting rotation="+rotation);
+                        SystemProperties.set(ROTATE_SCREEN_KEY,""+rotation);
                     } else {
                         wm.thawRotation();
                     }

 
Index: android/frameworks/base/services/core/java/com/android/server/wm/DisplayRotation.java
===================================================================
--- android/frameworks/base/services/core/java/com/android/server/wm/DisplayRotation.java   
+++ android/frameworks/base/services/core/java/com/android/server/wm/DisplayRotation.java
@@ -551,9 +551,10 @@
         final boolean deskDockEnablesAccelerometer =
                 mDisplayPolicy.isDeskDockEnablesAccelerometer();
 
-        int user_rotation = SystemProperties.getInt("ro.primary_display.user_rotation", 0);
-        int defaultRotation = Surface.ROTATION_0;
+        //int user_rotation = SystemProperties.getInt("ro.primary_display.user_rotation", 0);
+        int defaultRotation = SystemProperties.getInt("persist.sys.user_rotation", 3);
         final int preferredRotation;
+        /*
         switch (user_rotation) {
             case 90:
                 defaultRotation = Surface.ROTATION_90;
@@ -566,7 +567,7 @@
                 break;
             default:
                 break;
-        }
+        }*/
         if (!isDefaultDisplay) {
             // For secondary displays we ignore things like displays sensors, docking mode and
             // rotation lock, and always prefer user rotation.
Index: android/frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java
===================================================================
--- android/frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java
+++ android/frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java    
@@ -909,7 +909,9 @@
                 * mDisplayMetrics.densityDpi / DENSITY_DEFAULT;
         isDefaultDisplay = mDisplayId == DEFAULT_DISPLAY;
         if (isDefaultDisplay) {
-            int user_rotation = SystemProperties.getInt("ro.primary_display.user_rotation", 0);
+            //int user_rotation = SystemProperties.getInt("ro.primary_display.user_rotation", 0);
+            mRotation = SystemProperties.getInt("persist.sys.user_rotation", 3);
+            /*
             switch (user_rotation) {
                 case 90:
                     mRotation = ROTATION_90;
@@ -922,7 +924,7 @@
                     break;
                 default:
                     break;
-            }
+            }*/
         }
 
         mNaturalRotation = mRotation;
Index: android/frameworks/base/core/java/android/hardware/SystemSensorManager.java
===================================================================
--- android/frameworks/base/core/java/android/hardware/SystemSensorManager.java (版本 16279)
+++ android/frameworks/base/core/java/android/hardware/SystemSensorManager.java (版本 16280)
@@ -787,7 +787,8 @@
             mListener = listener;
             if (listener != null && listener.toString().startsWith("android.hardware.cts.helpers")) {
                 isCtsTest = true;
-                user_rotation = android.os.SystemProperties.getInt("ro.primary_display.user_rotation", 0);
+                //user_rotation = android.os.SystemProperties.getInt("ro.primary_display.user_rotation", 0);
+                user_rotation = android.os.SystemProperties.getInt("persist.sys.user_rotation", 3);
             }
         }
 
@@ -831,15 +832,15 @@
             // Copy from the values array.
             System.arraycopy(values, 0, t.values, 0, t.values.length);
             if (isCtsTest && sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
-                if (user_rotation == 90) {
+                if (user_rotation == 1) {
                     float tmp = -t.values[1];
                     t.values[1] = t.values[0];
                     t.values[0] = tmp;
-                } else if (user_rotation == 270) {
+                } else if (user_rotation == 3) {
                     float tmp = -t.values[0];
                     t.values[0] = t.values[1];
                     t.values[1] = tmp;
-                } else if (user_rotation == 180) {
+                } else if (user_rotation == 2) {
                     t.values[0] = -t.values[0];
                     t.values[1] = -t.values[1];
                 }



上一篇下一篇

猜你喜欢

热点阅读