From 7917006430972105becda959a327fef929de05d4 Mon Sep 17 00:00:00 2001 From: Xiaohui Chen Date: Tue, 29 Nov 2016 15:10:04 -0800 Subject: [PATCH] sysui: fix navbar button view orientation Before navbar assumes rotation 0 means portrait and rotation 90 means landscape. This is not necessarily true, in certain devices the natural orientation (0) is landscape. Here we removed that assumption and make sure we use the right inflater at all times. Bug: 32516898 Change-Id: I325b8f61877827b19aa5b7b5cda49cb3523d2ed6 Merged-in: I3db44dcb35d8511fb9d42b147b2bd137ff0750f7 --- packages/SystemUI/res/values/dimens.xml | 3 - .../statusbar/phone/ButtonDispatcher.java | 19 +++--- .../phone/NavigationBarInflaterView.java | 68 +++++++------------ .../statusbar/phone/NavigationBarView.java | 2 +- .../statusbar/policy/KeyButtonView.java | 2 +- 5 files changed, 36 insertions(+), 58 deletions(-) diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index fe67808f6cb03..987d1fb07157f 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -104,9 +104,6 @@ 0dp - 162dp - 42dp - 36dp diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java index 1dbea163e9be6..379e7a487f4f4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java @@ -40,6 +40,7 @@ public class ButtonDispatcher { private int mImageResource = -1; private Drawable mImageDrawable; private View mCurrentView; + private boolean mVertical; public ButtonDispatcher(int id) { mId = id; @@ -49,13 +50,6 @@ public class ButtonDispatcher { mViews.clear(); } - void addView(View view, boolean landscape) { - addView(view); - if (view instanceof ButtonInterface) { - ((ButtonInterface) view).setLandscape(landscape); - } - } - void addView(View view) { mViews.add(view); view.setOnClickListener(mClickListener); @@ -75,6 +69,10 @@ public class ButtonDispatcher { } else if (mImageDrawable != null) { ((ButtonInterface) view).setImageDrawable(mImageDrawable); } + + if (view instanceof ButtonInterface) { + ((ButtonInterface) view).setVertical(mVertical); + } } public int getId() { @@ -186,12 +184,13 @@ public class ButtonDispatcher { } } - public void setLandscape(boolean landscape) { + public void setVertical(boolean vertical) { + mVertical = vertical; final int N = mViews.size(); for (int i = 0; i < N; i++) { final View view = mViews.get(i); if (view instanceof ButtonInterface) { - ((ButtonInterface) view).setLandscape(landscape); + ((ButtonInterface) view).setVertical(vertical); } } } @@ -206,7 +205,7 @@ public class ButtonDispatcher { void abortCurrentGesture(); - void setLandscape(boolean landscape); + void setVertical(boolean vertical); void setCarMode(boolean carMode); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java index 06c8b685ff636..59d12eaa13ad5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java @@ -17,12 +17,14 @@ package com.android.systemui.statusbar.phone; import android.annotation.Nullable; import android.content.Context; import android.content.res.Configuration; -import android.content.res.Resources; import android.util.AttributeSet; import android.util.SparseArray; +import android.view.Display; +import android.view.Display.Mode; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.Space; @@ -63,12 +65,13 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi protected FrameLayout mRot0; protected FrameLayout mRot90; + private boolean isRot0Landscape; private SparseArray mButtonDispatchers; private String mCurrentLayout; - private View mLastRot0; - private View mLastRot90; + private View mLastPortrait; + private View mLastLandscape; private boolean mAlternativeOrder; @@ -76,6 +79,10 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi super(context, attrs); mDensity = context.getResources().getConfiguration().densityDpi; createInflaters(); + Display display = ((WindowManager) + context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); + Mode displayMode = display.getMode(); + isRot0Landscape = displayMode.getPhysicalWidth() > displayMode.getPhysicalHeight(); } private void createInflaters() { @@ -204,17 +211,17 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi String[] center = sets[1].split(BUTTON_SEPARATOR); String[] end = sets[2].split(BUTTON_SEPARATOR); // Inflate these in start to end order or accessibility traversal will be messed up. - inflateButtons(start, (ViewGroup) mRot0.findViewById(R.id.ends_group), false); - inflateButtons(start, (ViewGroup) mRot90.findViewById(R.id.ends_group), true); + inflateButtons(start, (ViewGroup) mRot0.findViewById(R.id.ends_group), isRot0Landscape); + inflateButtons(start, (ViewGroup) mRot90.findViewById(R.id.ends_group), !isRot0Landscape); - inflateButtons(center, (ViewGroup) mRot0.findViewById(R.id.center_group), false); - inflateButtons(center, (ViewGroup) mRot90.findViewById(R.id.center_group), true); + inflateButtons(center, (ViewGroup) mRot0.findViewById(R.id.center_group), isRot0Landscape); + inflateButtons(center, (ViewGroup) mRot90.findViewById(R.id.center_group), !isRot0Landscape); addGravitySpacer((LinearLayout) mRot0.findViewById(R.id.ends_group)); addGravitySpacer((LinearLayout) mRot90.findViewById(R.id.ends_group)); - inflateButtons(end, (ViewGroup) mRot0.findViewById(R.id.ends_group), false); - inflateButtons(end, (ViewGroup) mRot90.findViewById(R.id.ends_group), true); + inflateButtons(end, (ViewGroup) mRot0.findViewById(R.id.ends_group), isRot0Landscape); + inflateButtons(end, (ViewGroup) mRot90.findViewById(R.id.ends_group), !isRot0Landscape); } private void addGravitySpacer(LinearLayout layout) { @@ -223,7 +230,7 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi private void inflateButtons(String[] buttons, ViewGroup parent, boolean landscape) { for (int i = 0; i < buttons.length; i++) { - inflateButton(buttons[i], parent, landscape, i); + inflateButton(buttons[i], parent, landscape); } } @@ -236,27 +243,17 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi } @Nullable - protected View inflateButton(String buttonSpec, ViewGroup parent, boolean landscape, - int indexInParent) { + protected View inflateButton(String buttonSpec, ViewGroup parent, boolean landscape) { LayoutInflater inflater = landscape ? mLandscapeInflater : mLayoutInflater; float size = extractSize(buttonSpec); String button = extractButton(buttonSpec); View v = null; if (HOME.equals(button)) { v = inflater.inflate(R.layout.home, parent, false); - if (landscape && isSw600Dp()) { - setupLandButton(v); - } } else if (BACK.equals(button)) { v = inflater.inflate(R.layout.back, parent, false); - if (landscape && isSw600Dp()) { - setupLandButton(v); - } } else if (RECENT.equals(button)) { v = inflater.inflate(R.layout.recent_apps, parent, false); - if (landscape && isSw600Dp()) { - setupLandButton(v); - } } else if (MENU_IME.equals(button)) { v = inflater.inflate(R.layout.menu_ime, parent, false); } else if (NAVSPACE.equals(button)) { @@ -280,15 +277,15 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi params.width = (int) (params.width * size); } parent.addView(v); - addToDispatchers(v, landscape); - View lastView = landscape ? mLastRot90 : mLastRot0; + addToDispatchers(v); + View lastView = landscape ? mLastLandscape : mLastPortrait; if (lastView != null) { v.setAccessibilityTraversalAfter(lastView.getId()); } if (landscape) { - mLastRot90 = v; + mLastLandscape = v; } else { - mLastRot0 = v; + mLastPortrait = v; } return v; } @@ -327,37 +324,22 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi return buttonSpec.substring(0, buttonSpec.indexOf(SIZE_MOD_START)); } - private void addToDispatchers(View v, boolean landscape) { + private void addToDispatchers(View v) { if (mButtonDispatchers != null) { final int indexOfKey = mButtonDispatchers.indexOfKey(v.getId()); if (indexOfKey >= 0) { - mButtonDispatchers.valueAt(indexOfKey).addView(v, landscape); + mButtonDispatchers.valueAt(indexOfKey).addView(v); } else if (v instanceof ViewGroup) { final ViewGroup viewGroup = (ViewGroup)v; final int N = viewGroup.getChildCount(); for (int i = 0; i < N; i++) { - addToDispatchers(viewGroup.getChildAt(i), landscape); + addToDispatchers(viewGroup.getChildAt(i)); } } } } - private boolean isSw600Dp() { - Configuration configuration = mContext.getResources().getConfiguration(); - return (configuration.smallestScreenWidthDp >= 600); - } - /** - * This manually sets the width of sw600dp landscape buttons because despite - * overriding the configuration from the overridden resources aren't loaded currently. - */ - private void setupLandButton(View v) { - Resources res = mContext.getResources(); - v.getLayoutParams().width = res.getDimensionPixelOffset( - R.dimen.navigation_key_width_sw600dp_land); - int padding = res.getDimensionPixelOffset(R.dimen.navigation_key_padding_sw600dp_land); - v.setPadding(padding, v.getPaddingTop(), padding, v.getPaddingBottom()); - } private void clearViews() { if (mButtonDispatchers != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index a0d1b4203557b..245d4da2e43f1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -579,7 +579,7 @@ public class NavigationBarView extends LinearLayout { updateTaskSwitchHelper(); setNavigationIconHints(mNavigationIconHints, true); - getHomeButton().setLandscape(mVertical); + getHomeButton().setVertical(mVertical); } private void updateTaskSwitchHelper() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java index e6066aaa4c316..b8018bda76de2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -275,7 +275,7 @@ public class KeyButtonView extends ImageView implements ButtonDispatcher.ButtonI } @Override - public void setLandscape(boolean landscape) { + public void setVertical(boolean vertical) { //no op }