Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bedc0626 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Remove face auth wallpaper" into sc-v2-dev am: d0a44fb7

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16101938

Change-Id: Ia2ac40c7d0861834658d956a0027e576f72c97c8
parents 980942f7 d0a44fb7
Loading
Loading
Loading
Loading
−692 KiB
Loading image diff...
+0 −195
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2020 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.keyguard

import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.content.res.Resources
import android.database.ContentObserver
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.hardware.biometrics.BiometricSourceType
import android.os.Handler
import android.provider.Settings.System.SCREEN_BRIGHTNESS_FLOAT
import android.util.MathUtils
import android.view.View
import android.view.WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE
import android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
import com.android.internal.annotations.VisibleForTesting
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitorCallback
import com.android.systemui.Dumpable
import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.NotificationShadeWindowController
import com.android.systemui.util.settings.GlobalSettings
import com.android.systemui.util.settings.SystemSettings
import java.io.FileDescriptor
import java.io.PrintWriter
import java.lang.Float.max
import java.util.concurrent.TimeUnit

val DEFAULT_ANIMATION_DURATION = TimeUnit.SECONDS.toMillis(4)
val MAX_SCREEN_BRIGHTNESS = 100 // 0..100
val MAX_SCRIM_OPACTY = 50 // 0..100
val DEFAULT_USE_FACE_WALLPAPER = false

/**
 * This class is responsible for ramping up the display brightness (and white overlay) in order
 * to mitigate low light conditions when running face auth without an IR camera.
 */
@SysUISingleton
open class FaceAuthScreenBrightnessController(
    private val notificationShadeWindowController: NotificationShadeWindowController,
    private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
    private val resources: Resources,
    private val globalSettings: GlobalSettings,
    private val systemSettings: SystemSettings,
    private val mainHandler: Handler,
    private val dumpManager: DumpManager,
    private val enabled: Boolean
) : Dumpable {

    private var userDefinedBrightness: Float = 1f
    @VisibleForTesting
    var useFaceAuthWallpaper = globalSettings
            .getInt("sysui.use_face_auth_wallpaper", if (DEFAULT_USE_FACE_WALLPAPER) 1 else 0) == 1
    private val brightnessAnimationDuration = globalSettings
            .getLong("sysui.face_brightness_anim_duration", DEFAULT_ANIMATION_DURATION)
    private val maxScreenBrightness = globalSettings
            .getInt("sysui.face_max_brightness", MAX_SCREEN_BRIGHTNESS) / 100f
    private val maxScrimOpacity = globalSettings
            .getInt("sysui.face_max_scrim_opacity", MAX_SCRIM_OPACTY) / 100f
    private val keyguardUpdateCallback = object : KeyguardUpdateMonitorCallback() {
        override fun onBiometricRunningStateChanged(
            running: Boolean,
            biometricSourceType: BiometricSourceType?
        ) {
            if (biometricSourceType != BiometricSourceType.FACE) {
                return
            }
            // TODO enable only when receiving a low-light error
            overridingBrightness = if (enabled) running else false
        }
    }
    private lateinit var whiteOverlay: View
    private var brightnessAnimator: ValueAnimator? = null
    private var overridingBrightness = false
    set(value) {
        if (field == value) {
            return
        }
        field = value
        brightnessAnimator?.cancel()

        if (!value) {
            notificationShadeWindowController.setFaceAuthDisplayBrightness(BRIGHTNESS_OVERRIDE_NONE)
            if (whiteOverlay.alpha > 0) {
                brightnessAnimator = createAnimator(whiteOverlay.alpha, 0f).apply {
                    duration = 200
                    addUpdateListener {
                        whiteOverlay.alpha = it.animatedValue as Float
                    }
                    addListener(object : AnimatorListenerAdapter() {
                        override fun onAnimationEnd(animation: Animator?) {
                            whiteOverlay.visibility = View.INVISIBLE
                            brightnessAnimator = null
                        }
                    })
                    start()
                }
            }
            return
        }

        val targetBrightness = max(maxScreenBrightness, userDefinedBrightness)
        whiteOverlay.visibility = View.VISIBLE
        brightnessAnimator = createAnimator(0f, 1f).apply {
            duration = brightnessAnimationDuration
            addUpdateListener {
                val progress = it.animatedValue as Float
                val brightnessProgress = MathUtils.constrainedMap(
                        userDefinedBrightness, targetBrightness, 0f, 0.5f, progress)
                val scrimProgress = MathUtils.constrainedMap(
                        0f, maxScrimOpacity, 0.5f, 1f, progress)
                notificationShadeWindowController.setFaceAuthDisplayBrightness(brightnessProgress)
                whiteOverlay.alpha = scrimProgress
            }
            addListener(object : AnimatorListenerAdapter() {
                override fun onAnimationEnd(animation: Animator?) {
                    brightnessAnimator = null
                }
            })
            start()
        }
    }

    @VisibleForTesting
    open fun createAnimator(start: Float, end: Float) = ValueAnimator.ofFloat(start, end)

    /**
     * Returns a bitmap that should be used by the lock screen as a wallpaper, if face auth requires
     * a secure wallpaper.
     */
    var faceAuthWallpaper: Bitmap? = null
    get() {
        val user = KeyguardUpdateMonitor.getCurrentUser()
        if (useFaceAuthWallpaper && keyguardUpdateMonitor.isFaceAuthEnabledForUser(user)) {
            val options = BitmapFactory.Options().apply {
                inScaled = false
            }
            return BitmapFactory.decodeResource(resources, R.drawable.face_auth_wallpaper, options)
        }
        return null
    }
    private set

    fun attach(overlayView: View) {
        whiteOverlay = overlayView
        whiteOverlay.focusable = FLAG_NOT_FOCUSABLE
        whiteOverlay.background = ColorDrawable(Color.WHITE)
        whiteOverlay.isEnabled = false
        whiteOverlay.alpha = 0f
        whiteOverlay.visibility = View.INVISIBLE

        dumpManager.registerDumpable(this.javaClass.name, this)
        keyguardUpdateMonitor.registerCallback(keyguardUpdateCallback)
        systemSettings.registerContentObserver(SCREEN_BRIGHTNESS_FLOAT,
            object : ContentObserver(mainHandler) {
                override fun onChange(selfChange: Boolean) {
                    userDefinedBrightness = systemSettings.getFloat(SCREEN_BRIGHTNESS_FLOAT)
                }
            })
        userDefinedBrightness = systemSettings.getFloat(SCREEN_BRIGHTNESS_FLOAT, 1f)
    }

    override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
        pw.apply {
            println("overridingBrightness: $overridingBrightness")
            println("useFaceAuthWallpaper: $useFaceAuthWallpaper")
            println("brightnessAnimator: $brightnessAnimator")
            println("brightnessAnimationDuration: $brightnessAnimationDuration")
            println("maxScreenBrightness: $maxScreenBrightness")
            println("userDefinedBrightness: $userDefinedBrightness")
            println("enabled: $enabled")
        }
    }
}
 No newline at end of file
+0 −40
Original line number Original line Diff line number Diff line
@@ -20,9 +20,6 @@ import android.annotation.Nullable;
import android.app.trust.TrustManager;
import android.app.trust.TrustManager;
import android.content.Context;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.hardware.face.FaceManager;
import android.os.Handler;
import android.os.PowerManager;
import android.os.PowerManager;


import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternUtils;
@@ -37,17 +34,14 @@ import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.classifier.FalsingCollector;
import com.android.systemui.classifier.FalsingModule;
import com.android.systemui.classifier.FalsingModule;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.keyguard.FaceAuthScreenBrightnessController;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.KeyguardLiftController;
import com.android.systemui.statusbar.phone.KeyguardLiftController;
@@ -59,10 +53,7 @@ import com.android.systemui.unfold.UnfoldLightRevealOverlayAnimation;
import com.android.systemui.unfold.config.UnfoldTransitionConfig;
import com.android.systemui.unfold.config.UnfoldTransitionConfig;
import com.android.systemui.util.DeviceConfigProxy;
import com.android.systemui.util.DeviceConfigProxy;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.settings.GlobalSettings;
import com.android.systemui.util.settings.SystemSettings;


import java.util.Optional;
import java.util.concurrent.Executor;
import java.util.concurrent.Executor;


import dagger.Lazy;
import dagger.Lazy;
@@ -150,35 +141,4 @@ public class KeyguardModule {
        return new KeyguardLiftController(statusBarStateController, asyncSensorManager,
        return new KeyguardLiftController(statusBarStateController, asyncSensorManager,
                keyguardUpdateMonitor, dumpManager);
                keyguardUpdateMonitor, dumpManager);
    }
    }

    @SysUISingleton
    @Provides
    static Optional<FaceAuthScreenBrightnessController> provideFaceAuthScreenBrightnessController(
            Context context,
            NotificationShadeWindowController notificationShadeWindowController,
            @Main Resources resources,
            Handler handler,
            @Nullable FaceManager faceManager,
            PackageManager packageManager,
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            GlobalSettings globalSetting,
            SystemSettings systemSettings,
            DumpManager dumpManager) {
        if (faceManager == null || !packageManager.hasSystemFeature(PackageManager.FEATURE_FACE)) {
            return Optional.empty();
        }

        // Cameras that support "self illumination," via IR for example, don't need low light
        // environment mitigation.
        boolean needsLowLightMitigation = faceManager.getSensorPropertiesInternal().stream()
                .anyMatch((properties) -> !properties.supportsSelfIllumination);
        if (!needsLowLightMitigation) {
            return Optional.empty();
        }

        // currently disabled (doesn't ramp up brightness or use scrim) see b/175918367
        return Optional.of(new FaceAuthScreenBrightnessController(
                notificationShadeWindowController, keyguardUpdateMonitor, resources,
                globalSetting, systemSettings, handler, dumpManager, false));
    }
}
}
+0 −13
Original line number Original line Diff line number Diff line
@@ -45,7 +45,6 @@ import com.android.systemui.Dumpable;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.FaceAuthScreenBrightnessController;
import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.NotificationMediaManager;


import libcore.io.IoUtils;
import libcore.io.IoUtils;
@@ -53,7 +52,6 @@ import libcore.io.IoUtils;
import java.io.FileDescriptor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.Objects;
import java.util.Objects;
import java.util.Optional;


import javax.inject.Inject;
import javax.inject.Inject;


@@ -70,7 +68,6 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
    private final WallpaperManager mWallpaperManager;
    private final WallpaperManager mWallpaperManager;
    private final KeyguardUpdateMonitor mUpdateMonitor;
    private final KeyguardUpdateMonitor mUpdateMonitor;
    private final Handler mH;
    private final Handler mH;
    private final Optional<FaceAuthScreenBrightnessController> mFaceAuthScreenBrightnessController;


    private boolean mCached;
    private boolean mCached;
    private Bitmap mCache;
    private Bitmap mCache;
@@ -86,14 +83,12 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            DumpManager dumpManager,
            DumpManager dumpManager,
            NotificationMediaManager mediaManager,
            NotificationMediaManager mediaManager,
            Optional<FaceAuthScreenBrightnessController> faceAuthScreenBrightnessController,
            @Main Handler mainHandler) {
            @Main Handler mainHandler) {
        dumpManager.registerDumpable(getClass().getSimpleName(), this);
        dumpManager.registerDumpable(getClass().getSimpleName(), this);
        mWallpaperManager = wallpaperManager;
        mWallpaperManager = wallpaperManager;
        mCurrentUserId = ActivityManager.getCurrentUser();
        mCurrentUserId = ActivityManager.getCurrentUser();
        mUpdateMonitor = keyguardUpdateMonitor;
        mUpdateMonitor = keyguardUpdateMonitor;
        mMediaManager = mediaManager;
        mMediaManager = mediaManager;
        mFaceAuthScreenBrightnessController = faceAuthScreenBrightnessController;
        mH = mainHandler;
        mH = mainHandler;


        if (iWallpaperManager != null) {
        if (iWallpaperManager != null) {
@@ -132,14 +127,6 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
            return LoaderResult.success(null);
            return LoaderResult.success(null);
        }
        }


        Bitmap faceAuthWallpaper = null;
        if (mFaceAuthScreenBrightnessController.isPresent()) {
            faceAuthWallpaper = mFaceAuthScreenBrightnessController.get().getFaceAuthWallpaper();
            if (faceAuthWallpaper != null) {
                return LoaderResult.success(faceAuthWallpaper);
            }
        }

        // Prefer the selected user (when specified) over the current user for the FLAG_SET_LOCK
        // Prefer the selected user (when specified) over the current user for the FLAG_SET_LOCK
        // wallpaper.
        // wallpaper.
        final int lockWallpaperUserId =
        final int lockWallpaperUserId =
+0 −10
Original line number Original line Diff line number Diff line
@@ -51,7 +51,6 @@ import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.DejankUtils;
import com.android.systemui.DejankUtils;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManager;
import com.android.systemui.keyguard.FaceAuthScreenBrightnessController;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.navigationbar.NavigationBarView;
import com.android.systemui.navigationbar.NavigationBarView;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.navigationbar.NavigationModeController;
@@ -70,7 +69,6 @@ import com.android.systemui.statusbar.policy.KeyguardStateController;
import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Objects;
import java.util.Objects;
import java.util.Optional;


import javax.inject.Inject;
import javax.inject.Inject;


@@ -109,7 +107,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
    private final ConfigurationController mConfigurationController;
    private final ConfigurationController mConfigurationController;
    private final NavigationModeController mNavigationModeController;
    private final NavigationModeController mNavigationModeController;
    private final NotificationShadeWindowController mNotificationShadeWindowController;
    private final NotificationShadeWindowController mNotificationShadeWindowController;
    private final Optional<FaceAuthScreenBrightnessController> mFaceAuthScreenBrightnessController;
    private final KeyguardBouncer.Factory mKeyguardBouncerFactory;
    private final KeyguardBouncer.Factory mKeyguardBouncerFactory;
    private final WakefulnessLifecycle mWakefulnessLifecycle;
    private final WakefulnessLifecycle mWakefulnessLifecycle;
    private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
    private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
@@ -242,7 +239,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
            DockManager dockManager,
            DockManager dockManager,
            NotificationShadeWindowController notificationShadeWindowController,
            NotificationShadeWindowController notificationShadeWindowController,
            KeyguardStateController keyguardStateController,
            KeyguardStateController keyguardStateController,
            Optional<FaceAuthScreenBrightnessController> faceAuthScreenBrightnessController,
            NotificationMediaManager notificationMediaManager,
            NotificationMediaManager notificationMediaManager,
            KeyguardBouncer.Factory keyguardBouncerFactory,
            KeyguardBouncer.Factory keyguardBouncerFactory,
            WakefulnessLifecycle wakefulnessLifecycle,
            WakefulnessLifecycle wakefulnessLifecycle,
@@ -260,7 +256,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
        mKeyguardUpdateManager = keyguardUpdateMonitor;
        mKeyguardUpdateManager = keyguardUpdateMonitor;
        mStatusBarStateController = sysuiStatusBarStateController;
        mStatusBarStateController = sysuiStatusBarStateController;
        mDockManager = dockManager;
        mDockManager = dockManager;
        mFaceAuthScreenBrightnessController = faceAuthScreenBrightnessController;
        mKeyguardBouncerFactory = keyguardBouncerFactory;
        mKeyguardBouncerFactory = keyguardBouncerFactory;
        mWakefulnessLifecycle = wakefulnessLifecycle;
        mWakefulnessLifecycle = wakefulnessLifecycle;
        mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController;
        mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController;
@@ -285,11 +280,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
        mNotificationContainer = notificationContainer;
        mNotificationContainer = notificationContainer;
        mKeyguardMessageAreaController = mKeyguardMessageAreaFactory.create(
        mKeyguardMessageAreaController = mKeyguardMessageAreaFactory.create(
            KeyguardMessageArea.findSecurityMessageDisplay(container));
            KeyguardMessageArea.findSecurityMessageDisplay(container));
        mFaceAuthScreenBrightnessController.ifPresent((it) -> {
            View overlay = new View(mContext);
            container.addView(overlay);
            it.attach(overlay);
        });


        registerListeners();
        registerListeners();
    }
    }
Loading