/*
 * 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;

import com.android.settingslib.animation.AppearAnimationUtils;
import com.android.settingslib.animation.DisappearAnimationUtils;

Displays a PIN pad for unlocking.
/** * Displays a PIN pad for unlocking. */
public class KeyguardPINView extends KeyguardPinBasedInputView { private final AppearAnimationUtils mAppearAnimationUtils; private final DisappearAnimationUtils mDisappearAnimationUtils; private final DisappearAnimationUtils mDisappearAnimationUtilsLocked; private ViewGroup mContainer; private ViewGroup mRow0; private ViewGroup mRow1; private ViewGroup mRow2; private ViewGroup mRow3; private View mDivider; private int mDisappearYTranslation; private View[][] mViews; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; 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.45f /* delayScale */, AnimationUtils.loadInterpolator( mContext, android.R.interpolator.fast_out_linear_in)); mDisappearAnimationUtilsLocked = new DisappearAnimationUtils(context, (long) (125 * KeyguardPatternView.DISAPPEAR_MULTIPLIER_LOCKED), 0.6f /* translationScale */, 0.45f /* delayScale */, AnimationUtils.loadInterpolator( mContext, android.R.interpolator.fast_out_linear_in)); mDisappearYTranslation = getResources().getDimensionPixelSize( R.dimen.disappear_y_translation); mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(context); } @Override protected void resetState() { super.resetState(); mSecurityMessageDisplay.setMessage(""); } @Override protected int getPasswordTextViewId() { return R.id.pinEntry; } @Override protected void onFinishInflate() { super.onFinishInflate(); mContainer = findViewById(R.id.container); mRow0 = findViewById(R.id.row0); mRow1 = findViewById(R.id.row1); mRow2 = findViewById(R.id.row2); mRow3 = 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 }}; View cancelBtn = findViewById(R.id.cancel_button); if (cancelBtn != null) { cancelBtn.setOnClickListener(view -> { mCallback.reset(); }); } } @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()); AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 500 /* duration */, 0, mAppearAnimationUtils.getInterpolator()); mAppearAnimationUtils.startAnimation2d(mViews, new Runnable() { @Override public void run() { enableClipping(true); } }); } @Override public boolean startDisappearAnimation(final Runnable finishRunnable) { enableClipping(false); setTranslationY(0); AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 280 /* duration */, mDisappearYTranslation, mDisappearAnimationUtils.getInterpolator()); DisappearAnimationUtils disappearAnimationUtils = mKeyguardUpdateMonitor .needsSlowUnlockTransition() ? mDisappearAnimationUtilsLocked : mDisappearAnimationUtils; disappearAnimationUtils.startAnimation2d(mViews, new Runnable() { @Override public void run() { enableClipping(true); if (finishRunnable != null) { finishRunnable.run(); } } }); return true; } private void enableClipping(boolean enable) { mContainer.setClipToPadding(enable); mContainer.setClipChildren(enable); mRow1.setClipToPadding(enable); mRow2.setClipToPadding(enable); mRow3.setClipToPadding(enable); setClipChildren(enable); } @Override public boolean hasOverlappingRendering() { return false; } }