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
This commit is contained in:
@@ -104,9 +104,6 @@
|
||||
|
||||
<dimen name="navigation_key_padding">0dp</dimen>
|
||||
|
||||
<dimen name="navigation_key_width_sw600dp_land">162dp</dimen>
|
||||
<dimen name="navigation_key_padding_sw600dp_land">42dp</dimen>
|
||||
|
||||
<!-- The width of the view containing the menu/ime navigation bar icons -->
|
||||
<dimen name="navigation_extra_key_width">36dp</dimen>
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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<ButtonDispatcher> 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) {
|
||||
|
||||
@@ -579,7 +579,7 @@ public class NavigationBarView extends LinearLayout {
|
||||
updateTaskSwitchHelper();
|
||||
setNavigationIconHints(mNavigationIconHints, true);
|
||||
|
||||
getHomeButton().setLandscape(mVertical);
|
||||
getHomeButton().setVertical(mVertical);
|
||||
}
|
||||
|
||||
private void updateTaskSwitchHelper() {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user