blob: c16dfb1ea1a83bc26f530a8bfae1024459ce77aa [file] [log] [blame]
/*
* 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
}