MTK
1.添加宏控制
- device/mediateksample/xxxx/system.prop
// add start
persist.panel.orientation=0
// add end
2.开机动画横屏显示
- frameworks/base/cmds/bootanimation/BootAnimation.cpp
status_t BootAnimation::readyToRun() {
mAssets.addDefaultAssets();
sp<IBinder> dtoken(SurfaceComposerClient::getBuiltInDisplay(
ISurfaceComposer::eDisplayIdMain));
DisplayInfo dinfo;
status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &dinfo);
if (status)
return -1;
// add start
int defaultOrientation = 0;
char property[PROPERTY_VALUE_MAX];
property_get("persist.panel.orientation", property, "0");
defaultOrientation = atoi(property)/90;
// create the native surface
sp<SurfaceControl> control = session()->createSurface(String8("BootAnimation"),
(defaultOrientation ==1 || defaultOrientation==3) ?dinfo.h:dinfo.w,
(defaultOrientation ==1 || defaultOrientation==3) ?dinfo.w:dinfo.h, PIXEL_FORMAT_RGB_565);
if (defaultOrientation==1 || defaultOrientation==3){
Rect destRect(dinfo.h, dinfo.w);
mSession->setDisplayProjection(dtoken, defaultOrientation, destRect, destRect);
}
// add end
3.初始化方向
- frameworks/native/services/surfaceflinger/DisplayDevice.cpp
// add start
int defaultOrientation = 0;
char property[PROPERTY_VALUE_MAX];
property_get("persist.panel.orientation", property, "0");
defaultOrientation = atoi(property);
switch(defaultOrientation) {
case 0:
defaultOrientation = DisplayState::eOrientationDefault;
break;
case 90:
defaultOrientation = DisplayState::eOrientation90;
break;
case 180:
defaultOrientation = DisplayState::eOrientation180;
break;
case 270:
defaultOrientation = DisplayState::eOrientation270;
break;
default:
defaultOrientation = DisplayState::eOrientationDefault;
break;
}
//add end
// initialize the display orientation transform.
// setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
setProjection(defaultOrientation, mViewport, mFrame); // modify
if (useTripleFramebuffer) {
surface->allocateBuffers();
}
}
4.上层方向修改
- frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
//add start
private int mDefaultOrientation = Surface.ROTATION_0;
public void setInitialDisplaySize(Display display, int width, int height, int density) {
// This method might be called before the policy has been fully initialized
// or for other displays we don't care about.
if (mContext == null || display.getDisplayId() != Display.DEFAULT_DISPLAY) {
return;
}
mDisplay = display;
...
mForceDefaultOrientation = longSizeDp >= 960 && shortSizeDp >= 720 &&
res.getBoolean(com.android.internal.R.bool.config_forceDefaultOrientation) &&
// For debug purposes the next line turns this feature off with:
// $ adb shell setprop config.override_forced_orient true
// $ adb shell wm size reset
!"true".equals(SystemProperties.get("config.override_forced_orient"));
//add start
String defaultOrientation = SystemProperties.get("persist.panel.orientation", "0");
if("0".equals(defaultOrientation)) {
mDefaultOrientation = Surface.ROTATION_0;
} else if("90".equals(defaultOrientation)) {
mDefaultOrientation = Surface.ROTATION_90;
} else if("180".equals(defaultOrientation)) {
mDefaultOrientation = Surface.ROTATION_180;
} else if("270".equals(defaultOrientation)) {
mDefaultOrientation = Surface.ROTATION_270;
} else {
mDefaultOrientation = Surface.ROTATION_0;
}
//add end
}
...
@Override
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;
}
// return Surface.ROTATION_0;
return mDefaultOrientation;// modify
}
}
}
8.0部分方向旋转的逻辑转移到DisplayContent.java中
- frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java
DisplayContent(Display display, WindowManagerService service,
WindowLayersController layersController, WallpaperController wallpaperController) {
if (service.mRoot.getDisplayContent(display.getDisplayId()) != null) {
throw new IllegalArgumentException("Display with ID=" + display.getDisplayId()
+ " already exists=" + service.mRoot.getDisplayContent(display.getDisplayId())
+ " new=" + display);
}
...
//add start
String defaultOrientation = SystemProperties.get("persist.panel.orientation", "0");
if("0".equals(defaultOrientation)) {
mRotation = Surface.ROTATION_0;
} else if("90".equals(defaultOrientation)) {
mRotation = Surface.ROTATION_90;
} else if("180".equals(defaultOrientation)) {
mRotation = Surface.ROTATION_180;
} else if("270".equals(defaultOrientation)) {
mRotation = Surface.ROTATION_270;
} else {
mRotation = Surface.ROTATION_0;
}
//add end
}
5.应用横屏显示
- frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java
/**
* Update rotation of the display.
*
* Returns true if the rotation has been changed. In this case YOU MUST CALL
* {@link WindowManagerService#sendNewConfiguration(int)} TO UNFREEZE THE SCREEN.
*/
boolean updateRotationUnchecked(boolean inTransaction) {
//add start
String defaultOrientation = SystemProperties.get("persist.panel.orientation", "0");
if ("90".equals(defaultOrientation) || "270".equals(defaultOrientation)){
return true;
}
// add end