15737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller/* 25737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * Copyright (C) 2012 The Android Open Source Project 35737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * 45737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * Licensed under the Apache License, Version 2.0 (the "License"); 55737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * you may not use this file except in compliance with the License. 65737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * You may obtain a copy of the License at 75737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * 85737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * http://www.apache.org/licenses/LICENSE-2.0 95737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * 105737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * Unless required by applicable law or agreed to in writing, software 115737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * distributed under the License is distributed on an "AS IS" BASIS, 125737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * See the License for the specific language governing permissions and 145737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * limitations under the License. 155737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller */ 165737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 175737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerpackage com.android.internal.policy.impl.keyguard; 185737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 193fbbbb66b671daf4cd6f28b8ecd512bdd2436358Adam Powellimport com.android.internal.R; 203fbbbb66b671daf4cd6f28b8ecd512bdd2436358Adam Powellimport com.android.internal.widget.LockPatternUtils; 213fbbbb66b671daf4cd6f28b8ecd512bdd2436358Adam Powell 225737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.content.Context; 239799714f6c69efe50e21a6073b879140e5e792b7Adam Powellimport android.content.res.TypedArray; 245737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.graphics.Rect; 255737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.util.AttributeSet; 269799714f6c69efe50e21a6073b879140e5e792b7Adam Powellimport android.util.Log; 275737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.view.MotionEvent; 285737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.view.View; 293fbbbb66b671daf4cd6f28b8ecd512bdd2436358Adam Powellimport android.view.ViewDebug; 309799714f6c69efe50e21a6073b879140e5e792b7Adam Powellimport android.view.ViewGroup; 316fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohenimport android.view.WindowManager; 329799714f6c69efe50e21a6073b879140e5e792b7Adam Powellimport android.widget.FrameLayout; 335737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.widget.ViewFlipper; 345737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 355737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller/** 365737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * Subclass of the current view flipper that allows us to overload dispatchTouchEvent() so 375737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * we can emulate {@link WindowManager.LayoutParams#FLAG_SLIPPERY} within a view hierarchy. 385737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * 395737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller */ 406fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohenpublic class KeyguardSecurityViewFlipper extends ViewFlipper implements KeyguardSecurityView { 419799714f6c69efe50e21a6073b879140e5e792b7Adam Powell private static final String TAG = "KeyguardSecurityViewFlipper"; 429799714f6c69efe50e21a6073b879140e5e792b7Adam Powell private static final boolean DEBUG = false; 439799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 445737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller private Rect mTempRect = new Rect(); 455737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 465737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller public KeyguardSecurityViewFlipper(Context context) { 475737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller this(context, null); 485737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller } 495737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 505737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller public KeyguardSecurityViewFlipper(Context context, AttributeSet attr) { 515737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller super(context, attr); 525737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller } 535737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 545737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller @Override 55d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller public boolean onTouchEvent(MotionEvent ev) { 56d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller boolean result = super.onTouchEvent(ev); 575737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller mTempRect.set(0, 0, 0, 0); 585737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller for (int i = 0; i < getChildCount(); i++) { 595737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller View child = getChildAt(i); 605737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller if (child.getVisibility() == View.VISIBLE) { 615737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller offsetRectIntoDescendantCoords(child, mTempRect); 625737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller ev.offsetLocation(mTempRect.left, mTempRect.top); 635737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller result = child.dispatchTouchEvent(ev) || result; 645737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller ev.offsetLocation(-mTempRect.left, -mTempRect.top); 655737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller } 665737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller } 675737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller return result; 685737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller } 695737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 706fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen KeyguardSecurityView getSecurityView() { 716fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen View child = getChildAt(getDisplayedChild()); 726fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen if (child instanceof KeyguardSecurityView) { 736fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen return (KeyguardSecurityView) child; 746fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 756fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen return null; 766fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 776fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 786fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 796fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void setKeyguardCallback(KeyguardSecurityCallback callback) { 80bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 81bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller if (ksv != null) { 82bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller ksv.setKeyguardCallback(callback); 83bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller } 846fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 856fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 866fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 876fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void setLockPatternUtils(LockPatternUtils utils) { 88bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 89bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller if (ksv != null) { 90bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller ksv.setLockPatternUtils(utils); 91bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller } 926fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 936fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 946fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 956fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void reset() { 96bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 97bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller if (ksv != null) { 98bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller ksv.reset(); 99bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller } 1006fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1016fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 1026fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 1036fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void onPause() { 104bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 105bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller if (ksv != null) { 106bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller ksv.onPause(); 107bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller } 1086fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1096fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 1106fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 111a042ac90640c0c3fd3c5349083b86bbfd6319b64Chris Wren public void onResume(int reason) { 112bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 113bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller if (ksv != null) { 114a042ac90640c0c3fd3c5349083b86bbfd6319b64Chris Wren ksv.onResume(reason); 115bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller } 1166fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1176fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 1186fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 1196fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public boolean needsInput() { 120bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 121bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller return (ksv != null) ? ksv.needsInput() : false; 1226fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1236fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 1246fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 1256fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public KeyguardSecurityCallback getCallback() { 126bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 127bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller return (ksv != null) ? ksv.getCallback() : null; 1286fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1296fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 1306fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 1316fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void showUsabilityHint() { 1326fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen KeyguardSecurityView ksv = getSecurityView(); 1336fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen if (ksv != null) { 1346fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen ksv.showUsabilityHint(); 1356fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1366fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 137c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren 138c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren @Override 139c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren public void showBouncer(int duration) { 14050bf54584239aa80781f32269396bd2059b2877dChris Wren KeyguardSecurityView active = getSecurityView(); 141c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren for (int i = 0; i < getChildCount(); i++) { 142c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren View child = getChildAt(i); 143c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren if (child instanceof KeyguardSecurityView) { 144c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren KeyguardSecurityView ksv = (KeyguardSecurityView) child; 14550bf54584239aa80781f32269396bd2059b2877dChris Wren ksv.showBouncer(ksv == active ? duration : 0); 146c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 147c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 148c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 149c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren 150c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren @Override 151c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren public void hideBouncer(int duration) { 15250bf54584239aa80781f32269396bd2059b2877dChris Wren KeyguardSecurityView active = getSecurityView(); 153c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren for (int i = 0; i < getChildCount(); i++) { 154c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren View child = getChildAt(i); 155c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren if (child instanceof KeyguardSecurityView) { 156c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren KeyguardSecurityView ksv = (KeyguardSecurityView) child; 15750bf54584239aa80781f32269396bd2059b2877dChris Wren ksv.hideBouncer(ksv == active ? duration : 0); 158c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 159c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 160c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 1619799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 1629799714f6c69efe50e21a6073b879140e5e792b7Adam Powell @Override 1639799714f6c69efe50e21a6073b879140e5e792b7Adam Powell protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 1649799714f6c69efe50e21a6073b879140e5e792b7Adam Powell return p instanceof LayoutParams; 1659799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 1669799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 1679799714f6c69efe50e21a6073b879140e5e792b7Adam Powell @Override 1689799714f6c69efe50e21a6073b879140e5e792b7Adam Powell protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 1699799714f6c69efe50e21a6073b879140e5e792b7Adam Powell return p instanceof LayoutParams ? new LayoutParams((LayoutParams) p) : new LayoutParams(p); 1709799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 1719799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 1729799714f6c69efe50e21a6073b879140e5e792b7Adam Powell @Override 1739799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public LayoutParams generateLayoutParams(AttributeSet attrs) { 1749799714f6c69efe50e21a6073b879140e5e792b7Adam Powell return new LayoutParams(getContext(), attrs); 1759799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 1769799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 1779799714f6c69efe50e21a6073b879140e5e792b7Adam Powell @Override 1789799714f6c69efe50e21a6073b879140e5e792b7Adam Powell protected void onMeasure(int widthSpec, int heightSpec) { 1799799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int widthMode = MeasureSpec.getMode(widthSpec); 1809799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int heightMode = MeasureSpec.getMode(heightSpec); 1819799714f6c69efe50e21a6073b879140e5e792b7Adam Powell if (DEBUG && widthMode != MeasureSpec.AT_MOST) { 1829799714f6c69efe50e21a6073b879140e5e792b7Adam Powell Log.w(TAG, "onMeasure: widthSpec " + MeasureSpec.toString(widthSpec) + 1839799714f6c69efe50e21a6073b879140e5e792b7Adam Powell " should be AT_MOST"); 1849799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 1859799714f6c69efe50e21a6073b879140e5e792b7Adam Powell if (DEBUG && heightMode != MeasureSpec.AT_MOST) { 1869799714f6c69efe50e21a6073b879140e5e792b7Adam Powell Log.w(TAG, "onMeasure: heightSpec " + MeasureSpec.toString(heightSpec) + 1879799714f6c69efe50e21a6073b879140e5e792b7Adam Powell " should be AT_MOST"); 1889799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 1899799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 1909799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int widthSize = MeasureSpec.getSize(widthSpec); 1919799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int heightSize = MeasureSpec.getSize(heightSpec); 1929799714f6c69efe50e21a6073b879140e5e792b7Adam Powell int maxWidth = widthSize; 1939799714f6c69efe50e21a6073b879140e5e792b7Adam Powell int maxHeight = heightSize; 1949799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int count = getChildCount(); 1959799714f6c69efe50e21a6073b879140e5e792b7Adam Powell for (int i = 0; i < count; i++) { 1969799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final View child = getChildAt(i); 1979799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 1989799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 1999799714f6c69efe50e21a6073b879140e5e792b7Adam Powell if (lp.maxWidth > 0 && lp.maxWidth < maxWidth) { 2009799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxWidth = lp.maxWidth; 2019799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2029799714f6c69efe50e21a6073b879140e5e792b7Adam Powell if (lp.maxHeight > 0 && lp.maxHeight < maxHeight) { 2039799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxHeight = lp.maxHeight; 2049799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2059799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2069799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2079799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int wPadding = getPaddingLeft() + getPaddingRight(); 2089799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int hPadding = getPaddingTop() + getPaddingBottom(); 2099799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxWidth -= wPadding; 2109799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxHeight -= hPadding; 2119799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2129799714f6c69efe50e21a6073b879140e5e792b7Adam Powell int width = widthMode == MeasureSpec.EXACTLY ? widthSize : 0; 2139799714f6c69efe50e21a6073b879140e5e792b7Adam Powell int height = heightMode == MeasureSpec.EXACTLY ? heightSize : 0; 2149799714f6c69efe50e21a6073b879140e5e792b7Adam Powell for (int i = 0; i < count; i++) { 2159799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final View child = getChildAt(i); 2169799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 2179799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2189799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int childWidthSpec = makeChildMeasureSpec(maxWidth, lp.width); 2199799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int childHeightSpec = makeChildMeasureSpec(maxHeight, lp.height); 2209799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2219799714f6c69efe50e21a6073b879140e5e792b7Adam Powell child.measure(childWidthSpec, childHeightSpec); 2229799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 223eeb6255056b5b0b45026db040edf1136662e847cAdam Powell width = Math.max(width, Math.min(child.getMeasuredWidth(), widthSize - wPadding)); 224eeb6255056b5b0b45026db040edf1136662e847cAdam Powell height = Math.max(height, Math.min(child.getMeasuredHeight(), heightSize - hPadding)); 2259799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 226eeb6255056b5b0b45026db040edf1136662e847cAdam Powell setMeasuredDimension(width + wPadding, height + hPadding); 2279799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2289799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2299799714f6c69efe50e21a6073b879140e5e792b7Adam Powell private int makeChildMeasureSpec(int maxSize, int childDimen) { 2309799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int mode; 2319799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int size; 2329799714f6c69efe50e21a6073b879140e5e792b7Adam Powell switch (childDimen) { 2339799714f6c69efe50e21a6073b879140e5e792b7Adam Powell case LayoutParams.WRAP_CONTENT: 2349799714f6c69efe50e21a6073b879140e5e792b7Adam Powell mode = MeasureSpec.AT_MOST; 2359799714f6c69efe50e21a6073b879140e5e792b7Adam Powell size = maxSize; 2369799714f6c69efe50e21a6073b879140e5e792b7Adam Powell break; 2379799714f6c69efe50e21a6073b879140e5e792b7Adam Powell case LayoutParams.MATCH_PARENT: 2389799714f6c69efe50e21a6073b879140e5e792b7Adam Powell mode = MeasureSpec.EXACTLY; 2399799714f6c69efe50e21a6073b879140e5e792b7Adam Powell size = maxSize; 2409799714f6c69efe50e21a6073b879140e5e792b7Adam Powell break; 2419799714f6c69efe50e21a6073b879140e5e792b7Adam Powell default: 2429799714f6c69efe50e21a6073b879140e5e792b7Adam Powell mode = MeasureSpec.EXACTLY; 2439799714f6c69efe50e21a6073b879140e5e792b7Adam Powell size = Math.min(maxSize, childDimen); 2449799714f6c69efe50e21a6073b879140e5e792b7Adam Powell break; 2459799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2469799714f6c69efe50e21a6073b879140e5e792b7Adam Powell return MeasureSpec.makeMeasureSpec(size, mode); 2479799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2489799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2499799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public static class LayoutParams extends FrameLayout.LayoutParams { 2503fbbbb66b671daf4cd6f28b8ecd512bdd2436358Adam Powell @ViewDebug.ExportedProperty(category = "layout") 2519799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public int maxWidth; 2523fbbbb66b671daf4cd6f28b8ecd512bdd2436358Adam Powell 2533fbbbb66b671daf4cd6f28b8ecd512bdd2436358Adam Powell @ViewDebug.ExportedProperty(category = "layout") 2549799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public int maxHeight; 2559799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2569799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public LayoutParams(ViewGroup.LayoutParams other) { 2579799714f6c69efe50e21a6073b879140e5e792b7Adam Powell super(other); 2589799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2599799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2609799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public LayoutParams(LayoutParams other) { 2619799714f6c69efe50e21a6073b879140e5e792b7Adam Powell super(other); 2629799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2639799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxWidth = other.maxWidth; 2649799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxHeight = other.maxHeight; 2659799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2669799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2679799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public LayoutParams(Context c, AttributeSet attrs) { 2689799714f6c69efe50e21a6073b879140e5e792b7Adam Powell super(c, attrs); 2699799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2709799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final TypedArray a = c.obtainStyledAttributes(attrs, 2719799714f6c69efe50e21a6073b879140e5e792b7Adam Powell R.styleable.KeyguardSecurityViewFlipper_Layout, 0, 0); 2729799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxWidth = a.getDimensionPixelSize( 2739799714f6c69efe50e21a6073b879140e5e792b7Adam Powell R.styleable.KeyguardSecurityViewFlipper_Layout_layout_maxWidth, 0); 2749799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxHeight = a.getDimensionPixelSize( 2759799714f6c69efe50e21a6073b879140e5e792b7Adam Powell R.styleable.KeyguardSecurityViewFlipper_Layout_layout_maxHeight, 0); 2769799714f6c69efe50e21a6073b879140e5e792b7Adam Powell a.recycle(); 2779799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2789799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2795737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller} 280