| /* |
| * 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.systemui.biometrics |
| |
| import android.content.Context |
| import android.graphics.ColorFilter |
| import android.graphics.Paint |
| import android.graphics.Rect |
| import android.graphics.RectF |
| import android.graphics.drawable.Drawable |
| import android.graphics.drawable.ShapeDrawable |
| import android.graphics.drawable.shapes.PathShape |
| import android.util.PathParser |
| import com.android.systemui.res.R |
| |
| private const val DEFAULT_STROKE_WIDTH = 3f |
| |
| /** |
| * Abstract base class for drawable displayed when the finger is not touching the |
| * sensor area. |
| */ |
| abstract class UdfpsDrawable( |
| protected val context: Context, |
| drawableFactory: (Context) -> ShapeDrawable |
| ) : Drawable() { |
| |
| constructor(context: Context) : this(context, defaultFactory) |
| |
| /** Fingerprint affordance. */ |
| val fingerprintDrawable: ShapeDrawable = drawableFactory(context) |
| |
| private var _alpha: Int = 255 // 0 - 255 |
| |
| var strokeWidth: Float = fingerprintDrawable.paint.strokeWidth |
| set(value) { |
| field = value |
| fingerprintDrawable.paint.strokeWidth = value |
| invalidateSelf() |
| } |
| |
| var isDisplayConfigured: Boolean = false |
| set(showing) { |
| if (field == showing) { |
| return |
| } |
| field = showing |
| invalidateSelf() |
| } |
| |
| /** The [sensorRect] coordinates for the sensor area. */ |
| open fun onSensorRectUpdated(sensorRect: RectF) { |
| val margin = sensorRect.height().toInt() / 8 |
| val bounds = Rect( |
| sensorRect.left.toInt() + margin, |
| sensorRect.top.toInt() + margin, |
| sensorRect.right.toInt() - margin, |
| sensorRect.bottom.toInt() - margin |
| ) |
| updateFingerprintIconBounds(bounds) |
| } |
| |
| /** Bounds for the fingerprint icon. */ |
| protected open fun updateFingerprintIconBounds(bounds: Rect) { |
| fingerprintDrawable.bounds = bounds |
| invalidateSelf() |
| } |
| |
| override fun getAlpha(): Int = _alpha |
| |
| override fun setAlpha(alpha: Int) { |
| _alpha = alpha |
| fingerprintDrawable.alpha = alpha |
| invalidateSelf() |
| } |
| |
| override fun setColorFilter(colorFilter: ColorFilter?) {} |
| |
| override fun getOpacity(): Int = 0 |
| } |
| |
| private val defaultFactory = { context: Context -> |
| val fpPath = context.resources.getString(R.string.config_udfpsIcon) |
| val drawable = ShapeDrawable( |
| PathShape(PathParser.createPathFromPathData(fpPath), 72f, 72f) |
| ) |
| drawable.mutate() |
| drawable.paint.style = Paint.Style.STROKE |
| drawable.paint.strokeCap = Paint.Cap.ROUND |
| drawable.paint.strokeWidth = DEFAULT_STROKE_WIDTH |
| drawable |
| } |