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