166 lines
5.5 KiB
Java
166 lines
5.5 KiB
Java
/*
|
|
* Copyright (C) 2012 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.keyguard;
|
|
|
|
import android.content.Context;
|
|
import android.util.AttributeSet;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.animation.AnimationUtils;
|
|
|
|
/**
|
|
* Displays a PIN pad for unlocking.
|
|
*/
|
|
public class KeyguardPINView extends KeyguardPinBasedInputView {
|
|
|
|
private final AppearAnimationUtils mAppearAnimationUtils;
|
|
private final DisappearAnimationUtils mDisappearAnimationUtils;
|
|
private ViewGroup mKeyguardBouncerFrame;
|
|
private ViewGroup mRow0;
|
|
private ViewGroup mRow1;
|
|
private ViewGroup mRow2;
|
|
private ViewGroup mRow3;
|
|
private View mDivider;
|
|
private int mDisappearYTranslation;
|
|
private View[][] mViews;
|
|
|
|
public KeyguardPINView(Context context) {
|
|
this(context, null);
|
|
}
|
|
|
|
public KeyguardPINView(Context context, AttributeSet attrs) {
|
|
super(context, attrs);
|
|
mAppearAnimationUtils = new AppearAnimationUtils(context);
|
|
mDisappearAnimationUtils = new DisappearAnimationUtils(context,
|
|
125, 0.6f /* translationScale */,
|
|
0.6f /* delayScale */, AnimationUtils.loadInterpolator(
|
|
mContext, android.R.interpolator.fast_out_linear_in));
|
|
mDisappearYTranslation = getResources().getDimensionPixelSize(
|
|
R.dimen.disappear_y_translation);
|
|
}
|
|
|
|
protected void resetState() {
|
|
super.resetState();
|
|
if (KeyguardUpdateMonitor.getInstance(mContext).getMaxBiometricUnlockAttemptsReached()) {
|
|
mSecurityMessageDisplay.setMessage(R.string.faceunlock_multiple_failures, true);
|
|
} else {
|
|
mSecurityMessageDisplay.setMessage(R.string.kg_pin_instructions, false);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected int getPasswordTextViewId() {
|
|
return R.id.pinEntry;
|
|
}
|
|
|
|
@Override
|
|
protected void onFinishInflate() {
|
|
super.onFinishInflate();
|
|
|
|
mKeyguardBouncerFrame = (ViewGroup) findViewById(R.id.keyguard_bouncer_frame);
|
|
mRow0 = (ViewGroup) findViewById(R.id.row0);
|
|
mRow1 = (ViewGroup) findViewById(R.id.row1);
|
|
mRow2 = (ViewGroup) findViewById(R.id.row2);
|
|
mRow3 = (ViewGroup) findViewById(R.id.row3);
|
|
mDivider = findViewById(R.id.divider);
|
|
mViews = new View[][]{
|
|
new View[]{
|
|
mRow0, null, null
|
|
},
|
|
new View[]{
|
|
findViewById(R.id.key1), findViewById(R.id.key2),
|
|
findViewById(R.id.key3)
|
|
},
|
|
new View[]{
|
|
findViewById(R.id.key4), findViewById(R.id.key5),
|
|
findViewById(R.id.key6)
|
|
},
|
|
new View[]{
|
|
findViewById(R.id.key7), findViewById(R.id.key8),
|
|
findViewById(R.id.key9)
|
|
},
|
|
new View[]{
|
|
null, findViewById(R.id.key0), findViewById(R.id.key_enter)
|
|
},
|
|
new View[]{
|
|
null, mEcaView, null
|
|
}};
|
|
}
|
|
|
|
@Override
|
|
public void showUsabilityHint() {
|
|
}
|
|
|
|
@Override
|
|
public int getWrongPasswordStringId() {
|
|
return R.string.kg_wrong_pin;
|
|
}
|
|
|
|
@Override
|
|
public void startAppearAnimation() {
|
|
enableClipping(false);
|
|
setAlpha(1f);
|
|
setTranslationY(mAppearAnimationUtils.getStartTranslation());
|
|
animate()
|
|
.setDuration(500)
|
|
.setInterpolator(mAppearAnimationUtils.getInterpolator())
|
|
.translationY(0);
|
|
mAppearAnimationUtils.startAnimation(mViews,
|
|
new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
enableClipping(true);
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override
|
|
public boolean startDisappearAnimation(final Runnable finishRunnable) {
|
|
enableClipping(false);
|
|
setTranslationY(0);
|
|
animate()
|
|
.setDuration(280)
|
|
.setInterpolator(mDisappearAnimationUtils.getInterpolator())
|
|
.translationY(mDisappearYTranslation);
|
|
mDisappearAnimationUtils.startAnimation(mViews,
|
|
new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
enableClipping(true);
|
|
if (finishRunnable != null) {
|
|
finishRunnable.run();
|
|
}
|
|
}
|
|
});
|
|
return true;
|
|
}
|
|
|
|
private void enableClipping(boolean enable) {
|
|
mKeyguardBouncerFrame.setClipToPadding(enable);
|
|
mKeyguardBouncerFrame.setClipChildren(enable);
|
|
mRow1.setClipToPadding(enable);
|
|
mRow2.setClipToPadding(enable);
|
|
mRow3.setClipToPadding(enable);
|
|
setClipChildren(enable);
|
|
}
|
|
|
|
@Override
|
|
public boolean hasOverlappingRendering() {
|
|
return false;
|
|
}
|
|
}
|