Android13 允许桌面自动旋转

一)需求-场景

Android13 实现允许桌面自动旋转
Android13 版本开始后,支持屏幕自动旋转,优化体验和兼容性,适配不同屏幕 主界面可自动旋转

在这里插入图片描述

二)参考资料

android framework13-launcher3【06手机旋转问题】
Launcher默认支持旋转
Launcher默认支持旋转
Launcher3 布局
Launcher3 版本变化
展讯Android9.0 Launcher 简介:

三)遇到问题

定制化屏幕旋转遇到两个核心问题

  • 屏幕自动旋转后,最近历史任务并没有旋转,方向异常。
  • 定制的好多案子,比如平板产品中旋转没有问题,但是好多手机方案新品来做平板产品。就遇到好多问题了,当成手机了,需要默认为平板。无法解决最近历史任务异常问题。
  • 在GMS 产品中,是存在配置是存在覆盖问题的。

四) 修改点

/packages/apps/Launcher3/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
/packages/apps/Launcher3/src/com/android/launcher3/states/RotationHelper.java
/packages/apps/Launcher3/src/com/android/launcher3/util/window/WindowManagerProxy.java

/packages/apps/Launcher3/quickstep/res/xml/indexable_launcher_prefs.xml 
/packages/apps/Launcher3/res/xml/launcher_preferences.xml
/vendor/google/apps/SearchLauncher/res/xml/launcher_preferences.xm

备注:仅针对大多数产品,各家平台需要根据自己的实际产品类型和方案类型来实际更改。思路是没问题的

五)属性Launcher3 种类及构成

为什么要了解这个,一方面搞清楚源码里面好多个Launcher,或者 Launcher 相关的究竟是什么。特别是GMS 版本,需要怎么改,不然改了还是会覆盖的。【暂不分析源码配置哪个Launcher】
总之:如果是GMS项目,先搞清楚自己Launcher构成,如何组合编译的,然后配置相关的建议都修改。
在这里插入图片描述

六)实现方案

主要解决三个问题:

修改默认配置,自动旋转改为true

/packages/apps/Launcher3/res/xml/launcher_preferences.xml
/vendor/google/apps/SearchLauncher/res/xml/launcher_preferences.xm

defaultValue 默认值改为ture 

 <SwitchPreference
        android:key="pref_allowRotation"
        android:title="@string/allow_rotation_title"
        android:summary="@string/allow_rotation_desc"
        android:defaultValue="false"
        android:persistent="true"
        launcher:logIdOn="615"
        launcher:logIdOff="616" />

 <SwitchPreference
        android:key="pref_allowRotation"
        android:title="@string/allow_rotation_title"
        android:summary="@string/allow_rotation_desc"
        android:defaultValue="false"
        android:persistent="true" />

RecentsOrientedState 允许桌面旋转设置

直接设置为true

  private void updateHomeRotationSetting() {
        boolean homeRotationEnabled = true;//mSharedPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY, true);//huanghb modify
        setFlag(FLAG_HOME_ROTATION_ALLOWED_IN_PREFS, homeRotationEnabled);
        SystemUiProxy.INSTANCE.get(mContext).setHomeRotationEnabled(homeRotationEnabled);
    }

手机方案适配平板方案,模拟为平板方案

RotationHelper.java getAllowRotationDefaultValue 判断当前是否允许旋转,不用计算,直接返回 true


    /**
     * Returns the default value of {@link #ALLOW_ROTATION_PREFERENCE_KEY} preference.
     */
    public static boolean getAllowRotationDefaultValue(DeviceProfile deviceProfile) {
        // If the device's pixel density was scaled (usually via settings for A11y), use the
        // original dimensions to determine if rotation is allowed of not.
        float originalSmallestWidth = dpiFromPx(
                Math.min(deviceProfile.widthPx, deviceProfile.heightPx), DENSITY_DEVICE_STABLE);
        return true;
    }

WindowManagerProxy.java 判断当前是平板的的判断。

public static final int MIN_TABLET_WIDTH = 1

        boolean isTablet = swDp >= MIN_TABLET_WIDTH;
        boolean isTablet = config.smallestScreenWidthDp > MIN_TABLET_WIDTH;
这样在判断的时候,就直接以平板的方式来判断了,就满足自动旋转要求了。


分享部分git 修改记录



diff --git a/packages/apps/Launcher3/quickstep/res/xml/indexable_launcher_prefs.xml b/packages/apps/Launcher3/quickstep/res/xml/indexable_launcher_prefs.xml
old mode 100644
new mode 100755
index b4740e5..aa1fd4d
--- a/packages/apps/Launcher3/quickstep/res/xml/indexable_launcher_prefs.xml
+++ b/packages/apps/Launcher3/quickstep/res/xml/indexable_launcher_prefs.xml
@@ -26,7 +26,7 @@
         android:key="pref_allowRotation"
         android:title="@string/allow_rotation_title"
         android:summary="@string/allow_rotation_desc"
-        android:defaultValue="false"
+        android:defaultValue="true"
         android:persistent="true" />
 
 </PreferenceScreen>
diff --git a/packages/apps/Launcher3/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java b/packages/apps/Launcher3/quickstep/src/com/android/quickstep/util/RecentsOrientedState.jav
old mode 100644
new mode 100755
index 6038a22..76dd118
--- a/packages/apps/Launcher3/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
+++ b/packages/apps/Launcher3/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
@@ -291,7 +291,7 @@ public class RecentsOrientedState implements
     }
 
     private void updateHomeRotationSetting() {
-        boolean homeRotationEnabled = mSharedPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY, false);
+        boolean homeRotationEnabled = true;//mSharedPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY, true);//huanghb modify
         setFlag(FLAG_HOME_ROTATION_ALLOWED_IN_PREFS, homeRotationEnabled);
         SystemUiProxy.INSTANCE.get(mContext).setHomeRotationEnabled(homeRotationEnabled);
     }
diff --git a/packages/apps/Launcher3/res/xml/launcher_preferences.xml b/packages/apps/Launcher3/res/xml/launcher_preferences.xml
old mode 100644
new mode 100755
index 8a0c909..171eeb2
--- a/packages/apps/Launcher3/res/xml/launcher_preferences.xml
+++ b/packages/apps/Launcher3/res/xml/launcher_preferences.xml
@@ -45,7 +45,7 @@
         android:key="pref_allowRotation"
         android:title="@string/allow_rotation_title"
         android:summary="@string/allow_rotation_desc"
-        android:defaultValue="false"
+        android:defaultValue="true"
         android:persistent="true"
         launcher:logIdOn="615"
         launcher:logIdOff="616" />
diff --git a/packages/apps/Launcher3/src/com/android/launcher3/states/RotationHelper.java b/packages/apps/Launcher3/src/com/android/launcher3/states/RotationHelper.java
old mode 100644
new mode 100755
index 38b62d4..bf88c9d
--- a/packages/apps/Launcher3/src/com/android/launcher3/states/RotationHelper.java
+++ b/packages/apps/Launcher3/src/com/android/launcher3/states/RotationHelper.java
@@ -49,7 +49,7 @@ public class RotationHelper implements OnSharedPreferenceChangeListener,
         // original dimensions to determine if rotation is allowed of not.
         float originalSmallestWidth = dpiFromPx(
                 Math.min(deviceProfile.widthPx, deviceProfile.heightPx), DENSITY_DEVICE_STABLE);
-        return originalSmallestWidth >= MIN_TABLET_WIDTH;
+        return true;
     }
 
     public static final int REQUEST_NONE = 0;
diff --git a/packages/apps/Launcher3/src/com/android/launcher3/util/window/WindowManagerProxy.java b/packages/apps/Launcher3/src/com/android/launcher3/util/window/WindowManagerProxy.java
old mode 100644
new mode 100755
index 9665bf9..d81565c
--- a/packages/apps/Launcher3/src/com/android/launcher3/util/window/WindowManagerProxy.java
+++ b/packages/apps/Launcher3/src/com/android/launcher3/util/window/WindowManagerProxy.java
@@ -61,7 +61,7 @@ import com.android.launcher3.util.WindowBounds;
  */
 public class WindowManagerProxy implements ResourceBasedOverride {
 
-    public static final int MIN_TABLET_WIDTH = 600;
+    public static final int MIN_TABLET_WIDTH = 1;//huanghb modify
 
     public static final MainThreadInitializedObject<WindowManagerProxy> INSTANCE =
             forOverride(WindowManagerProxy.class, R.string.window_manager_proxy_class);
diff --git a/vendor/google/apps/SearchLauncher/res/xml/launcher_preferences.xml b/vendor/google/apps/SearchLauncher/res/xml/launcher_preferences.xml
old mode 100644
new mode 100755
index a70bb30..f95219b
--- a/vendor/google/apps/SearchLauncher/res/xml/launcher_preferences.xml
+++ b/vendor/google/apps/SearchLauncher/res/xml/launcher_preferences.xml
@@ -50,7 +50,7 @@
         android:title="@string/title_show_google_app"/>
 
     <SwitchPreference
-        android:defaultValue="false"
+        android:defaultValue="true"
         android:key="pref_allowRotation"
         android:persistent="true"
         android:summary="@string/allow_rotation_desc"
(END)







七)总结:

如需要解决的问题一样
1)更改配置
2)解决最近历史任务允许旋转设置
3)把产品当做pad 来,判断是否pad 地方判断,更改逻辑判断条件实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928251.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Goland2024.3 发布,有点东西

好多人夸我嘴甜&#xff0c;你要不要尝尝~ 上周&#xff0c;Goland2024 年最后的一个大版本正式发布了。 虽然这次的更新并不是很丰富&#xff0c;但是仍然有几个值得我们关注的几个亮点。 第一个&#xff0c;支持循环导入的检查 循环导入的出现往往是不经意的&#xff0c;但是…

数据结构之算法复杂度(超详解)

文章目录 1. 算法复杂度1.1 数据结构1.2 算法1.3 二者的重要性 2. 算法效率开胃小菜&#xff1a;复杂度概念 3. 时间复杂度3.1 大O表示法3.2 时间复杂度示例练习例1例2例3例4例5例6例7 4. 空间复杂度4.1 空间复杂度示例练习例1例2 5. 开胃小菜扩展5.1 思路2&#xff1a;采用空间…

【C++笔记】map和set的使用

【C笔记】map和set的深度剖析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】map和set的深度剖析前言一.set1.1 序列式容器和关联式容器1.2 set系列的使用1.3 set类的介绍1.4 set的构造和迭代器1.5 set的增删查1.6…

最新AI自动无人智享直播系统 —— 视频自动播软件热门之选

在当今数字化浪潮汹涌澎湃的时代&#xff0c;直播行业正经历着前所未有的变革与创新。而最新的 AI 自动无人智享直播系统&#xff0c;无疑成为了视频自动播软件中的热门之选&#xff0c;正引领着直播领域迈向新的高度。 这款 AI 自动无人智享直播系统&#xff0c;其核心优势在于…

气膜球幕:科技与艺术的完美融合,沉浸式体验引领未来—轻空间

在现代化展览和活动中&#xff0c;如何突破传统展示方式&#xff0c;吸引观众的目光&#xff0c;带来前所未有的沉浸式体验&#xff1f;气膜球幕作为一种创新的科技展示平台&#xff0c;凭借其独特的球形结构和多功能应用&#xff0c;正在成为各大展览、活动和娱乐项目的首选。…

计算机视觉硬件知识点整理六:工业相机选型

文章目录 前言一、工业数字相机的分类二、相机的主要参数三、工业数字摄像机主要接口类型四、选择工业相机的考量因素六、实例分析 前言 随着科技的不断进步&#xff0c;工业自动化领域正经历着前所未有的变革。作为工业自动化的重要组成部分&#xff0c;工业相机在工业检测、…

Mysql读写分离分库分表

读写分离 什么是读写分离 读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。 这样的话&#xff0c;就能够小幅提升写性能&#xff0c;大幅提升读性能。一般情况下&#xff0c;我们都会选择一主多从&#xff0c;也就是一台主数据库负责写&#xff0c;其他的从…

【C语言】结构体(四)

本篇重点是typedef关键字 一&#xff0c;是什么&#xff1f; typedef用来定义新的数据类型&#xff0c;通常typedef与结构体的定义配合使用。 简单来说就是取别名 ▶ struct 是用来定义新的数据类型——结构体 ▶ typedef是给数据类型取别名。 二&#xff0c;为什么&#xf…

普中51单片机——LED流水灯模块

1、GPIO概念 GPIO&#xff08;general purpose intput output&#xff09;是通用输入输出端口的简称&#xff0c;可以通过软件来控制其输入和输出。51 单片机芯片的 GPIO 引脚与外部设备连接起来&#xff0c;从而实现与外部通讯、 控制以及数据采集的功能。 1.1、GPIO分类 &a…

Linux入门系列--压缩与解压

一、前言 为了使传输的文件大小尽可能地小&#xff0c;我们采用压缩的方式生成压缩文件&#xff0c;然后将压缩包传输过去就可以了。衡量压缩方法地好坏主要有两点综合考量&#xff1a;一是压缩速度&#xff0c;二是压缩程度。很好理解&#xff0c;压缩一个文件&#xff0c;我…

云服务器重装系统后 一些报错与解决[ vscode / ssh / 子用户]

碰见的三个问题&#xff1a; 1.vscode连接失败 2.登录信息配置 3.新建子用户的一些设置 思考&#xff1a;遇见问题&#xff0c;第一反应 应该如何解决 目录 1. 错误 解决方法 原因 步骤 1&#xff1a;找到known_hosts文件并编辑 步骤 2&#xff1a;通过VSCode终端输入…

【包教包会】CocosCreator3.x——重写Sprite,圆角、3D翻转、纹理循环、可合批调色板、不影响子节点的位移旋转缩放透明度

一、效果演示 重写Sprite组件&#xff0c;做了以下优化&#xff1a; 1、新增自变换&#xff0c;在不影响子节点的前提下位移、旋转、缩放、改变透明度 新增可合批调色板&#xff0c;支持色相、明暗调节 新增圆角矩形、3D透视旋转、纹理循环 所有功能均支持合批、原生平台&…

南昌榉之乡托养机构解读:自闭症与看电视并无必然联系

在探讨自闭症的成因时&#xff0c;有人会问&#xff1a;自闭症是多看电视引起的吗&#xff1f;今天&#xff0c;就让我们来看看南昌榉之乡托养机构对此有何见解。 榉之乡大龄自闭症托养机构在江苏、广东、江西等地都有分校&#xff0c;一直致力于为大龄自闭症患者提供专业的支持…

卷积神经网络(CNN)的层次结构

卷积神经网络&#xff08;CNN&#xff09;是一种以其处理图像和视频数据的能力而闻名的深度学习模型&#xff0c;其基本结构通常包括以下几个层次&#xff0c;每个层次都有其特定的功能和作用&#xff1a; 1. 输入层&#xff08;Input Layer&#xff09;&#xff1a; 卷积神经网…

Milvus×OPPO:如何构建更懂你的大模型助手

01. 背景 AI业务快速增长下传统关系型数据库无法满足需求。 2024年恰逢OPPO品牌20周年&#xff0c;OPPO也宣布正式进入AI手机的时代。超千万用户开始通过例如通话摘要、新小布助手、小布照相馆等搭载在OPPO手机上的应用体验AI能力。 与传统的应用不同的是&#xff0c;在AI驱动的…

数据结构之二叉树详解:从原理到实现

1. 什么是二叉树&#xff1f; 二叉树&#xff08;Binary Tree&#xff09;是一种树形数据结构&#xff0c;其中每个节点最多有两个子节点&#xff0c;分别被称为左子节点和右子节点。二叉树可以用来表示层次关系&#xff0c;如文件目录、组织结构&#xff0c;或用于快速查找、…

CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)

附件 calculate.html <!DOCTYPE html> <html lang"en"> <head><!-- 设置字符编码为 UTF-8&#xff0c;支持多语言字符集 --><meta charset"UTF-8"><!-- 设置响应式视图&#xff0c;确保页面在不同设备上自适应显示 --&…

用于LiDAR测量的1.58um单芯片MOPA(一)

--翻译自M. Faugeron、M. Krakowski1等人2014年的文章 1.简介 如今&#xff0c;人们对高功率半导体器件的兴趣日益浓厚&#xff0c;这些器件主要用于遥测、激光雷达系统或自由空间通信等应用。与固态激光器相比&#xff0c;半导体器件更紧凑且功耗更低&#xff0c;这在低功率供…

【maven-5】Maven 项目构建的生命周期:深入理解与应用

1. 生命周期是什么 ​在Maven出现之前&#xff0c;项目构建的生命周期就已经存在&#xff0c;软件开发人员每天都在对项目进行清理&#xff0c;编译&#xff0c;测试及部署。虽然大家都在不停地做构建工作&#xff0c;但公司和公司间&#xff0c;项目和项目间&#xff0c;往往…

数字时代的文化宝库:存储技术与精神生活

文章目录 1. 文学经典的数字传承2. 音乐的无限可能3. 影视艺术的数字化存储4. 结语 数字时代的文化宝库&#xff1a;存储技术与精神生活 在数字化的浪潮中&#xff0c;存储技术如同一座桥梁&#xff0c;连接着过去与未来&#xff0c;承载着人类文明的瑰宝。随着存储容量的不断增…