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