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