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
19613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggiimport android.animation.Animator;
20613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggiimport android.animation.ObjectAnimator;
2169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.content.Context;
221254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurkaimport android.util.AttributeSet;
23613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggiimport android.view.RenderNode;
24613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggiimport android.view.RenderNodeAnimator;
251254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurkaimport android.view.View;
2615a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggiimport android.view.ViewGroup;
2776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggiimport android.view.animation.AnimationUtils;
2869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
295673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggiimport com.android.settingslib.animation.AppearAnimationUtils;
305673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggiimport com.android.settingslib.animation.DisappearAnimationUtils;
315673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggi
3269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler/**
3369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * Displays a PIN pad for unlocking.
3469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler */
354e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinekpublic class KeyguardPINView extends KeyguardPinBasedInputView {
3669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
3715a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private final AppearAnimationUtils mAppearAnimationUtils;
38f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek    private final DisappearAnimationUtils mDisappearAnimationUtils;
396b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi    private ViewGroup mContainer;
4015a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private ViewGroup mRow0;
4115a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private ViewGroup mRow1;
4215a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private ViewGroup mRow2;
4315a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private ViewGroup mRow3;
4415a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private View mDivider;
4576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    private int mDisappearYTranslation;
46f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek    private View[][] mViews;
4715a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi
4869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public KeyguardPINView(Context context) {
4969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        this(context, null);
5069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
5169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
5269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public KeyguardPINView(Context context, AttributeSet attrs) {
5369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        super(context, attrs);
5415a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mAppearAnimationUtils = new AppearAnimationUtils(context);
55f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek        mDisappearAnimationUtils = new DisappearAnimationUtils(context,
56f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                125, 0.6f /* translationScale */,
5794f6f0610147de16aae7c39f97f21ee31591dd6fJorim Jaggi                0.45f /* delayScale */, AnimationUtils.loadInterpolator(
58f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        mContext, android.R.interpolator.fast_out_linear_in));
5976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        mDisappearYTranslation = getResources().getDimensionPixelSize(
6076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi                R.dimen.disappear_y_translation);
6169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
6269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
6369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected void resetState() {
644e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek        super.resetState();
658a8941aa1be01fbfca8c4540298cc5de12b6538bJorim Jaggi        mSecurityMessageDisplay.setMessage(R.string.kg_pin_instructions, false);
6669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
6769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
6869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
698a26bf5aea45650a14215d398c7d0909fcf80c43Daniel Sandler    protected int getPasswordTextViewId() {
708a26bf5aea45650a14215d398c7d0909fcf80c43Daniel Sandler        return R.id.pinEntry;
718a26bf5aea45650a14215d398c7d0909fcf80c43Daniel Sandler    }
728a26bf5aea45650a14215d398c7d0909fcf80c43Daniel Sandler
738a26bf5aea45650a14215d398c7d0909fcf80c43Daniel Sandler    @Override
7469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected void onFinishInflate() {
7569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        super.onFinishInflate();
7669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
776b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi        mContainer = (ViewGroup) findViewById(R.id.container);
7815a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mRow0 = (ViewGroup) findViewById(R.id.row0);
7915a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mRow1 = (ViewGroup) findViewById(R.id.row1);
8015a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mRow2 = (ViewGroup) findViewById(R.id.row2);
8115a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mRow3 = (ViewGroup) findViewById(R.id.row3);
8215a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mDivider = findViewById(R.id.divider);
83f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek        mViews = new View[][]{
84f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new View[]{
85f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        mRow0, null, null
86f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                },
87f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new View[]{
88f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        findViewById(R.id.key1), findViewById(R.id.key2),
89f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        findViewById(R.id.key3)
90f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                },
91f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new View[]{
92f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        findViewById(R.id.key4), findViewById(R.id.key5),
93f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        findViewById(R.id.key6)
94f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                },
95f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new View[]{
96f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        findViewById(R.id.key7), findViewById(R.id.key8),
97f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        findViewById(R.id.key9)
98f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                },
99f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new View[]{
100f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        null, findViewById(R.id.key0), findViewById(R.id.key_enter)
101f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                },
102f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new View[]{
103f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        null, mEcaView, null
104f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                }};
10569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
1066fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen
1076fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    @Override
1086fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    public void showUsabilityHint() {
1096fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    }
11016d90923149435cc7f565f684d42ecd074712ce5Daniel Sandler
11116d90923149435cc7f565f684d42ecd074712ce5Daniel Sandler    @Override
11216d90923149435cc7f565f684d42ecd074712ce5Daniel Sandler    public int getWrongPasswordStringId() {
11316d90923149435cc7f565f684d42ecd074712ce5Daniel Sandler        return R.string.kg_wrong_pin;
11416d90923149435cc7f565f684d42ecd074712ce5Daniel Sandler    }
115c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi
116c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    @Override
117c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    public void startAppearAnimation() {
11815a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        enableClipping(false);
119fb28c0e129896b17e4906b873bf44eb103ac2a8dJorim Jaggi        setAlpha(1f);
12015a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        setTranslationY(mAppearAnimationUtils.getStartTranslation());
121613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi        AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 500 /* duration */,
122613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi                0, mAppearAnimationUtils.getInterpolator());
1235673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggi        mAppearAnimationUtils.startAnimation2d(mViews,
12415a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi                new Runnable() {
12515a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi                    @Override
12615a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi                    public void run() {
12715a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi                        enableClipping(true);
12815a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi                    }
12915a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi                });
13015a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    }
13115a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi
13276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    @Override
133f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek    public boolean startDisappearAnimation(final Runnable finishRunnable) {
134f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek        enableClipping(false);
135f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek        setTranslationY(0);
136613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi        AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 280 /* duration */,
137613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi                mDisappearYTranslation, mDisappearAnimationUtils.getInterpolator());
1385673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggi        mDisappearAnimationUtils.startAnimation2d(mViews,
139f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                new Runnable() {
140f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                    @Override
141f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                    public void run() {
142f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        enableClipping(true);
143f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        if (finishRunnable != null) {
144f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                            finishRunnable.run();
145f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                        }
146f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                    }
147f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek                });
14876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        return true;
14976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    }
15076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
15115a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi    private void enableClipping(boolean enable) {
1526b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi        mContainer.setClipToPadding(enable);
1536b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi        mContainer.setClipChildren(enable);
15415a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mRow1.setClipToPadding(enable);
15515a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mRow2.setClipToPadding(enable);
15615a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        mRow3.setClipToPadding(enable);
15715a77f7da856cbed19cb67c75268505a333352f1Jorim Jaggi        setClipChildren(enable);
158c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    }
15976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
16076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    @Override
16176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    public boolean hasOverlappingRendering() {
16276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        return false;
16376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    }
1641254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurka}
165