| /* |
| * Copyright (C) 2021 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.content.res.ColorStateList; |
| import android.content.res.Configuration; |
| import android.graphics.drawable.Drawable; |
| import android.graphics.drawable.RippleDrawable; |
| import android.graphics.drawable.VectorDrawable; |
| import android.util.AttributeSet; |
| import android.view.MotionEvent; |
| |
| import androidx.annotation.Nullable; |
| |
| import com.android.settingslib.Utils; |
| |
| /** |
| * Similar to the {@link NumPadKey}, but displays an image. |
| */ |
| public class NumPadButton extends AlphaOptimizedImageButton { |
| |
| @Nullable |
| private NumPadAnimator mAnimator; |
| private int mOrientation; |
| |
| public NumPadButton(Context context, AttributeSet attrs) { |
| super(context, attrs); |
| |
| Drawable background = getBackground(); |
| if (background instanceof RippleDrawable) { |
| mAnimator = new NumPadAnimator(context, (RippleDrawable) getBackground(), |
| attrs.getStyleAttribute()); |
| } else { |
| mAnimator = null; |
| } |
| } |
| |
| @Override |
| protected void onConfigurationChanged(Configuration newConfig) { |
| mOrientation = newConfig.orientation; |
| } |
| |
| @Override |
| protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { |
| super.onMeasure(widthMeasureSpec, heightMeasureSpec); |
| |
| // Set width/height to the same value to ensure a smooth circle for the bg, but shrink |
| // the height to match the old pin bouncer |
| int width = getMeasuredWidth(); |
| |
| boolean shortenHeight = mAnimator == null |
| || mOrientation == Configuration.ORIENTATION_LANDSCAPE; |
| int height = shortenHeight ? (int) (width * .66f) : width; |
| |
| setMeasuredDimension(getMeasuredWidth(), height); |
| } |
| |
| @Override |
| protected void onLayout(boolean changed, int l, int t, int r, int b) { |
| super.onLayout(changed, l, t, r, b); |
| |
| if (mAnimator != null) mAnimator.onLayout(b - t); |
| } |
| |
| @Override |
| public boolean onTouchEvent(MotionEvent event) { |
| if (event.getActionMasked() == MotionEvent.ACTION_DOWN && mAnimator != null) { |
| mAnimator.start(); |
| } |
| return super.onTouchEvent(event); |
| } |
| |
| /** |
| * Reload colors from resources. |
| **/ |
| public void reloadColors() { |
| if (mAnimator != null) mAnimator.reloadColors(getContext()); |
| |
| int textColor = Utils.getColorAttrDefaultColor(getContext(), |
| android.R.attr.colorBackground); |
| ((VectorDrawable) getDrawable()).setTintList(ColorStateList.valueOf(textColor)); |
| } |
| } |