Skip to content

Commit 6ed1bfb

Browse files
adampAndroid (Google) Code Review
authored andcommitted
Merge "Fix bug 5341139 - bottom bar stays if app wants to handle orientation change"
2 parents a982ad1 + a05aba9 commit 6ed1bfb

4 files changed

Lines changed: 79 additions & 19 deletions

File tree

core/java/com/android/internal/widget/AbsActionBarView.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public abstract class AbsActionBarView extends ViewGroup {
3535
protected ActionMenuView mMenuView;
3636
protected ActionMenuPresenter mActionMenuPresenter;
3737
protected ActionBarContainer mSplitView;
38+
protected boolean mSplitActionBar;
39+
protected boolean mSplitWhenNarrow;
3840
protected int mContentHeight;
3941

4042
protected Animator mVisibilityAnim;
@@ -66,11 +68,31 @@ protected void onConfigurationChanged(Configuration newConfig) {
6668
com.android.internal.R.attr.actionBarStyle, 0);
6769
setContentHeight(a.getLayoutDimension(R.styleable.ActionBar_height, 0));
6870
a.recycle();
71+
if (mSplitWhenNarrow) {
72+
setSplitActionBar(getContext().getResources().getBoolean(
73+
com.android.internal.R.bool.split_action_bar_is_narrow));
74+
}
6975
if (mActionMenuPresenter != null) {
7076
mActionMenuPresenter.onConfigurationChanged(newConfig);
7177
}
7278
}
7379

80+
/**
81+
* Sets whether the bar should be split right now, no questions asked.
82+
* @param split true if the bar should split
83+
*/
84+
public void setSplitActionBar(boolean split) {
85+
mSplitActionBar = split;
86+
}
87+
88+
/**
89+
* Sets whether the bar should split if we enter a narrow screen configuration.
90+
* @param splitWhenNarrow true if the bar should check to split after a config change
91+
*/
92+
public void setSplitWhenNarrow(boolean splitWhenNarrow) {
93+
mSplitWhenNarrow = splitWhenNarrow;
94+
}
95+
7496
public void setContentHeight(int height) {
7597
mContentHeight = height;
7698
requestLayout();

core/java/com/android/internal/widget/ActionBarContextView.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,39 @@ public ActionBarContextView(Context context, AttributeSet attrs, int defStyle) {
9393
a.recycle();
9494
}
9595

96+
@Override
97+
public void setSplitActionBar(boolean split) {
98+
if (mSplitActionBar != split) {
99+
if (mActionMenuPresenter != null) {
100+
// Mode is already active; move everything over and adjust the menu itself.
101+
final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
102+
LayoutParams.MATCH_PARENT);
103+
if (!split) {
104+
mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
105+
mMenuView.setBackgroundDrawable(null);
106+
final ViewGroup oldParent = (ViewGroup) mMenuView.getParent();
107+
if (oldParent != null) oldParent.removeView(mMenuView);
108+
addView(mMenuView, layoutParams);
109+
} else {
110+
// Allow full screen width in split mode.
111+
mActionMenuPresenter.setWidthLimit(
112+
getContext().getResources().getDisplayMetrics().widthPixels, true);
113+
// No limit to the item count; use whatever will fit.
114+
mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE);
115+
// Span the whole width
116+
layoutParams.width = LayoutParams.MATCH_PARENT;
117+
layoutParams.height = mContentHeight;
118+
mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
119+
mMenuView.setBackgroundDrawable(mSplitBackground);
120+
final ViewGroup oldParent = (ViewGroup) mMenuView.getParent();
121+
if (oldParent != null) oldParent.removeView(mMenuView);
122+
mSplitView.addView(mMenuView, layoutParams);
123+
}
124+
}
125+
super.setSplitActionBar(split);
126+
}
127+
}
128+
96129
public void setContentHeight(int height) {
97130
mContentHeight = height;
98131
}
@@ -179,7 +212,7 @@ public void onClick(View v) {
179212

180213
final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
181214
LayoutParams.MATCH_PARENT);
182-
if (mSplitView == null) {
215+
if (!mSplitActionBar) {
183216
menu.addMenuPresenter(mActionMenuPresenter);
184217
mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
185218
mMenuView.setBackgroundDrawable(null);

core/java/com/android/internal/widget/ActionBarView.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ public class ActionBarView extends AbsActionBarView {
113113
private int mProgressStyle;
114114
private int mIndeterminateProgressStyle;
115115

116-
private boolean mSplitActionBar;
117116
private boolean mUserTitle;
118117
private boolean mIncludeTabs;
119118
private boolean mIsCollapsable;
@@ -301,6 +300,7 @@ public void initIndeterminateProgress() {
301300
addView(mIndeterminateProgressView);
302301
}
303302

303+
@Override
304304
public void setSplitActionBar(boolean splitActionBar) {
305305
if (mSplitActionBar != splitActionBar) {
306306
if (mMenuView != null) {
@@ -316,7 +316,10 @@ public void setSplitActionBar(boolean splitActionBar) {
316316
addView(mMenuView);
317317
}
318318
}
319-
mSplitActionBar = splitActionBar;
319+
if (mSplitView != null) {
320+
mSplitView.setVisibility(splitActionBar ? VISIBLE : GONE);
321+
}
322+
super.setSplitActionBar(splitActionBar);
320323
}
321324
}
322325

policy/src/com/android/internal/policy/impl/PhoneWindow.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2762,28 +2762,30 @@ private void installDecor() {
27622762
}
27632763

27642764
boolean splitActionBar = false;
2765-
if ((mUiOptions & ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW) != 0) {
2765+
final boolean splitWhenNarrow =
2766+
(mUiOptions & ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW) != 0;
2767+
if (splitWhenNarrow) {
27662768
splitActionBar = getContext().getResources().getBoolean(
27672769
com.android.internal.R.bool.split_action_bar_is_narrow);
27682770
} else {
27692771
splitActionBar = getWindowStyle().getBoolean(
27702772
com.android.internal.R.styleable.Window_windowSplitActionBar, false);
27712773
}
2772-
if (splitActionBar) {
2773-
final ActionBarContainer splitView = (ActionBarContainer) findViewById(
2774-
com.android.internal.R.id.split_action_bar);
2775-
if (splitView != null) {
2776-
splitView.setVisibility(View.VISIBLE);
2777-
mActionBar.setSplitActionBar(splitActionBar);
2778-
mActionBar.setSplitView(splitView);
2779-
2780-
final ActionBarContextView cab = (ActionBarContextView) findViewById(
2781-
com.android.internal.R.id.action_context_bar);
2782-
cab.setSplitView(splitView);
2783-
} else {
2784-
Log.e(TAG, "Requested split action bar with " +
2785-
"incompatible window decor! Ignoring request.");
2786-
}
2774+
final ActionBarContainer splitView = (ActionBarContainer) findViewById(
2775+
com.android.internal.R.id.split_action_bar);
2776+
if (splitView != null) {
2777+
mActionBar.setSplitView(splitView);
2778+
mActionBar.setSplitActionBar(splitActionBar);
2779+
mActionBar.setSplitWhenNarrow(splitWhenNarrow);
2780+
2781+
final ActionBarContextView cab = (ActionBarContextView) findViewById(
2782+
com.android.internal.R.id.action_context_bar);
2783+
cab.setSplitView(splitView);
2784+
cab.setSplitActionBar(splitActionBar);
2785+
cab.setSplitWhenNarrow(splitWhenNarrow);
2786+
} else if (splitActionBar) {
2787+
Log.e(TAG, "Requested split action bar with " +
2788+
"incompatible window decor! Ignoring request.");
27872789
}
27882790

27892791
// Post the panel invalidate for later; avoid application onCreateOptionsMenu

0 commit comments

Comments
 (0)