Merge "Action bar refactoring, round 1"
This commit is contained in:
@@ -183,7 +183,7 @@ public class WindowDecorActionBar extends ActionBar implements
|
||||
|
||||
private void init(View decor) {
|
||||
mOverlayLayout = (ActionBarOverlayLayout) decor.findViewById(
|
||||
com.android.internal.R.id.action_bar_overlay_layout);
|
||||
com.android.internal.R.id.decor_content_parent);
|
||||
if (mOverlayLayout != null) {
|
||||
mOverlayLayout.setActionBarVisibilityCallback(this);
|
||||
}
|
||||
|
||||
@@ -19,26 +19,34 @@ package com.android.internal.widget;
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
import android.os.Parcelable;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.IntProperty;
|
||||
import android.util.Log;
|
||||
import android.util.Property;
|
||||
import android.util.SparseArray;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.Menu;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewPropertyAnimator;
|
||||
import android.view.Window;
|
||||
import android.view.WindowInsets;
|
||||
import android.widget.OverScroller;
|
||||
import com.android.internal.view.menu.MenuPresenter;
|
||||
|
||||
/**
|
||||
* Special layout for the containing of an overlay action bar (and its
|
||||
* content) to correctly handle fitting system windows when the content
|
||||
* has request that its layout ignore them.
|
||||
*/
|
||||
public class ActionBarOverlayLayout extends ViewGroup {
|
||||
public class ActionBarOverlayLayout extends ViewGroup implements DecorContentParent {
|
||||
private static final String TAG = "ActionBarOverlayLayout";
|
||||
|
||||
private int mActionBarHeight;
|
||||
@@ -47,7 +55,7 @@ public class ActionBarOverlayLayout extends ViewGroup {
|
||||
|
||||
// The main UI elements that we handle the layout of.
|
||||
private View mContent;
|
||||
private View mActionBarBottom;
|
||||
private ActionBarContainer mActionBarBottom;
|
||||
private ActionBarContainer mActionBarTop;
|
||||
|
||||
// Some interior UI elements.
|
||||
@@ -556,7 +564,8 @@ public class ActionBarOverlayLayout extends ViewGroup {
|
||||
mActionBarTop = (ActionBarContainer) findViewById(
|
||||
com.android.internal.R.id.action_bar_container);
|
||||
mActionBarView = (ActionBarView) findViewById(com.android.internal.R.id.action_bar);
|
||||
mActionBarBottom = findViewById(com.android.internal.R.id.split_action_bar);
|
||||
mActionBarBottom = (ActionBarContainer) findViewById(
|
||||
com.android.internal.R.id.split_action_bar);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -629,6 +638,179 @@ public class ActionBarOverlayLayout extends ViewGroup {
|
||||
return finalY > mActionBarTop.getHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchKeyEvent(KeyEvent event) {
|
||||
if (super.dispatchKeyEvent(event)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
|
||||
final int action = event.getAction();
|
||||
|
||||
// Collapse any expanded action views.
|
||||
if (mActionBarView != null && mActionBarView.hasExpandedActionView()) {
|
||||
if (action == KeyEvent.ACTION_UP) {
|
||||
mActionBarView.collapseActionView();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setWindowCallback(Window.Callback cb) {
|
||||
pullChildren();
|
||||
mActionBarView.setWindowCallback(cb);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setWindowTitle(CharSequence title) {
|
||||
pullChildren();
|
||||
mActionBarView.setWindowTitle(title);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getTitle() {
|
||||
pullChildren();
|
||||
return mActionBarView.getTitle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initFeature(int windowFeature) {
|
||||
pullChildren();
|
||||
switch (windowFeature) {
|
||||
case Window.FEATURE_PROGRESS:
|
||||
mActionBarView.initProgress();
|
||||
break;
|
||||
case Window.FEATURE_INDETERMINATE_PROGRESS:
|
||||
mActionBarView.initIndeterminateProgress();
|
||||
break;
|
||||
case Window.FEATURE_ACTION_BAR_OVERLAY:
|
||||
setOverlayMode(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUiOptions(int uiOptions) {
|
||||
boolean splitActionBar = false;
|
||||
final boolean splitWhenNarrow =
|
||||
(uiOptions & ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW) != 0;
|
||||
if (splitWhenNarrow) {
|
||||
splitActionBar = getContext().getResources().getBoolean(
|
||||
com.android.internal.R.bool.split_action_bar_is_narrow);
|
||||
}
|
||||
if (splitActionBar) {
|
||||
pullChildren();
|
||||
if (mActionBarBottom != null) {
|
||||
mActionBarView.setSplitView(mActionBarBottom);
|
||||
mActionBarView.setSplitActionBar(splitActionBar);
|
||||
mActionBarView.setSplitWhenNarrow(splitWhenNarrow);
|
||||
|
||||
final ActionBarContextView cab = (ActionBarContextView) findViewById(
|
||||
com.android.internal.R.id.action_context_bar);
|
||||
cab.setSplitView(mActionBarBottom);
|
||||
cab.setSplitActionBar(splitActionBar);
|
||||
cab.setSplitWhenNarrow(splitWhenNarrow);
|
||||
} else if (splitActionBar) {
|
||||
Log.e(TAG, "Requested split action bar with " +
|
||||
"incompatible window decor! Ignoring request.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasIcon() {
|
||||
pullChildren();
|
||||
return mActionBarView.hasIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasLogo() {
|
||||
pullChildren();
|
||||
return mActionBarView.hasLogo();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIcon(int resId) {
|
||||
pullChildren();
|
||||
mActionBarView.setIcon(resId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIcon(Drawable d) {
|
||||
pullChildren();
|
||||
mActionBarView.setIcon(d);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLogo(int resId) {
|
||||
pullChildren();
|
||||
mActionBarView.setLogo(resId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canShowOverflowMenu() {
|
||||
pullChildren();
|
||||
return mActionBarView.isOverflowReserved() && mActionBarView.getVisibility() == VISIBLE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOverflowMenuShowing() {
|
||||
pullChildren();
|
||||
return mActionBarView.isOverflowMenuShowing();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOverflowMenuShowPending() {
|
||||
pullChildren();
|
||||
return mActionBarView.isOverflowMenuShowPending();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean showOverflowMenu() {
|
||||
pullChildren();
|
||||
return mActionBarView.showOverflowMenu();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hideOverflowMenu() {
|
||||
pullChildren();
|
||||
return mActionBarView.hideOverflowMenu();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMenuPrepared() {
|
||||
pullChildren();
|
||||
mActionBarView.setMenuPrepared();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMenu(Menu menu, MenuPresenter.Callback cb) {
|
||||
pullChildren();
|
||||
mActionBarView.setMenu(menu, cb);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveToolbarHierarchyState(SparseArray<Parcelable> toolbarStates) {
|
||||
pullChildren();
|
||||
mActionBarView.saveHierarchyState(toolbarStates);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreToolbarHierarchyState(SparseArray<Parcelable> toolbarStates) {
|
||||
pullChildren();
|
||||
mActionBarView.restoreHierarchyState(toolbarStates);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dismissPopups() {
|
||||
pullChildren();
|
||||
mActionBarView.dismissPopupMenus();
|
||||
}
|
||||
|
||||
public static class LayoutParams extends MarginLayoutParams {
|
||||
public LayoutParams(Context c, AttributeSet attrs) {
|
||||
super(c, attrs);
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (C) 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
|
||||
package com.android.internal.widget;
|
||||
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Parcelable;
|
||||
import android.util.SparseArray;
|
||||
import android.view.Menu;
|
||||
import android.view.Window;
|
||||
import com.android.internal.view.menu.MenuPresenter;
|
||||
|
||||
/**
|
||||
* Implemented by the top-level decor layout for a window. DecorContentParent offers
|
||||
* entry points for a number of title/window decor features.
|
||||
*/
|
||||
public interface DecorContentParent {
|
||||
void setWindowCallback(Window.Callback cb);
|
||||
void setWindowTitle(CharSequence title);
|
||||
CharSequence getTitle();
|
||||
void initFeature(int windowFeature);
|
||||
void setUiOptions(int uiOptions);
|
||||
boolean hasIcon();
|
||||
boolean hasLogo();
|
||||
void setIcon(int resId);
|
||||
void setIcon(Drawable d);
|
||||
void setLogo(int resId);
|
||||
boolean canShowOverflowMenu();
|
||||
boolean isOverflowMenuShowing();
|
||||
boolean isOverflowMenuShowPending();
|
||||
boolean showOverflowMenu();
|
||||
boolean hideOverflowMenu();
|
||||
void setMenuPrepared();
|
||||
void setMenu(Menu menu, MenuPresenter.Callback cb);
|
||||
void saveToolbarHierarchyState(SparseArray<Parcelable> toolbarStates);
|
||||
void restoreToolbarHierarchyState(SparseArray<Parcelable> toolbarStates);
|
||||
void dismissPopups();
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user