Android O 竖屏横用相关修改

最近公司想要做个横屏的设备,考虑到是小屏,LCM由于工艺,防摔等因素不好替换,Manager让研究下竖屏横用。

需要考虑的方面:

kernel_logo,bootanimation,系统,recovery ui,charger (关机充电)等。

1.kernel_logo

qualcomm的kernel_logo在splash.img里

目录:

vendor\action\splash\android_720X1280.png,替换成横屏的

Android O 竖屏横用相关修改_第1张图片

2.bootanimation

frameworks\base\cmds\bootanimation\BootAnimation.cpp

status_t BootAnimation::readyToRun() {
    ...
    mAssets.addDefaultAssets();

    sp dtoken(SurfaceComposerClient::getBuiltInDisplay(
            ISurfaceComposer::eDisplayIdMain));
    DisplayInfo dinfo;
    status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &dinfo);
    if (status)
        return -1;
   //potter add
    int temp = dinfo.h;
    dinfo.h= dinfo.w;
    dinfo.w= temp;
    Rect destRect(dinfo.w, dinfo.h);
    mSession->setDisplayProjection(dtoken, 1, destRect, destRect);//orient=1
   //potter end
    ...
}

device\honeywell\common\bootanimation.zip

每张图都替换成横屏的。这里要注意下,由于前面BootAnimation.cpp做了顺时针90度处理,所以这里的图片需要在kernel_logo的这种处理方法上再逆时针转个90度。为什么BootAnimation.cpp中做顺时针90度处理,是因为后面上层的WMS里面预设角度从0变成90度了(android N是在WMS修改的,而Android O是在DisplayContent里面)。如果不处理,WMS起来的时候,bootanimation还没走完,剩下的一小段的bootanimation会转个90度,会不一致。(这个大家可以实际测试看看效果)

Android O 竖屏横用相关修改_第2张图片

重编或者adb push 到system/media目录,然后重启手机看效果。

3.系统

frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java

public int rotationForOrientationLw(int orientation, int lastRotation) {
    ...
    default:
    // For USER, UNSPECIFIED, NOSENSOR, SENSOR and FULL_SENSOR,
    // just return the preferred orientation we already calculated.
    if (preferredRotation >= 0) {
        return preferredRotation;
    }
    //potter change
    //return Surface.ROTATION_0;
    return Surface.ROTATION_90;
    //potter end
    ...
}

 frameworks\base\services\core\java\com\android\server\wm\DisplayContent.java

//potter change 
//private int mRotation = 0;
private int mRotation = 1;
//potter end

这两处修改后,进入系统就已经是默认横屏了。

但是要考虑一个问题,systemui里面有自动旋转的功能。这个QSTile打开,那么是自动旋转,可以横竖屏切换,关闭就锁定竖屏了。

这显然不是我们想要的。由于我们现在是竖屏横用,所以我们希望是QSTile打开,自动旋转,关闭的话锁定横屏。所以有了下面两处的修改。

frameworks\base\packages\SystemUI\src\com\android\systemui\qs\tiles\RotationLockTile.java

public static boolean isCurrentOrientationLockPortrait(RotationLockController controller,
        Context context) {
	//potter change
	return false;
	/*
    int lockOrientation = controller.getRotationLockOrientation();
    if (lockOrientation == Configuration.ORIENTATION_UNDEFINED) {
        // Freely rotating device; use current rotation
        return context.getResources().getConfiguration().orientation
                != Configuration.ORIENTATION_LANDSCAPE;
    } else {
        return lockOrientation != Configuration.ORIENTATION_LANDSCAPE;
    }
	*/
	//potter end
}

其实这里直接返回false有点粗暴,可能会有隐患,有兴趣的朋友可以深入研究下看怎么优雅点。

frameworks\base\core\java\com\android\internal\view\RotationPolicy.java

//potter change 
//private static final int NATURAL_ROTATION = Surface.ROTATION_0;
private static final int NATURAL_ROTATION = Surface.ROTATION_90;
//potter end

如果完全不需要自动旋转这个功能。那么在

\frameworks\base\core\res\res\values\config.xml

true

改成false。这样就不能自动旋转了,但是你需要自己去systemui中把自动旋转的qstile remove掉,要不ui还在。

4.关于锁屏和Launcher

我们知道,默认锁屏和Launcher是不能自动旋转的。

其实也是可以设置的,针对锁屏:

frameworks\base\core\res\res\values\config.xml

false

改成true就行。

针对Laucher:

从Android N开始:

桌面空白处长按→进入OverviewMode→点击设置→打开允许旋转的开关

实际Android 默认是有这个功能的。只是默认在手机上没打开,大的平板还是打开了的。

packages/apps/Launcher3/res/xml/launcher_preferences.xml:43:        android:defaultValue="@bool/allow_rotation"

packages/apps/Launcher3/res/values/config.xml:10:    false

packages/apps/Launcher3/res/values-sw600dp/config.xml:3:    true

如果想要默认打开:

packages/apps/Launcher3/res/values/config.xml

false

改成true即可。

 

recovery ui和charger暂时还没研究到,后头补充。希望对大家有用。

你可能感兴趣的:(Android O 竖屏横用相关修改)