KeyguardSecurityViewFlipper.java revision eeb6255056b5b0b45026db040edf1136662e847c
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 195737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.content.Context; 209799714f6c69efe50e21a6073b879140e5e792b7Adam Powellimport android.content.res.TypedArray; 215737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.graphics.Rect; 225737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.util.AttributeSet; 239799714f6c69efe50e21a6073b879140e5e792b7Adam Powellimport android.util.Log; 245737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.view.MotionEvent; 255737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.view.View; 269799714f6c69efe50e21a6073b879140e5e792b7Adam Powellimport android.view.ViewGroup; 276fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohenimport android.view.WindowManager; 289799714f6c69efe50e21a6073b879140e5e792b7Adam Powellimport android.widget.FrameLayout; 295737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.widget.ViewFlipper; 305737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 319799714f6c69efe50e21a6073b879140e5e792b7Adam Powellimport com.android.internal.R; 326fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohenimport com.android.internal.widget.LockPatternUtils; 336fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 345737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller/** 355737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * Subclass of the current view flipper that allows us to overload dispatchTouchEvent() so 365737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * we can emulate {@link WindowManager.LayoutParams#FLAG_SLIPPERY} within a view hierarchy. 375737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller * 385737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller */ 396fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohenpublic class KeyguardSecurityViewFlipper extends ViewFlipper implements KeyguardSecurityView { 409799714f6c69efe50e21a6073b879140e5e792b7Adam Powell private static final String TAG = "KeyguardSecurityViewFlipper"; 419799714f6c69efe50e21a6073b879140e5e792b7Adam Powell private static final boolean DEBUG = false; 429799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 435737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller private Rect mTempRect = new Rect(); 445737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 455737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller public KeyguardSecurityViewFlipper(Context context) { 465737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller this(context, null); 475737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller } 485737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 495737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller public KeyguardSecurityViewFlipper(Context context, AttributeSet attr) { 505737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller super(context, attr); 515737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller } 525737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 535737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller @Override 54d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller public boolean onTouchEvent(MotionEvent ev) { 55d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller boolean result = super.onTouchEvent(ev); 565737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller mTempRect.set(0, 0, 0, 0); 575737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller for (int i = 0; i < getChildCount(); i++) { 585737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller View child = getChildAt(i); 595737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller if (child.getVisibility() == View.VISIBLE) { 605737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller offsetRectIntoDescendantCoords(child, mTempRect); 615737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller ev.offsetLocation(mTempRect.left, mTempRect.top); 625737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller result = child.dispatchTouchEvent(ev) || result; 635737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller ev.offsetLocation(-mTempRect.left, -mTempRect.top); 645737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller } 655737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller } 665737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller return result; 675737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller } 685737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller 696fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen KeyguardSecurityView getSecurityView() { 706fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen View child = getChildAt(getDisplayedChild()); 716fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen if (child instanceof KeyguardSecurityView) { 726fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen return (KeyguardSecurityView) child; 736fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 746fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen return null; 756fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 766fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 776fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 786fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void setKeyguardCallback(KeyguardSecurityCallback callback) { 79bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 80bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller if (ksv != null) { 81bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller ksv.setKeyguardCallback(callback); 82bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller } 836fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 846fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 856fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 866fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void setLockPatternUtils(LockPatternUtils utils) { 87bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 88bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller if (ksv != null) { 89bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller ksv.setLockPatternUtils(utils); 90bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller } 916fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 926fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 936fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 946fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void reset() { 95bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 96bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller if (ksv != null) { 97bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller ksv.reset(); 98bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller } 996fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1006fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 1016fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 1026fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void onPause() { 103bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 104bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller if (ksv != null) { 105bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller ksv.onPause(); 106bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller } 1076fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1086fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 1096fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 110a042ac90640c0c3fd3c5349083b86bbfd6319b64Chris Wren public void onResume(int reason) { 111bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 112bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller if (ksv != null) { 113a042ac90640c0c3fd3c5349083b86bbfd6319b64Chris Wren ksv.onResume(reason); 114bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller } 1156fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1166fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 1176fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 1186fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public boolean needsInput() { 119bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 120bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller return (ksv != null) ? ksv.needsInput() : false; 1216fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1226fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 1236fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 1246fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public KeyguardSecurityCallback getCallback() { 125bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller KeyguardSecurityView ksv = getSecurityView(); 126bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller return (ksv != null) ? ksv.getCallback() : null; 1276fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1286fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 1296fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 1306fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void showUsabilityHint() { 1316fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen KeyguardSecurityView ksv = getSecurityView(); 1326fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen if (ksv != null) { 1336fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen ksv.showUsabilityHint(); 1346fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1356fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 136c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren 137c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren @Override 138c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren public void showBouncer(int duration) { 13950bf54584239aa80781f32269396bd2059b2877dChris Wren KeyguardSecurityView active = getSecurityView(); 140c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren for (int i = 0; i < getChildCount(); i++) { 141c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren View child = getChildAt(i); 142c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren if (child instanceof KeyguardSecurityView) { 143c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren KeyguardSecurityView ksv = (KeyguardSecurityView) child; 14450bf54584239aa80781f32269396bd2059b2877dChris Wren ksv.showBouncer(ksv == active ? duration : 0); 145c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 146c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 147c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 148c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren 149c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren @Override 150c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren public void hideBouncer(int duration) { 15150bf54584239aa80781f32269396bd2059b2877dChris Wren KeyguardSecurityView active = getSecurityView(); 152c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren for (int i = 0; i < getChildCount(); i++) { 153c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren View child = getChildAt(i); 154c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren if (child instanceof KeyguardSecurityView) { 155c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren KeyguardSecurityView ksv = (KeyguardSecurityView) child; 15650bf54584239aa80781f32269396bd2059b2877dChris Wren ksv.hideBouncer(ksv == active ? duration : 0); 157c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 158c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 159c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 1609799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 1619799714f6c69efe50e21a6073b879140e5e792b7Adam Powell @Override 1629799714f6c69efe50e21a6073b879140e5e792b7Adam Powell protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 1639799714f6c69efe50e21a6073b879140e5e792b7Adam Powell return p instanceof LayoutParams; 1649799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 1659799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 1669799714f6c69efe50e21a6073b879140e5e792b7Adam Powell @Override 1679799714f6c69efe50e21a6073b879140e5e792b7Adam Powell protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 1689799714f6c69efe50e21a6073b879140e5e792b7Adam Powell return p instanceof LayoutParams ? new LayoutParams((LayoutParams) p) : new LayoutParams(p); 1699799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 1709799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 1719799714f6c69efe50e21a6073b879140e5e792b7Adam Powell @Override 1729799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public LayoutParams generateLayoutParams(AttributeSet attrs) { 1739799714f6c69efe50e21a6073b879140e5e792b7Adam Powell return new LayoutParams(getContext(), attrs); 1749799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 1759799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 1769799714f6c69efe50e21a6073b879140e5e792b7Adam Powell @Override 1779799714f6c69efe50e21a6073b879140e5e792b7Adam Powell protected void onMeasure(int widthSpec, int heightSpec) { 1789799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int widthMode = MeasureSpec.getMode(widthSpec); 1799799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int heightMode = MeasureSpec.getMode(heightSpec); 1809799714f6c69efe50e21a6073b879140e5e792b7Adam Powell if (DEBUG && widthMode != MeasureSpec.AT_MOST) { 1819799714f6c69efe50e21a6073b879140e5e792b7Adam Powell Log.w(TAG, "onMeasure: widthSpec " + MeasureSpec.toString(widthSpec) + 1829799714f6c69efe50e21a6073b879140e5e792b7Adam Powell " should be AT_MOST"); 1839799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 1849799714f6c69efe50e21a6073b879140e5e792b7Adam Powell if (DEBUG && heightMode != MeasureSpec.AT_MOST) { 1859799714f6c69efe50e21a6073b879140e5e792b7Adam Powell Log.w(TAG, "onMeasure: heightSpec " + MeasureSpec.toString(heightSpec) + 1869799714f6c69efe50e21a6073b879140e5e792b7Adam Powell " should be AT_MOST"); 1879799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 1889799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 1899799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int widthSize = MeasureSpec.getSize(widthSpec); 1909799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int heightSize = MeasureSpec.getSize(heightSpec); 1919799714f6c69efe50e21a6073b879140e5e792b7Adam Powell int maxWidth = widthSize; 1929799714f6c69efe50e21a6073b879140e5e792b7Adam Powell int maxHeight = heightSize; 1939799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int count = getChildCount(); 1949799714f6c69efe50e21a6073b879140e5e792b7Adam Powell for (int i = 0; i < count; i++) { 1959799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final View child = getChildAt(i); 1969799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 1979799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 1989799714f6c69efe50e21a6073b879140e5e792b7Adam Powell if (lp.maxWidth > 0 && lp.maxWidth < maxWidth) { 1999799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxWidth = lp.maxWidth; 2009799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2019799714f6c69efe50e21a6073b879140e5e792b7Adam Powell if (lp.maxHeight > 0 && lp.maxHeight < maxHeight) { 2029799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxHeight = lp.maxHeight; 2039799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2049799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2059799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2069799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int wPadding = getPaddingLeft() + getPaddingRight(); 2079799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int hPadding = getPaddingTop() + getPaddingBottom(); 2089799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxWidth -= wPadding; 2099799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxHeight -= hPadding; 2109799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2119799714f6c69efe50e21a6073b879140e5e792b7Adam Powell int width = widthMode == MeasureSpec.EXACTLY ? widthSize : 0; 2129799714f6c69efe50e21a6073b879140e5e792b7Adam Powell int height = heightMode == MeasureSpec.EXACTLY ? heightSize : 0; 2139799714f6c69efe50e21a6073b879140e5e792b7Adam Powell for (int i = 0; i < count; i++) { 2149799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final View child = getChildAt(i); 2159799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 2169799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2179799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int childWidthSpec = makeChildMeasureSpec(maxWidth, lp.width); 2189799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int childHeightSpec = makeChildMeasureSpec(maxHeight, lp.height); 2199799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2209799714f6c69efe50e21a6073b879140e5e792b7Adam Powell child.measure(childWidthSpec, childHeightSpec); 2219799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 222eeb6255056b5b0b45026db040edf1136662e847cAdam Powell width = Math.max(width, Math.min(child.getMeasuredWidth(), widthSize - wPadding)); 223eeb6255056b5b0b45026db040edf1136662e847cAdam Powell height = Math.max(height, Math.min(child.getMeasuredHeight(), heightSize - hPadding)); 2249799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 225eeb6255056b5b0b45026db040edf1136662e847cAdam Powell setMeasuredDimension(width + wPadding, height + hPadding); 2269799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2279799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2289799714f6c69efe50e21a6073b879140e5e792b7Adam Powell private int makeChildMeasureSpec(int maxSize, int childDimen) { 2299799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int mode; 2309799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final int size; 2319799714f6c69efe50e21a6073b879140e5e792b7Adam Powell switch (childDimen) { 2329799714f6c69efe50e21a6073b879140e5e792b7Adam Powell case LayoutParams.WRAP_CONTENT: 2339799714f6c69efe50e21a6073b879140e5e792b7Adam Powell mode = MeasureSpec.AT_MOST; 2349799714f6c69efe50e21a6073b879140e5e792b7Adam Powell size = maxSize; 2359799714f6c69efe50e21a6073b879140e5e792b7Adam Powell break; 2369799714f6c69efe50e21a6073b879140e5e792b7Adam Powell case LayoutParams.MATCH_PARENT: 2379799714f6c69efe50e21a6073b879140e5e792b7Adam Powell mode = MeasureSpec.EXACTLY; 2389799714f6c69efe50e21a6073b879140e5e792b7Adam Powell size = maxSize; 2399799714f6c69efe50e21a6073b879140e5e792b7Adam Powell break; 2409799714f6c69efe50e21a6073b879140e5e792b7Adam Powell default: 2419799714f6c69efe50e21a6073b879140e5e792b7Adam Powell mode = MeasureSpec.EXACTLY; 2429799714f6c69efe50e21a6073b879140e5e792b7Adam Powell size = Math.min(maxSize, childDimen); 2439799714f6c69efe50e21a6073b879140e5e792b7Adam Powell break; 2449799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2459799714f6c69efe50e21a6073b879140e5e792b7Adam Powell return MeasureSpec.makeMeasureSpec(size, mode); 2469799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2479799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2489799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public static class LayoutParams extends FrameLayout.LayoutParams { 2499799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public int maxWidth; 2509799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public int maxHeight; 2519799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2529799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public LayoutParams(ViewGroup.LayoutParams other) { 2539799714f6c69efe50e21a6073b879140e5e792b7Adam Powell super(other); 2549799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2559799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2569799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public LayoutParams(LayoutParams other) { 2579799714f6c69efe50e21a6073b879140e5e792b7Adam Powell super(other); 2589799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2599799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxWidth = other.maxWidth; 2609799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxHeight = other.maxHeight; 2619799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2629799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2639799714f6c69efe50e21a6073b879140e5e792b7Adam Powell public LayoutParams(Context c, AttributeSet attrs) { 2649799714f6c69efe50e21a6073b879140e5e792b7Adam Powell super(c, attrs); 2659799714f6c69efe50e21a6073b879140e5e792b7Adam Powell 2669799714f6c69efe50e21a6073b879140e5e792b7Adam Powell final TypedArray a = c.obtainStyledAttributes(attrs, 2679799714f6c69efe50e21a6073b879140e5e792b7Adam Powell R.styleable.KeyguardSecurityViewFlipper_Layout, 0, 0); 2689799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxWidth = a.getDimensionPixelSize( 2699799714f6c69efe50e21a6073b879140e5e792b7Adam Powell R.styleable.KeyguardSecurityViewFlipper_Layout_layout_maxWidth, 0); 2709799714f6c69efe50e21a6073b879140e5e792b7Adam Powell maxHeight = a.getDimensionPixelSize( 2719799714f6c69efe50e21a6073b879140e5e792b7Adam Powell R.styleable.KeyguardSecurityViewFlipper_Layout_layout_maxHeight, 0); 2729799714f6c69efe50e21a6073b879140e5e792b7Adam Powell a.recycle(); 2739799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2749799714f6c69efe50e21a6073b879140e5e792b7Adam Powell } 2755737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller} 276