1.设置状态栏的显示或隐藏
frameworks/base 路劲下面有个services/core/java/com/android/server/wm/DisplayPolicy.java, 该文件中有一个”mHasNavigationBar” , 设置为false则隐藏,否则显示。
String navBarOverride = "1";
if ("1".equals(navBarOverride)) {mHasNavigationBar = false;
} else if ("0".equals(navBarOverride)) {mHasNavigationBar = true;
}
2.修改Snapdragon camera preview size 和image distortion
Snapdragon camera 不支持landscape的情况,将camera设置为landscape后,会出现preview size 和image distortion 不正确. 有遇到两种snapdragon camera的code。分别使用两种修改方式:
修改PhotoUI VideoUI文件
修改src/com/android/camera/PhotoUI.java文件中的”layoutPreview(float ratio)” 部分code,如下:
Log.v(TAG, "setTransformMatrix: scaledTextureWidth = " + scaledTextureWidth+ ", scaledTextureHeight = " + scaledTextureHeight);
+ scaledTextureWidth = mMaxPreviewWidth - (mTopMargin + mBottomMargin);
+ scaledTextureHeight = mMaxPreviewHeight;if (((rotation == 0 || rotation == 180) && scaledTextureWidth > scaledTextureHeight)|| ((rotation == 90 || rotation == 270)&& scaledTextureWidth < scaledTextureHeight)) {
+ lp = new FrameLayout.LayoutParams((int)scaledTextureWidth ,
+ (int) scaledTextureHeight, Gravity.CENTER);
+ } else {lp = new FrameLayout.LayoutParams((int) scaledTextureHeight,(int) scaledTextureWidth, Gravity.CENTER);
- } else {
- lp = new FrameLayout.LayoutParams((int) scaledTextureWidth,
- (int) scaledTextureHeight, Gravity.CENTER);
- }
- if(mScreenRatio == CameraUtil.RATIO_4_3) {
- lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
- lp.setMargins(0, mTopMargin, 0, mBottomMargin);}
+// if(mScreenRatio == CameraUtil.RATIO_4_3) {
+// lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
+ lp.gravity = Gravity.TOP;
+ lp.setMargins(mTopMargin, 0, 0, mBottomMargin);
+// }
修改src/com/android/camera/VideoUI.java文件中的”layoutPreview(float ratio)” 部分code,如下:
Log.v(TAG, "setTransformMatrix: scaledTextureWidth = " + scaledTextureWidth+ ", scaledTextureHeight = " + scaledTextureHeight);
-
+ scaledTextureWidth = mMaxPreviewWidth - (mTopMargin + mBottomMargin);
+ scaledTextureHeight = mMaxPreviewHeight;if (((rotation == 0 || rotation == 180) && scaledTextureWidth > scaledTextureHeight)|| ((rotation == 90 || rotation == 270)&& scaledTextureWidth < scaledTextureHeight)) {
- lp = new FrameLayout.LayoutParams((int) scaledTextureHeight,
- (int) scaledTextureWidth, Gravity.CENTER);
+ lp = new FrameLayout.LayoutParams((int) scaledTextureWidth,
+ (int) scaledTextureHeight, Gravity.CENTER);} else {lp = new FrameLayout.LayoutParams((int) scaledTextureWidth,(int) scaledTextureHeight, Gravity.CENTER);}
+ lp.gravity = Gravity.TOP;
+ lp.setMargins(mTopMargin, 0, 0, mBottomMargin);}
修改CaptureUI 文件
修改src/com/android/camera/CaptureUI.java文件中的showSurfaceView的code,代码如下:
public void showSurfaceView() {Log.d(TAG, "showSurfaceView");if(mPreviewHeight > mDisplaySize.y){mPreviewHeight = mDisplaySize.y;}mSurfaceView.getHolder().setFixedSize(mPreviewWidth, mPreviewHeight);FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(mPreviewWidth , mPreviewHeight, Gravity.CENTER);lp.gravity = Gravity.TOP ;int left = (mDisplaySize.x - mPreviewWidth )/2;int top = (mDisplaySize.y - mPreviewHeight) /2;lp.setMargins(left, top, mDisplaySize.x, mDisplaySize.y);mSurfaceView.setLayoutParams(lp);mSurfaceView.setVisibility(View.VISIBLE);mIsVideoUI = false;}
3.Google search bar 和 search apps bar在横屏不显示
XXX设备在竖屏的情况下,google search bar 和search apps bar是正常显示,但是在转到横屏的情况不会显示不来。XXX 的home screen 和其他设备home screen 不一样的地方是,XXX 的home screen上有date time widget 并且google search bar 在底部. 当前修改都是基于GMS版本
横屏不显示google search bar原因
在/vendor/partner_gms/apps/SearchLauncher/quickstep/src/com/android/searchlauncher/HotseatQsbWidget.java 文件中有一段代码设置为横屏的时候不显示
@Overridepublic void setInsets(Rect insets) {setVisibility(mActivity.getDeviceProfile().isVerticalBarLayout() ? GONE : VISIBLE);MarginLayoutParams mlp = (MarginLayoutParams) getLayoutParams();mlp.topMargin = Math.round(Math.max(-mFixedTranslationY, insets.top - mMarginTopAdjusting));Rect padding = mActivity.getDeviceProfile().getHotseatLayoutPadding();setPaddingUnchecked(padding.left, 0, padding.right, 0);requestLayout();}
把上面红色代码改为:setVisibility(VISIBLE); google search bar和 search apps bar会显示出来,因为google search bar显示在home screen底部,所以会看不到,实际上是显示出来的. 如果想看google search bar 实际上有没有显示, 可以调整上面代码中的mlp.topMargin的值为负值,大概为-400.
使用google search bar 替换顶部的date widget
Home screen顶部的date widget代码在vendor/partner_gms/apps/SearchLauncher/quickstep/res/layout/search_container_workspace.xml文件中,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<com.android.searchlauncher.SmartspaceQsbWidgetxmlns:android="http://schemas.android.com/apk/res/android"android:id="@id/search_container_workspace"android:layout_width="match_parent"android:layout_height="0dp"><fragmentandroid:name="com.android.searchlauncher.SmartspaceQsbWidget$SmartSpaceFragment"android:layout_width="match_parent"android:tag="smart_space_view"android:layout_height="match_parent"/></com.android.searchlauncher.SmartspaceQsbWidget>
把上面红色代码替换为vendor/partner_gms/apps/SearchLauncher/quickstep/res/layout/search_container_all_apps.xml 文件中的android:name="com.android.searchlauncher.HotseatQsbWidget$HotseatQsbFragment"则替换成功.
删除home screen 底部的google search bar
执行第二步的代码后在竖屏的情况下,会出现两个google search bar, z这个时候需要去掉底部的google search bar, home screen 底部google search bar 在vendor/partner_gms/apps/SearchLauncher/quickstep/res/layout/search_container_all_apps.xml 文件中.
<com.android.searchlauncher.HotseatQsbWidgetxmlns:android="http://schemas.android.com/apk/res/android"android:id="@id/search_container_all_apps"android:layout_width="match_parent"android:layout_height="56dp"android:layout_gravity="top|center_horizontal"android:translationY="28dp"><fragmentandroid:id="@+id/search_wrapper_view"android:name="com.android.searchlauncher.HotseatQsbWidget$HotseatQsbFragment"android:layout_width="match_parent"android:layout_height="match_parent"android:tag="qsb_view"/><com.android.launcher3.ExtendedEditTextandroid:id="@+id/fallback_search_view"android:layout_width="match_parent"android:layout_height="@dimen/all_apps_search_bar_field_height"android:layout_gravity="center"android:layout_marginLeft="8dp"android:layout_marginRight="8dp"android:background="@drawable/bg_all_apps_searchbox"android:elevation="1dp"android:focusableInTouchMode="true"
把上面红色代码删除后,在竖屏情况下Hotseat距离底部有一段距离,需要调整。
调整竖屏Hotseat与底部的距离
调整竖屏情况下Hotseat与home screen底部的距离,更改packages/apps/Launcher3/src/com/android/launcher3/DeviceProfile.java文件中hotseatBarBottomPaddingPx的值为0.
hotseatBarTopPaddingPx =res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_top_padding);hotseatBarBottomPaddingPx = (isTallDevice ? 0: res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_bottom_non_tall_padding))+ res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_bottom_padding);hotseatBarBottomPaddingPx = 0;hotseatBarSidePaddingEndPx =res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_side_padding);// Add a bit of space between nav bar and hotseat in vertical bar layout.hotseatBarSidePaddingStartPx = isVerticalBarLayout() ? verticalDragHandleSizePx : 0;hotseatBarSizePx = ResourceUtils.pxFromDp(inv.iconSize, dm) + (isVerticalBarLayout()? (hotseatBarSidePaddingStartPx + hotseatBarSidePaddingEndPx): (res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_extra_vertical_size)+ hotseatBarTopPaddingPx + hotseatBarBottomPaddingPx));
调整hotseatBarBottomPaddingPx的值为0后,会出现workspace 中app icon上下之间的距离较大,需要更改updateWorkspacePadding
private void updateWorkspacePadding() {Rect padding = workspacePadding;if (isVerticalBarLayout()) {padding.top = 0;padding.bottom = edgeMarginPx;if (isSeascape()) {padding.left = hotseatBarSizePx;padding.right = verticalDragHandleSizePx;} else {padding.left = verticalDragHandleSizePx;padding.right = hotseatBarSizePx;}} else {int paddingBottom = hotseatBarSizePx + verticalDragHandleSizePx- verticalDragHandleOverlapWorkspace;if (isTablet) {// Pad the left and right of the workspace to ensure consistent spacing// between all icons// The amount of screen space available for left/right padding.int availablePaddingX = Math.max(0, widthPx - ((inv.numColumns * cellWidthPx) +((inv.numColumns - 1) * cellWidthPx)));availablePaddingX = (int) Math.min(availablePaddingX,widthPx * MAX_HORIZONTAL_PADDING_PERCENT);int availablePaddingY = Math.max(0, heightPx - edgeMarginPx - paddingBottom- (2 * inv.numRows * cellHeightPx) - hotseatBarTopPaddingPx- hotseatBarBottomPaddingPx);padding.set(availablePaddingX / 2, edgeMarginPx + availablePaddingY / 2,availablePaddingX / 2, paddingBottom + availablePaddingY / 2);} else {// Pad the top and bottom of the workspace with search/hotseat bar sizespadding.set(desiredWorkspaceLeftRightMarginPx,edgeMarginPx,desiredWorkspaceLeftRightMarginPx,paddingBottom);}}}
将红色代码改为 “int paddingBottom = hotseatBarSizePx;”, 更改之后如果还是较大,则需要增大paddingBottom的值.
public Rect getHotseatLayoutPadding() {if (isVerticalBarLayout()) {if (isSeascape()) {mHotseatPadding.set(mInsets.left + hotseatBarSidePaddingStartPx,mInsets.top, hotseatBarSidePaddingEndPx, mInsets.bottom);} else {mHotseatPadding.set(hotseatBarSidePaddingEndPx, mInsets.top,mInsets.right + hotseatBarSidePaddingStartPx, mInsets.bottom);}} else {// We want the edges of the hotseat to line up with the edges of the workspace, but the// icons in the hotseat are a different size, and so don't line up perfectly. To account// for this, we pad the left and right of the hotseat with half of the difference of a// workspace cell vs a hotseat cell.float workspaceCellWidth = (float) widthPx / inv.numColumns;float hotseatCellWidth = (float) widthPx / inv.numHotseatIcons;int hotseatAdjustment = Math.round((workspaceCellWidth - hotseatCellWidth) / 2);mHotseatPadding.set(hotseatAdjustment + workspacePadding.left + cellLayoutPaddingLeftRightPx,hotseatBarTopPaddingPx,hotseatAdjustment + workspacePadding.right + cellLayoutPaddingLeftRightPx,hotseatBarBottomPaddingPx + mInsets.bottom + cellLayoutBottomPaddingPx);}return mHotseatPadding;}
移除红色代码中的 hotseatBarBottomPaddingPx, 因为 mInsets.bottom和 cellLayoutBottomPaddingPx的值是0.