diff options
author | Adam Powell <adamp@google.com> | 2014-05-17 14:16:08 -0700 |
---|---|---|
committer | Adam Powell <adamp@google.com> | 2014-05-17 14:16:08 -0700 |
commit | 4369e7d0b087d777e5012e2706acc5be9be47de7 (patch) | |
tree | 015dc13fccfeacf705f451f4f1eefb5ded6a9edc /core/java/com | |
parent | b8b99c0fc0c22d509c500af5eadec8f7edd75c8f (diff) | |
download | frameworks_base-4369e7d0b087d777e5012e2706acc5be9be47de7.zip frameworks_base-4369e7d0b087d777e5012e2706acc5be9be47de7.tar.gz frameworks_base-4369e7d0b087d777e5012e2706acc5be9be47de7.tar.bz2 |
Action bar refactoring, round 1
Decouple PhoneWindow and ActionBarView to allow for using Toolbar in
some circumstances later.
Change-Id: I907743e06c3a1203e21cfd84860a1884c66f3527
Diffstat (limited to 'core/java/com')
3 files changed, 239 insertions, 4 deletions
diff --git a/core/java/com/android/internal/app/WindowDecorActionBar.java b/core/java/com/android/internal/app/WindowDecorActionBar.java index 79a8f44..a238ae3 100644 --- a/core/java/com/android/internal/app/WindowDecorActionBar.java +++ b/core/java/com/android/internal/app/WindowDecorActionBar.java @@ -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); } diff --git a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java index 19d58bf..7ab4bed 100644 --- a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java +++ b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java @@ -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); diff --git a/core/java/com/android/internal/widget/DecorContentParent.java b/core/java/com/android/internal/widget/DecorContentParent.java new file mode 100644 index 0000000..4fa370a --- /dev/null +++ b/core/java/com/android/internal/widget/DecorContentParent.java @@ -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(); + +} |