/* * Copyright (C) 2022 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.os.RemoteException import android.os.Trace import com.android.systemui.util.concurrency.Execution private const val TAG = "UdfpsDisplayMode" /** * UdfpsDisplayMode configures the display for optimal UDFPS operation. For example, sets the * display refresh rate that's optimal for UDFPS. */ class UdfpsDisplayMode constructor( private val context: Context, private val execution: Execution, private val authController: AuthController, private val logger: UdfpsLogger ) : UdfpsDisplayModeProvider { // The request is reset to null after it's processed. private var currentRequest: Request? = null override fun enable(onEnabled: Runnable?) { execution.isMainThread() logger.v(TAG, "enable") if (currentRequest != null) { logger.e(TAG, "enable | already requested") return } if (authController.udfpsRefreshRateCallback == null) { logger.e(TAG, "enable | mDisplayManagerCallback is null") return } Trace.beginSection("UdfpsDisplayMode.enable") // Track this request in one object. val request = Request(context.displayId) currentRequest = request try { // This method is a misnomer. It has nothing to do with HBM, its purpose is to set // the appropriate display refresh rate. authController.udfpsRefreshRateCallback!!.onRequestEnabled(request.displayId) logger.v(TAG, "enable | requested optimal refresh rate for UDFPS") } catch (e: RemoteException) { logger.e(TAG, "enable", e) } onEnabled?.run() ?: logger.w(TAG, "enable | onEnabled is null") Trace.endSection() } override fun disable(onDisabled: Runnable?) { execution.isMainThread() logger.v(TAG, "disable") val request = currentRequest if (request == null) { logger.w(TAG, "disable | already disabled") return } Trace.beginSection("UdfpsDisplayMode.disable") try { // Allow DisplayManager to unset the UDFPS refresh rate. authController.udfpsRefreshRateCallback!!.onRequestDisabled(request.displayId) logger.v(TAG, "disable | removed the UDFPS refresh rate request") } catch (e: RemoteException) { logger.e(TAG, "disable", e) } currentRequest = null onDisabled?.run() ?: logger.w(TAG, "disable | onDisabled is null") Trace.endSection() } } /** Tracks a request to enable the UDFPS mode. */ private data class Request(val displayId: Int)