13a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn/*
23a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn * Copyright (C) 2012 The Android Open Source Project
33a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn *
43a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
53a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn * you may not use this file except in compliance with the License.
63a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn * You may obtain a copy of the License at
73a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn *
83a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
93a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn *
103a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
113a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
123a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn * See the License for the specific language governing permissions and
143a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn * limitations under the License.
153a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn */
163a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
173a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackbornpackage com.android.internal.widget;
183a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
199b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powellimport android.graphics.Canvas;
209b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powellimport android.graphics.drawable.Drawable;
219b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powellimport android.os.Build;
221dc5f92716189da02aa62f508adb6099061668b5Dianne Hackbornimport android.view.ViewGroup;
233a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackbornimport com.android.internal.app.ActionBarImpl;
243a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
253a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackbornimport android.content.Context;
263a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackbornimport android.content.res.TypedArray;
273a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackbornimport android.graphics.Rect;
283a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackbornimport android.util.AttributeSet;
293a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackbornimport android.view.View;
303a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
313a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn/**
323a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn * Special layout for the containing of an overlay action bar (and its
333a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn * content) to correctly handle fitting system windows when the content
343a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn * has request that its layout ignore them.
353a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn */
361dc5f92716189da02aa62f508adb6099061668b5Dianne Hackbornpublic class ActionBarOverlayLayout extends ViewGroup {
379b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    private static final String TAG = "ActionBarOverlayLayout";
389b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell
393a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    private int mActionBarHeight;
403a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    private ActionBarImpl mActionBar;
413a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    private int mWindowVisibility = View.VISIBLE;
421dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
431dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    // The main UI elements that we handle the layout of.
443a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    private View mContent;
451dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    private View mActionBarBottom;
469b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    private ActionBarContainer mActionBarTop;
471dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
481dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    // Some interior UI elements.
499b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    private ActionBarView mActionBarView;
509b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell
519b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    // Content overlay drawable - generally the action bar's shadow
529b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    private Drawable mWindowContentOverlay;
539b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    private boolean mIgnoreWindowContentOverlay;
541dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
55df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn    private boolean mOverlayMode;
563a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    private int mLastSystemUiVisibility;
571dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    private final Rect mBaseContentInsets = new Rect();
581dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    private final Rect mLastBaseContentInsets = new Rect();
591dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    private final Rect mContentInsets = new Rect();
601dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    private final Rect mBaseInnerInsets = new Rect();
611dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    private final Rect mInnerInsets = new Rect();
621dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    private final Rect mLastInnerInsets = new Rect();
633a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
649b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    static final int[] ATTRS = new int [] {
659b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            com.android.internal.R.attr.actionBarSize,
669b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            com.android.internal.R.attr.windowContentOverlay
673a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    };
683a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
693a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    public ActionBarOverlayLayout(Context context) {
703a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        super(context);
713a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        init(context);
723a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
733a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
743a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    public ActionBarOverlayLayout(Context context, AttributeSet attrs) {
753a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        super(context, attrs);
763a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        init(context);
773a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
783a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
793a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    private void init(Context context) {
809b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        TypedArray ta = getContext().getTheme().obtainStyledAttributes(ATTRS);
813a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        mActionBarHeight = ta.getDimensionPixelSize(0, 0);
829b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        mWindowContentOverlay = ta.getDrawable(1);
839b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        setWillNotDraw(mWindowContentOverlay == null);
843a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        ta.recycle();
859b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell
869b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        mIgnoreWindowContentOverlay = context.getApplicationInfo().targetSdkVersion <
87e8222dddaf2e3da14380101e818d4254899e0c0dChet Haase                Build.VERSION_CODES.KITKAT;
883a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
893a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
909b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    public void setActionBar(ActionBarImpl impl) {
913a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        mActionBar = impl;
923a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (getWindowToken() != null) {
933a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            // This is being initialized after being added to a window;
943a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            // make sure to update all state now.
953a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            mActionBar.setWindowVisibility(mWindowVisibility);
963a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            if (mLastSystemUiVisibility != 0) {
973a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                int newVis = mLastSystemUiVisibility;
983a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                onWindowSystemUiVisibilityChanged(newVis);
993a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                requestFitSystemWindows();
1003a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            }
1013a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
1023a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
1033a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
1049b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    public void setOverlayMode(boolean overlayMode) {
1059b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        mOverlayMode = overlayMode;
1069b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell
1079b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        /*
1089b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell         * Drawing the window content overlay was broken before K so starting to draw it
1099b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell         * again unexpectedly will cause artifacts in some apps. They should fix it.
1109b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell         */
1119b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        mIgnoreWindowContentOverlay = overlayMode &&
1129b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell                getContext().getApplicationInfo().targetSdkVersion <
113e8222dddaf2e3da14380101e818d4254899e0c0dChet Haase                        Build.VERSION_CODES.KITKAT;
1149b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    }
1159b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell
116139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    public void setShowingForActionMode(boolean showing) {
117139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        if (showing) {
118139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // Here's a fun hack: if the status bar is currently being hidden,
119139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // and the application has asked for stable content insets, then
120139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // we will end up with the action mode action bar being shown
121139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // without the status bar, but moved below where the status bar
122139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // would be.  Not nice.  Trying to have this be positioned
123139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // correctly is not easy (basically we need yet *another* content
124139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // inset from the window manager to know where to put it), so
125139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            // instead we will just temporarily force the status bar to be shown.
126139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            if ((getWindowSystemUiVisibility() & (SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
127139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                    | SYSTEM_UI_FLAG_LAYOUT_STABLE))
128139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                    == (SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | SYSTEM_UI_FLAG_LAYOUT_STABLE)) {
129139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn                setDisabledSystemUiVisibility(SYSTEM_UI_FLAG_FULLSCREEN);
130139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            }
131139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        } else {
132139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            setDisabledSystemUiVisibility(0);
133139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        }
134139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn    }
135139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn
1363a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    @Override
1373a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    public void onWindowSystemUiVisibilityChanged(int visible) {
1383a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        super.onWindowSystemUiVisibilityChanged(visible);
1393a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        pullChildren();
1403a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        final int diff = mLastSystemUiVisibility ^ visible;
1413a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        mLastSystemUiVisibility = visible;
1423a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        final boolean barVisible = (visible&SYSTEM_UI_FLAG_FULLSCREEN) == 0;
143139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        final boolean wasVisible = mActionBar != null ? mActionBar.isSystemShowing() : true;
144df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn        final boolean stable = (visible&SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0;
145139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        if (mActionBar != null) {
146df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn            // We want the bar to be visible if it is not being hidden,
147df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn            // or the app has not turned on a stable UI mode (meaning they
148df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn            // are performing explicit layout around the action bar).
149df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn            mActionBar.enableContentAnimations(!stable);
150df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn            if (barVisible || !stable) mActionBar.showForSystem();
151139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            else mActionBar.hideForSystem();
152139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        }
153139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn        if ((diff&SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0) {
1543a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            if (mActionBar != null) {
1553a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                requestFitSystemWindows();
1563a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            }
1573a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
1583a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
1593a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
1603a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    @Override
1613a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    protected void onWindowVisibilityChanged(int visibility) {
1623a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        super.onWindowVisibilityChanged(visibility);
1633a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        mWindowVisibility = visibility;
1643a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (mActionBar != null) {
1653a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            mActionBar.setWindowVisibility(visibility);
1663a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
1673a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
1683a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
1693a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    private boolean applyInsets(View view, Rect insets, boolean left, boolean top,
1703a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            boolean bottom, boolean right) {
1713a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        boolean changed = false;
1721dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        LayoutParams lp = (LayoutParams)view.getLayoutParams();
1733a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (left && lp.leftMargin != insets.left) {
1743a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            changed = true;
1753a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            lp.leftMargin = insets.left;
1763a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
1773a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (top && lp.topMargin != insets.top) {
1783a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            changed = true;
1793a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            lp.topMargin = insets.top;
1803a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
1813a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (right && lp.rightMargin != insets.right) {
1823a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            changed = true;
1833a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            lp.rightMargin = insets.right;
1843a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
1853a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (bottom && lp.bottomMargin != insets.bottom) {
1863a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            changed = true;
1873a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            lp.bottomMargin = insets.bottom;
1883a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
1893a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        return changed;
1903a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
1913a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
1923a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    @Override
1933a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    protected boolean fitSystemWindows(Rect insets) {
1943a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        pullChildren();
1953a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
1963a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        final int vis = getWindowSystemUiVisibility();
1973a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        final boolean stable = (vis & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0;
1983a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
1993a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        // The top and bottom action bars are always within the content area.
2003a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        boolean changed = applyInsets(mActionBarTop, insets, true, true, false, true);
201474690caf8b3bece133b40914979ac2520036989Dianne Hackborn        if (mActionBarBottom != null) {
202474690caf8b3bece133b40914979ac2520036989Dianne Hackborn            changed |= applyInsets(mActionBarBottom, insets, true, false, true, true);
203474690caf8b3bece133b40914979ac2520036989Dianne Hackborn        }
2041dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
2051dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        mBaseInnerInsets.set(insets);
2061dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        computeFitSystemWindows(mBaseInnerInsets, mBaseContentInsets);
2071dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        if (!mLastBaseContentInsets.equals(mBaseContentInsets)) {
2081dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            changed = true;
2091dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            mLastBaseContentInsets.set(mBaseContentInsets);
210fe2b7ccca4c5fdaa0d77968b897bd789f4c87c30Dianne Hackborn        }
2113a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
2121dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        if (changed) {
2131dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            requestLayout();
2143a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
2151dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
2161dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        // We don't do any more at this point.  To correctly compute the content/inner
2171dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        // insets in all cases, we need to know the measured size of the various action
2181dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        // bar elements.  fitSystemWindows() happens before the measure pass, so we can't
2191dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        // do that here.  Instead we will take this up in onMeasure().
2201dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        return true;
2211dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    }
2221dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
2231dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    @Override
2241dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    protected LayoutParams generateDefaultLayoutParams() {
2251dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
2261dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    }
2271dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
2281dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    @Override
2291dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    public LayoutParams generateLayoutParams(AttributeSet attrs) {
2301dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        return new LayoutParams(getContext(), attrs);
2311dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    }
2321dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
2331dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    @Override
2347cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn    protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
2357cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn        return new LayoutParams(p);
2367cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn    }
2377cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn
2387cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn    @Override
2397cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
2407cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn        return p instanceof LayoutParams;
2417cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn    }
2427cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn
2437cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn    @Override
2441dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
245474690caf8b3bece133b40914979ac2520036989Dianne Hackborn        pullChildren();
246474690caf8b3bece133b40914979ac2520036989Dianne Hackborn
2471dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        int maxHeight = 0;
2481dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        int maxWidth = 0;
2491dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        int childState = 0;
2501dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
2511dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        int topInset = 0;
2521dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        int bottomInset = 0;
2531dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
2541dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        measureChildWithMargins(mActionBarTop, widthMeasureSpec, 0, heightMeasureSpec, 0);
2551dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        LayoutParams lp = (LayoutParams) mActionBarTop.getLayoutParams();
2561dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        maxWidth = Math.max(maxWidth,
2571dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                mActionBarTop.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
2581dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        maxHeight = Math.max(maxHeight,
2591dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                mActionBarTop.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
2601dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        childState = combineMeasuredStates(childState, mActionBarTop.getMeasuredState());
2611dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
262474690caf8b3bece133b40914979ac2520036989Dianne Hackborn        // xlarge screen layout doesn't have bottom action bar.
263474690caf8b3bece133b40914979ac2520036989Dianne Hackborn        if (mActionBarBottom != null) {
264474690caf8b3bece133b40914979ac2520036989Dianne Hackborn            measureChildWithMargins(mActionBarBottom, widthMeasureSpec, 0, heightMeasureSpec, 0);
265474690caf8b3bece133b40914979ac2520036989Dianne Hackborn            lp = (LayoutParams) mActionBarBottom.getLayoutParams();
266474690caf8b3bece133b40914979ac2520036989Dianne Hackborn            maxWidth = Math.max(maxWidth,
267474690caf8b3bece133b40914979ac2520036989Dianne Hackborn                    mActionBarBottom.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
268474690caf8b3bece133b40914979ac2520036989Dianne Hackborn            maxHeight = Math.max(maxHeight,
269474690caf8b3bece133b40914979ac2520036989Dianne Hackborn                    mActionBarBottom.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
270474690caf8b3bece133b40914979ac2520036989Dianne Hackborn            childState = combineMeasuredStates(childState, mActionBarBottom.getMeasuredState());
271474690caf8b3bece133b40914979ac2520036989Dianne Hackborn        }
2721dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
2731dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        final int vis = getWindowSystemUiVisibility();
2741dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        final boolean stable = (vis & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0;
2751dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
2761dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        if (stable) {
2771dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            // This is the standard space needed for the action bar.  For stable measurement,
2781dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            // we can't depend on the size currently reported by it -- this must remain constant.
2791dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            topInset = mActionBarHeight;
2801dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            if (mActionBar != null && mActionBar.hasNonEmbeddedTabs()) {
2819b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell                View tabs = mActionBarTop.getTabContainer();
2821dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                if (tabs != null) {
2831dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                    // If tabs are not embedded, increase space on top to account for them.
2841dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                    topInset += mActionBarHeight;
2851dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                }
2863a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            }
2871dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        } else if (mActionBarTop.getVisibility() == VISIBLE) {
2881dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            // This is the space needed on top of the window for all of the action bar
2891dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            // and tabs.
2901dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            topInset = mActionBarTop.getMeasuredHeight();
2913a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
2923a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
2939b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        if (mActionBarView.isSplitActionBar()) {
2941dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            // If action bar is split, adjust bottom insets for it.
295474690caf8b3bece133b40914979ac2520036989Dianne Hackborn            if (mActionBarBottom != null) {
296474690caf8b3bece133b40914979ac2520036989Dianne Hackborn                if (stable) {
297474690caf8b3bece133b40914979ac2520036989Dianne Hackborn                    bottomInset = mActionBarHeight;
298474690caf8b3bece133b40914979ac2520036989Dianne Hackborn                } else {
299474690caf8b3bece133b40914979ac2520036989Dianne Hackborn                    bottomInset = mActionBarBottom.getMeasuredHeight();
300474690caf8b3bece133b40914979ac2520036989Dianne Hackborn                }
3013a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            }
3023a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
3033a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
304df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn        // If the window has not requested system UI layout flags, we need to
305df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn        // make sure its content is not being covered by system UI...  though it
3061dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        // will still be covered by the action bar if they have requested it to
307df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn        // overlay.
3081dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        mContentInsets.set(mBaseContentInsets);
3091dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        mInnerInsets.set(mBaseInnerInsets);
310df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn        if (!mOverlayMode && !stable) {
3111dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            mContentInsets.top += topInset;
3121dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            mContentInsets.bottom += bottomInset;
313df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn        } else {
3141dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            mInnerInsets.top += topInset;
3151dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            mInnerInsets.bottom += bottomInset;
316df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn        }
3171dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        applyInsets(mContent, mContentInsets, true, true, true, true);
318df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn
3191dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        if (!mLastInnerInsets.equals(mInnerInsets)) {
3201dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            // If the inner insets have changed, we need to dispatch this down to
3211dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            // the app's fitSystemWindows().  We do this before measuring the content
3221dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            // view to keep the same semantics as the normal fitSystemWindows() call.
3231dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            mLastInnerInsets.set(mInnerInsets);
3241dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            super.fitSystemWindows(mInnerInsets);
3253a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
3263a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
3271dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        measureChildWithMargins(mContent, widthMeasureSpec, 0, heightMeasureSpec, 0);
3281dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        lp = (LayoutParams) mContent.getLayoutParams();
3291dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        maxWidth = Math.max(maxWidth,
3301dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                mContent.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
3311dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        maxHeight = Math.max(maxHeight,
3321dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                mContent.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
3331dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        childState = combineMeasuredStates(childState, mContent.getMeasuredState());
3341dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
3351dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        // Account for padding too
3361dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        maxWidth += getPaddingLeft() + getPaddingRight();
3371dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        maxHeight += getPaddingTop() + getPaddingBottom();
3381dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
3391dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        // Check against our minimum height and width
3401dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
3411dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
3421dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
3431dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
3441dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                resolveSizeAndState(maxHeight, heightMeasureSpec,
3451dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                        childState << MEASURED_HEIGHT_STATE_SHIFT));
3461dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    }
3471dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
3481dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    @Override
3491dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
3501dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        final int count = getChildCount();
3511dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
3521dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        final int parentLeft = getPaddingLeft();
3531dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        final int parentRight = right - left - getPaddingRight();
3541dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
3551dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        final int parentTop = getPaddingTop();
3561dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        final int parentBottom = bottom - top - getPaddingBottom();
3571dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
3581dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        for (int i = 0; i < count; i++) {
3591dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            final View child = getChildAt(i);
3601dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            if (child.getVisibility() != GONE) {
3611dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
3621dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
3631dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                final int width = child.getMeasuredWidth();
3641dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                final int height = child.getMeasuredHeight();
3651dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
3661dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                int childLeft = parentLeft + lp.leftMargin;
3671dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                int childTop;
3681dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                if (child == mActionBarBottom) {
3691dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                    childTop = parentBottom - height - lp.bottomMargin;
3701dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                } else {
3711dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                    childTop = parentTop + lp.topMargin;
3721dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                }
3731dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
3741dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn                child.layout(childLeft, childTop, childLeft + width, childTop + height);
3751dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            }
3761dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        }
3773a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
3783a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
3797cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn    @Override
3809b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    public void draw(Canvas c) {
3819b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        super.draw(c);
3829b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        if (mWindowContentOverlay != null && !mIgnoreWindowContentOverlay) {
3839b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            final int top = mActionBarTop.getVisibility() == VISIBLE ?
3849b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell                    (int) (mActionBarTop.getBottom() + mActionBarTop.getTranslationY() + 0.5f) : 0;
3859b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            mWindowContentOverlay.setBounds(0, top, getWidth(),
3869b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell                    top + mWindowContentOverlay.getIntrinsicHeight());
3879b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            mWindowContentOverlay.draw(c);
3889b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell        }
3899b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    }
3909b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell
3919b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell    @Override
3927cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn    public boolean shouldDelayChildPressedState() {
3937cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn        return false;
3947cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn    }
3957cf71fbdc3225778d0397b22cdaf40c812c15afbDianne Hackborn
3963a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    void pullChildren() {
3973a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (mContent == null) {
3983a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            mContent = findViewById(com.android.internal.R.id.content);
3999b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            mActionBarTop = (ActionBarContainer)findViewById(
4003a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    com.android.internal.R.id.action_bar_container);
4019b0dc2894df1c3d26aa6196ecdef1989967e6ec9Adam Powell            mActionBarView = (ActionBarView) findViewById(com.android.internal.R.id.action_bar);
4023a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            mActionBarBottom = findViewById(com.android.internal.R.id.split_action_bar);
4033a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
4043a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
4051dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
4061dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
4071dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    public static class LayoutParams extends MarginLayoutParams {
4081dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        public LayoutParams(Context c, AttributeSet attrs) {
4091dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            super(c, attrs);
4101dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        }
4111dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
4121dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        public LayoutParams(int width, int height) {
4131dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            super(width, height);
4141dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        }
4151dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
4161dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        public LayoutParams(ViewGroup.LayoutParams source) {
4171dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            super(source);
4181dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        }
4191dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn
4201dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        public LayoutParams(ViewGroup.MarginLayoutParams source) {
4211dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn            super(source);
4221dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn        }
4231dc5f92716189da02aa62f508adb6099061668b5Dianne Hackborn    }
4243a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn}
425