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