Android 13.0 改为平板模式-并且不改变Launcher和SystemUI

介绍

Android 13上是可以根据dpi来判断机器是平板模式还是手机模式,我的设备分辨率是2000x1200,当我们利用 adb shell -> wm density 获取当前dpi然后执行 wm density 320会发现Launcher发生了变化,此时会有布局改变以及锁屏改变,还有hotseat显示不全,导航栏变小靠右等问题,所以我们的思路是在变为平板模式后不要让Launcher和SystemUI改变即可。

改完后我们还需验证下QQ和微信是否为平板模式

修改

ProjectConfig.mk

#density

FREEME_DEVICE_LCD_DENSITY = 320

路径:vendor/mediatek/proprietary/packages/apps/Launcher3/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java

    private void recreateTaskbar() {
        destroyExistingTaskbar();

        DeviceProfile dp =
                mUserUnlocked ? LauncherAppState.getIDP(mContext).getDeviceProfile(mContext) : null;
        //*/soda water.20230906 Tablet mode
        boolean isTaskBarEnabled = false;
        /*/
        boolean isTaskBarEnabled = dp != null && dp.isTaskbarPresent;
        //*/
        if (!isTaskBarEnabled) {
            SystemUiProxy.INSTANCE.get(mContext)
                    .notifyTaskbarStatus(/* visible */ false, /* stashed */ false);
            return;
        }

路径:vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/util/DisplayController.java

        public boolean isTablet(WindowBounds bounds) {
            //*/soda water.20230906 Tablet mode
            return false;
            /*/
            return smallestSizeDp(bounds) >= MIN_TABLET_WIDTH;
            //*/
        }

路径:vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/util/window/WindowManagerProxy.java

    public WindowInsets normalizeWindowInsets(Context context, WindowInsets oldInsets,
            Rect outInsets) {
        if (!Utilities.ATLEAST_R || !mTaskbarDrawnInProcess) {
            outInsets.set(oldInsets.getSystemWindowInsetLeft(), oldInsets.getSystemWindowInsetTop(),
                    oldInsets.getSystemWindowInsetRight(), oldInsets.getSystemWindowInsetBottom());
            return oldInsets;
        }

        WindowInsets.Builder insetsBuilder = new WindowInsets.Builder(oldInsets);
        Insets navInsets = oldInsets.getInsets(WindowInsets.Type.navigationBars());

        Resources systemRes = context.getResources();
        Configuration config = systemRes.getConfiguration();
         
        //*/soda water.20230906 Tablet mode
        boolean isTablet = false;
        /*/
        boolean isTablet = config.smallestScreenWidthDp > MIN_TABLET_WIDTH;
        //*/
        boolean isGesture = isGestureNav(context);
        boolean isPortrait = config.screenHeightDp > config.screenWidthDp;
        
        //第二处修改
        Resources systemRes;
        {
            Configuration conf = new Configuration();
            conf.smallestScreenWidthDp = swDp;
            systemRes = context.createConfigurationContext(conf).getResources();
        }
        //*/soda water.20230906 Tablet mode
        boolean isTablet = false;
        /*/
        boolean isTablet = swDp >= MIN_TABLET_WIDTH;
        /*/
        boolean isTabletOrGesture = isTablet
                || (Utilities.ATLEAST_R && isGestureNav(context));

        int statusBarHeightPortrait = getDimenByName(systemRes,
                STATUS_BAR_HEIGHT_PORTRAIT, STATUS_BAR_HEIGHT);
        int statusBarHeightLandscape = getDimenByName(systemRes,
                STATUS_BAR_HEIGHT_LANDSCAPE, STATUS_BAR_HEIGHT);

以上 Launcher3修改是防止 launcher变为平板模式的样式导致显示不全

路径: overlay/vendor/mediatek/proprietary/packages/apps/SystemUI/res/values-sw600dp-port/dimens.xml

修改:下拉栏左右边距问题

<resources>
    <dimen name="notification_panel_margin_horizontal">0dp</dimen>
</resources>

路径:vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java

        mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
        mTaskbarDelegate.setDependencies(commandQueue, overviewProxyService,
                navBarHelper, navigationModeController, sysUiFlagsContainer,
                dumpManager, autoHideController, lightBarController, pipOptional,
                backAnimation.orElse(null));
        //*/soda water.20230906 Tablet mode
        mIsTablet = false;
        /*/
        mIsTablet = isTablet(mContext);
        //*/
        dumpManager.registerDumpable(this);
    }

    @Override
    public void onConfigChanged(Configuration newConfig) {
        boolean isOldConfigTablet = mIsTablet;
        //*/soda water.20230906 Tablet mode
        mIsTablet = false;
        /*/
        mIsTablet = isTablet(mContext);
        //*/
        boolean largeScreenChanged = mIsTablet != isOldConfigTablet;
        // If we folded/unfolded while in 3 button, show navbar in folded state, hide in unfolded
        if (largeScreenChanged && updateNavbarForTaskbar()) {
            return;
        }
        
    public void onDisplayReady(int displayId) {
        Display display = mDisplayManager.getDisplay(displayId);
        //*/soda water.20230906 Tablet mode
        mIsTablet = false;
        /*/
        mIsTablet = isTablet(mContext);
        //*/
        createNavigationBar(display, null /* savedState */, null /* result */);
    }

路径:vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java

    private void setNavigationIconHints(int hints) {
        if (hints == mNavigationIconHints) return;
        //*/soda water.20230906 Tablet mode
        if (true) {
        /*/
        if (!isTablet(mContext)) {
        //*/
            // All IME functions handled by launcher via Sysui flags for large screen
            final boolean newBackAlt = (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0;
 

路径:vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java

            if (!QuickStepContract.isGesturalMode(mNavBarMode)
                    && wm.hasSoftNavigationBar(mContext.getDisplayId()) /*&& !isTablet(mContext)) soda water.20230906 Tablet mode*/) {
                buttons.setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE);
                swapChildrenIfRtlAndVertical(buttons);
            } 

以上修改防止UI界面变得现实不全 导航栏显示问题
完成后微信会识别成平板模式但QQ不会

路径:build/core/product_config.mk

ifndef PRODUCT_CHARACTERISTICS
  TARGET_AAPT_CHARACTERISTICS := tablet
else
  TARGET_AAPT_CHARACTERISTICS := $(PRODUCT_CHARACTERISTICS)
endif

改完后QQ就会变为平板模式

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Android 10.0中,Launcher3是一个默认的桌面启动器应用程序。默认情况下,Launcher3使用了多层桌面布局,由于每个应用程序的图标和小部件可以在不同的层级上进行放置,可以实现更多自定义和可玩性。 要将Launcher3修改为单层布局,可以进行以下步骤: 首先,要修改Launcher3的源代码。打开Launcher3的项目文件,在代码中找到与多层布局相关的部分。一般上,这些代码与屏幕上的图标和小部件的位置确定有关。 接下来,需要将多层布局改为单层布局。这意味着所有的图标和小部件将只能放置在一个层级上,不能另行分层。可以将所有图标和小部件视为一个整体,进行单层布局的更改。 在代码中找到与层级相关的代码,并进行相应的修改。可能涉及到图标和小部件的位置计算、绘制和触摸事件等。将多层布局的相关代码注释掉,或者删除,然后添加单层布局的代码。确保所有的图标和小部件都被正确地放置在单个层级上。 最后,重新编译和部署修改后的Launcher3应用程序。确保应用程序可以成功运行,并验证桌面布局是否变为单层。 通过以上步骤,就可以成功地将Android 10.0 Launcher3修改为单层布局。需要注意的是,这种修改可能涉及较多的代码更改,并且需要一定的编程经验和知识。如果对Android开发不熟悉,建议参考相关文档和指南,或咨询专业的开发人员进行帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不太正常的移动开发工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值