169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler/*
269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * Copyright (C) 2012 The Android Open Source Project
369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler *
469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * Licensed under the Apache License, Version 2.0 (the "License");
569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * you may not use this file except in compliance with the License.
669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * You may obtain a copy of the License at
769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler *
869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler *      http://www.apache.org/licenses/LICENSE-2.0
969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler *
1069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * Unless required by applicable law or agreed to in writing, software
1169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * distributed under the License is distributed on an "AS IS" BASIS,
1269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * See the License for the specific language governing permissions and
1469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * limitations under the License.
1569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler */
1669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerpackage com.android.keyguard;
1869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
1969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.content.Context;
201254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurkaimport android.util.AttributeSet;
211254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurkaimport android.view.View;
2215a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggiimport android.view.ViewGroup;
2376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggiimport android.view.animation.AnimationUtils;
2469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
255673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggiimport com.android.settingslib.animation.AppearAnimationUtils;
265673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggiimport com.android.settingslib.animation.DisappearAnimationUtils;
275673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggi
2869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler/**
2969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * Displays a PIN pad for unlocking.
3069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler */
314e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinekpublic class KeyguardPINView extends KeyguardPinBasedInputView {
3269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
3315a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private final AppearAnimationUtils mAppearAnimationUtils;
34f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek    private final DisappearAnimationUtils mDisappearAnimationUtils;
35e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi    private final DisappearAnimationUtils mDisappearAnimationUtilsLocked;
366b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi    private ViewGroup mContainer;
3715a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private ViewGroup mRow0;
3815a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private ViewGroup mRow1;
3915a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private ViewGroup mRow2;
4015a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private ViewGroup mRow3;
4115a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private View mDivider;
4276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    private int mDisappearYTranslation;
43f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek    private View[][] mViews;
44e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
4515a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi
4669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public KeyguardPINView(Context context) {
4769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        this(context, null);
4869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
4969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
5069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public KeyguardPINView(Context context, AttributeSet attrs) {
5169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        super(context, attrs);
5215a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mAppearAnimationUtils = new AppearAnimationUtils(context);
53f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek        mDisappearAnimationUtils = new DisappearAnimationUtils(context,
54f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                125, 0.6f /* translationScale */,
5594f6f0610147de16aae7c39f97f21ee31591dd6fJorim Jaggi                0.45f /* delayScale */, AnimationUtils.loadInterpolator(
56f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        mContext, android.R.interpolator.fast_out_linear_in));
57e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi        mDisappearAnimationUtilsLocked = new DisappearAnimationUtils(context,
58e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi                (long) (125 * KeyguardPatternView.DISAPPEAR_MULTIPLIER_LOCKED),
59e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi                0.6f /* translationScale */,
60e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi                0.45f /* delayScale */, AnimationUtils.loadInterpolator(
61e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi                        mContext, android.R.interpolator.fast_out_linear_in));
6276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        mDisappearYTranslation = getResources().getDimensionPixelSize(
6376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi                R.dimen.disappear_y_translation);
64e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi        mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(context);
6569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
6669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
674db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller    @Override
6869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected void resetState() {
694e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek        super.resetState();
70db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos        mSecurityMessageDisplay.setMessage("");
7169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
7269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
7369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
748a26bf5aea45650a14215d398c7d0909fcf80c43Daniel Sandler    protected int getPasswordTextViewId() {
758a26bf5aea45650a14215d398c7d0909fcf80c43Daniel Sandler        return R.id.pinEntry;
768a26bf5aea45650a14215d398c7d0909fcf80c43Daniel Sandler    }
778a26bf5aea45650a14215d398c7d0909fcf80c43Daniel Sandler
788a26bf5aea45650a14215d398c7d0909fcf80c43Daniel Sandler    @Override
7969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected void onFinishInflate() {
8069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        super.onFinishInflate();
8169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
8251efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette        mContainer = findViewById(R.id.container);
8351efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette        mRow0 = findViewById(R.id.row0);
8451efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette        mRow1 = findViewById(R.id.row1);
8551efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette        mRow2 = findViewById(R.id.row2);
8651efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette        mRow3 = findViewById(R.id.row3);
8715a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mDivider = findViewById(R.id.divider);
88f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek        mViews = new View[][]{
89f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new View[]{
90f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        mRow0, null, null
91f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                },
92f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new View[]{
93f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        findViewById(R.id.key1), findViewById(R.id.key2),
94f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        findViewById(R.id.key3)
95f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                },
96f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new View[]{
97f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        findViewById(R.id.key4), findViewById(R.id.key5),
98f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        findViewById(R.id.key6)
99f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                },
100f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new View[]{
101f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        findViewById(R.id.key7), findViewById(R.id.key8),
102f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        findViewById(R.id.key9)
103f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                },
104f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new View[]{
105f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        null, findViewById(R.id.key0), findViewById(R.id.key_enter)
106f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                },
107f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new View[]{
108f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        null, mEcaView, null
109f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                }};
11069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
1116fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen
1126fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    @Override
1136fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    public void showUsabilityHint() {
1146fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    }
11516d90923149435cc7f565f684d42ecd074712ce5Daniel Sandler
11616d90923149435cc7f565f684d42ecd074712ce5Daniel Sandler    @Override
11716d90923149435cc7f565f684d42ecd074712ce5Daniel Sandler    public int getWrongPasswordStringId() {
11816d90923149435cc7f565f684d42ecd074712ce5Daniel Sandler        return R.string.kg_wrong_pin;
11916d90923149435cc7f565f684d42ecd074712ce5Daniel Sandler    }
120c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi
121c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    @Override
122c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    public void startAppearAnimation() {
12315a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        enableClipping(false);
124fb28c0e129896b17e4906b873bf44eb103ac2a8dJorim Jaggi        setAlpha(1f);
12515a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        setTranslationY(mAppearAnimationUtils.getStartTranslation());
126613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi        AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 500 /* duration */,
127613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi                0, mAppearAnimationUtils.getInterpolator());
1285673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggi        mAppearAnimationUtils.startAnimation2d(mViews,
12915a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi                new Runnable() {
13015a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi                    @Override
13115a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi                    public void run() {
13215a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi                        enableClipping(true);
13315a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi                    }
13415a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi                });
13515a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    }
13615a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi
13776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    @Override
138f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek    public boolean startDisappearAnimation(final Runnable finishRunnable) {
139f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek        enableClipping(false);
140f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek        setTranslationY(0);
141613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi        AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 280 /* duration */,
142613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi                mDisappearYTranslation, mDisappearAnimationUtils.getInterpolator());
143031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi        DisappearAnimationUtils disappearAnimationUtils = mKeyguardUpdateMonitor
144031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi                .needsSlowUnlockTransition()
1456bd3890ff965c443b27d7e9224a34ba1312344abJorim Jaggi                        ? mDisappearAnimationUtilsLocked
1466bd3890ff965c443b27d7e9224a34ba1312344abJorim Jaggi                        : mDisappearAnimationUtils;
147e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi        disappearAnimationUtils.startAnimation2d(mViews,
148f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new Runnable() {
149f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                    @Override
150f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                    public void run() {
151f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        enableClipping(true);
152f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        if (finishRunnable != null) {
153f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                            finishRunnable.run();
154f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        }
155f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                    }
156f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                });
15776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        return true;
15876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    }
15976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
16015a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private void enableClipping(boolean enable) {
1616b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi        mContainer.setClipToPadding(enable);
1626b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi        mContainer.setClipChildren(enable);
16315a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mRow1.setClipToPadding(enable);
16415a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mRow2.setClipToPadding(enable);
16515a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mRow3.setClipToPadding(enable);
16615a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        setClipChildren(enable);
167c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    }
16876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
16976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    @Override
17076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    public boolean hasOverlappingRendering() {
17176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        return false;
17276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    }
1731254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka}
174