Merge "Only reset the frozen recents list if touching outside of the mandatory system gesture region" into 24D1-dev
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java
index 1917bd2..8990065 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java
@@ -18,15 +18,10 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.app.ActivityManager;
import android.graphics.Rect;
-import android.os.Bundle;
-import android.window.RemoteTransition;
import com.android.wm.shell.common.annotations.ExternalThread;
-import com.android.internal.logging.InstanceId;
-import com.android.wm.shell.common.split.SplitScreenConstants.PersistentSnapPosition;
import com.android.wm.shell.common.split.SplitScreenConstants.SplitPosition;
import java.util.concurrent.Executor;
@@ -79,12 +74,6 @@
}
}
- /** Launches a pair of tasks into splitscreen */
- void startTasks(int taskId1, @Nullable Bundle options1, int taskId2,
- @Nullable Bundle options2, @SplitPosition int splitPosition,
- @PersistentSnapPosition int snapPosition, @Nullable RemoteTransition remoteTransition,
- InstanceId instanceId);
-
/** Registers listener that gets split screen callback. */
void registerSplitScreenListener(@NonNull SplitScreenListener listener,
@NonNull Executor executor);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
index c27b514..79bc24e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
@@ -494,15 +494,6 @@
return mStageCoordinator.getActivateSplitPosition(taskInfo);
}
- /** Start two tasks in parallel as a splitscreen pair. */
- public void startTasks(int taskId1, @Nullable Bundle options1, int taskId2,
- @Nullable Bundle options2, @SplitPosition int splitPosition,
- @PersistentSnapPosition int snapPosition,
- @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
- mStageCoordinator.startTasks(taskId1, options1, taskId2, options2, splitPosition,
- snapPosition, remoteTransition, instanceId);
- }
-
/**
* Move a task to split select
* @param taskInfo the task being moved to split select
@@ -1115,15 +1106,6 @@
};
@Override
- public void startTasks(int taskId1, @Nullable Bundle options1, int taskId2,
- @Nullable Bundle options2, int splitPosition, int snapPosition,
- @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
- mMainExecutor.execute(() -> SplitScreenController.this.startTasks(
- taskId1, options1, taskId2, options2, splitPosition, snapPosition,
- remoteTransition, instanceId));
- }
-
- @Override
public void registerSplitScreenListener(SplitScreenListener listener, Executor executor) {
if (mExecutors.containsKey(listener)) return;
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index 321ff68..9e0f78c 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -115,17 +115,7 @@
}
flag {
- name: "pss_app_selector_recents_split_screen"
- namespace: "systemui"
- description: "Allows recent apps selected for partial screenshare to be launched in split screen mode"
- bug: "320449039"
- metadata {
- purpose: PURPOSE_BUGFIX
- }
-}
-
-flag {
- name: "notifications_background_icons"
+ name: "notifications_background_media_icons"
namespace: "systemui"
description: "Updates icons for media notifications in the background."
bug: "315143160"
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 45243ee..e181d07 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -718,20 +718,6 @@
<item>26</item> <!-- MOUTH_COVERING_DETECTED -->
</integer-array>
- <!-- Which face help messages to surface when fingerprint is enrolled and device is unfolded.
- Message ids correspond with the acquired ids in BiometricFaceConstants -->
- <integer-array name="config_face_help_msgs_when_fingerprint_enrolled_unfolded">
- <item>3</item> <!-- TOO_DARK -->
- <item>4</item> <!-- TOO_CLOSE -->
- <item>5</item> <!-- TOO_FAR -->
- <item>6</item> <!-- TOO_HIGH -->
- <item>7</item> <!-- TOO_LOW -->
- <item>8</item> <!-- TOO_RIGHT -->
- <item>9</item> <!-- TOO_LEFT -->
- <item>25</item> <!-- DARK_GLASSES -->
- <item>26</item> <!-- MOUTH_COVERING_DETECTED -->
- </integer-array>
-
<!-- Which device wake-ups will trigger passive auth. These values correspond with
PowerManager#WakeReason. -->
<integer-array name="config_face_auth_wake_up_triggers">
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
index 9de71c1..94b1979 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
@@ -629,7 +629,7 @@
if (fpProp != null && fpProp.isAnyUdfpsType()) {
maybeUpdatePositionForUdfps(forceInvalidate /* invalidate */);
}
- if (faceProp != null && mBiometricView.isFaceOnly()) {
+ if (faceProp != null && mBiometricView != null && mBiometricView.isFaceOnly()) {
alwaysUpdatePositionAtScreenBottom(forceInvalidate /* invalidate */);
}
if (fpProp != null && fpProp.sensorType == TYPE_POWER_BUTTON) {
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractor.kt
index 9919f09..846013c 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractor.kt
@@ -30,20 +30,17 @@
import com.android.systemui.deviceentry.shared.model.FingerprintLockoutMessage
import com.android.systemui.deviceentry.shared.model.FingerprintMessage
import com.android.systemui.deviceentry.shared.model.HelpFaceAuthenticationStatus
-import com.android.systemui.keyguard.domain.interactor.DevicePostureInteractor
-import com.android.systemui.keyguard.shared.model.DevicePosture
import com.android.systemui.keyguard.shared.model.ErrorFingerprintAuthenticationStatus
import com.android.systemui.res.R
+import com.android.systemui.util.kotlin.Utils.Companion.toTriple
import com.android.systemui.util.kotlin.sample
import javax.inject.Inject
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterIsInstance
import kotlinx.coroutines.flow.filterNot
import kotlinx.coroutines.flow.flatMapLatest
-import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.merge
@@ -62,7 +59,6 @@
faceAuthInteractor: DeviceEntryFaceAuthInteractor,
private val biometricSettingsInteractor: DeviceEntryBiometricSettingsInteractor,
faceHelpMessageDeferralInteractor: FaceHelpMessageDeferralInteractor,
- devicePostureInteractor: DevicePostureInteractor,
) {
private val faceHelp: Flow<HelpFaceAuthenticationStatus> =
faceAuthInteractor.authenticationStatus.filterIsInstance<HelpFaceAuthenticationStatus>()
@@ -75,18 +71,9 @@
* The acquisition message ids to show message when both fingerprint and face are enrolled and
* enabled for device entry.
*/
- private val coExFaceAcquisitionMsgIdsToShowDefault: Set<Int> =
+ private val coExFaceAcquisitionMsgIdsToShow: Set<Int> =
resources.getIntArray(R.array.config_face_help_msgs_when_fingerprint_enrolled).toSet()
- /**
- * The acquisition message ids to show message when both fingerprint and face are enrolled and
- * enabled for device entry and the device is unfolded.
- */
- private val coExFaceAcquisitionMsgIdsToShowUnfolded: Set<Int> =
- resources
- .getIntArray(R.array.config_face_help_msgs_when_fingerprint_enrolled_unfolded)
- .toSet()
-
private fun ErrorFingerprintAuthenticationStatus.shouldSuppressError(): Boolean {
return isCancellationError() || isPowerPressedError()
}
@@ -135,17 +122,6 @@
}
}
- val coExFaceAcquisitionMsgIdsToShow: Flow<Set<Int>> =
- devicePostureInteractor.posture.map { devicePosture ->
- when (devicePosture) {
- DevicePosture.OPENED -> coExFaceAcquisitionMsgIdsToShowUnfolded
- DevicePosture.UNKNOWN, // Devices without posture support (non-foldable) use UNKNOWN
- DevicePosture.CLOSED,
- DevicePosture.HALF_OPENED,
- DevicePosture.FLIPPED -> coExFaceAcquisitionMsgIdsToShowDefault
- }
- }
-
val fingerprintMessage: Flow<FingerprintMessage> =
merge(
fingerprintErrorMessage,
@@ -153,38 +129,25 @@
fingerprintHelpMessage,
)
- private val filterConditionForFaceHelpMessages:
- Flow<(HelpFaceAuthenticationStatus) -> Boolean> =
- combine(
- biometricSettingsInteractor.isFingerprintAuthEnrolledAndEnabled,
- biometricSettingsInteractor.faceAuthCurrentlyAllowed,
- ::Pair
- )
- .flatMapLatest { (fingerprintEnrolled, faceAuthCurrentlyAllowed) ->
- if (fingerprintEnrolled && faceAuthCurrentlyAllowed) {
- // Show only some face help messages if fingerprint is also enrolled
- coExFaceAcquisitionMsgIdsToShow.map { msgIdsToShow ->
- { helpStatus: HelpFaceAuthenticationStatus ->
- msgIdsToShow.contains(helpStatus.msgId)
- }
- }
- } else if (faceAuthCurrentlyAllowed) {
- // Show all face help messages if only face is enrolled and currently allowed
- flowOf { _: HelpFaceAuthenticationStatus -> true }
- } else {
- flowOf { _: HelpFaceAuthenticationStatus -> false }
- }
- }
-
private val faceHelpMessage: Flow<FaceMessage> =
faceHelp
.filterNot {
// Message deferred to potentially show at face timeout error instead
faceHelpMessageDeferralInteractor.shouldDefer(it.msgId)
}
- .sample(filterConditionForFaceHelpMessages, ::Pair)
- .filter { (helpMessage, filterCondition) -> filterCondition(helpMessage) }
- .map { (status, _) -> FaceMessage(status.msg) }
+ .sample(biometricSettingsInteractor.fingerprintAndFaceEnrolledAndEnabled, ::Pair)
+ .filter { (faceAuthHelpStatus, fingerprintAndFaceEnrolledAndEnabled) ->
+ if (fingerprintAndFaceEnrolledAndEnabled) {
+ // Show only some face help messages if fingerprint is also enrolled
+ coExFaceAcquisitionMsgIdsToShow.contains(faceAuthHelpStatus.msgId)
+ } else {
+ // Show all face help messages if only face is enrolled
+ true
+ }
+ }
+ .sample(biometricSettingsInteractor.faceAuthCurrentlyAllowed, ::toTriple)
+ .filter { (_, _, faceAuthCurrentlyAllowed) -> faceAuthCurrentlyAllowed }
+ .map { (status, _, _) -> FaceMessage(status.msg) }
private val faceFailureMessage: Flow<FaceMessage> =
faceFailure
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/DevicePostureInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/DevicePostureInteractor.kt
deleted file mode 100644
index e48cddb..0000000
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/DevicePostureInteractor.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2024 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.domain.interactor
-
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.keyguard.data.repository.DevicePostureRepository
-import javax.inject.Inject
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-
-/** DevicePosture business logic. */
-@ExperimentalCoroutinesApi
-@SysUISingleton
-class DevicePostureInteractor
-@Inject
-constructor(devicePostureRepository: DevicePostureRepository) {
- val posture = devicePostureRepository.currentDevicePosture
-}
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTask.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTask.kt
index 1fc97e9..e9b4582 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTask.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTask.kt
@@ -18,9 +18,7 @@
import android.annotation.ColorInt
import android.annotation.UserIdInt
-import android.app.ActivityManager.RecentTaskInfo
import android.content.ComponentName
-import com.android.wm.shell.util.SplitBounds
data class RecentTask(
val taskId: Int,
@@ -31,30 +29,3 @@
@ColorInt val colorBackground: Int?,
val isForegroundTask: Boolean,
)
- val userType: UserType,
- val splitBounds: SplitBounds?,
-) {
- constructor(
- taskInfo: RecentTaskInfo,
- isForegroundTask: Boolean,
- userType: UserType,
- splitBounds: SplitBounds? = null
- ) : this(
- taskInfo.taskId,
- taskInfo.displayId,
- taskInfo.userId,
- taskInfo.topActivity,
- taskInfo.baseIntent?.component,
- taskInfo.taskDescription?.backgroundColor,
- isForegroundTask,
- userType,
- splitBounds
- )
-
- enum class UserType {
- STANDARD,
- WORK,
- PRIVATE,
- CLONED
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt
index f6b762b..5dde14b 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/data/RecentTaskListProvider.kt
@@ -55,8 +55,9 @@
val foregroundTaskId1 = foregroundGroup?.taskInfo1?.taskId
val foregroundTaskId2 = foregroundGroup?.taskInfo2?.taskId
val foregroundTaskIds = listOfNotNull(foregroundTaskId1, foregroundTaskId2)
- groupedTasks.flatMap {
- val task1 =
+ groupedTasks
+ .flatMap { listOfNotNull(it.taskInfo1, it.taskInfo2) }
+ .map {
RecentTask(
it.taskId,
it.displayId,
@@ -65,24 +66,8 @@
it.baseIntent?.component,
it.taskDescription?.backgroundColor,
isForegroundTask = it.taskId in foregroundTaskIds && it.isVisible
- it.taskInfo1,
- it.taskInfo1.taskId in foregroundTaskIds && it.taskInfo1.isVisible,
- userManager.getUserInfo(it.taskInfo1.userId).toUserType(),
- it.splitBounds
)
-
- val task2 =
- if (it.taskInfo2 != null) {
- RecentTask(
- it.taskInfo2!!,
- it.taskInfo2!!.taskId in foregroundTaskIds && it.taskInfo2!!.isVisible,
- userManager.getUserInfo(it.taskInfo2!!.userId).toUserType(),
- it.splitBounds
- )
- } else null
-
- listOfNotNull(task1, task2)
- }
+ }
}
private suspend fun RecentTasks.getTasks(): List<GroupedRecentTaskInfo> =
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewController.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewController.kt
index 9549ab1..7c7efd0 100644
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewController.kt
@@ -24,12 +24,9 @@
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.window.RemoteTransition
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.android.systemui.Flags.pssAppSelectorAbruptExitFix
-import com.android.systemui.Flags.pssAppSelectorRecentsSplitScreen
-import com.android.systemui.display.naturalBounds
import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorResultHandler
import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorScope
import com.android.systemui.mediaprojection.appselector.data.RecentTask
@@ -37,11 +34,6 @@
import com.android.systemui.mediaprojection.appselector.view.TaskPreviewSizeProvider.TaskPreviewSizeListener
import com.android.systemui.res.R
import com.android.systemui.util.recycler.HorizontalSpacerItemDecoration
-import com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT
-import com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT
-import com.android.wm.shell.splitscreen.SplitScreen
-import com.android.wm.shell.util.SplitBounds
-import java.util.Optional
import javax.inject.Inject
/**
@@ -56,7 +48,6 @@
private val taskViewSizeProvider: TaskPreviewSizeProvider,
private val activityTaskManager: IActivityTaskManager,
private val resultHandler: MediaProjectionAppSelectorResultHandler,
- private val splitScreen: Optional<SplitScreen>,
) : RecentTaskClickListener, TaskPreviewSizeListener {
private var views: Views? = null
@@ -72,11 +63,11 @@
fun createView(parent: ViewGroup): ViewGroup =
views?.root
?: createRecentViews(parent)
- .also {
- views = it
- lastBoundData?.let { recents -> bind(recents) }
- }
- .root
+ .also {
+ views = it
+ lastBoundData?.let { recents -> bind(recents) }
+ }
+ .root
fun bind(recentTasks: List<RecentTask>) {
views?.apply {
@@ -102,10 +93,8 @@
private fun createRecentViews(parent: ViewGroup): Views {
val recentsRoot =
LayoutInflater.from(parent.context)
- .inflate(R.layout.media_projection_recent_tasks,
- parent, /* attachToRoot= */
- false)
- as ViewGroup
+ .inflate(R.layout.media_projection_recent_tasks, parent, /* attachToRoot= */ false)
+ as ViewGroup
val container =
recentsRoot.requireViewById<View>(R.id.media_projection_recent_tasks_container)
@@ -132,34 +121,18 @@
return Views(recentsRoot, container, progress, recycler)
}
- private fun RecentTask.isLaunchingInSplitScreen(): Boolean {
- return splitScreen.isPresent && splitBounds != null
- }
-
override fun onRecentAppClicked(task: RecentTask, view: View) {
val launchCookie = LaunchCookie()
val activityOptions = createAnimation(task, view)
activityOptions.pendingIntentBackgroundActivityStartMode =
MODE_BACKGROUND_ACTIVITY_START_ALLOWED
- activityOptions.launchDisplayId = task.displayId
activityOptions.setLaunchCookie(launchCookie)
+ activityOptions.launchDisplayId = task.displayId
- val handleResult: () -> Unit = { resultHandler.returnSelectedApp(launchCookie)}
-
- val taskId = task.taskId
- val splitBounds = task.splitBounds
-
- if (pssAppSelectorRecentsSplitScreen() &&
- task.isLaunchingInSplitScreen() &&
- !task.isForegroundTask) {
- startSplitScreenTask(view, taskId, splitBounds!!, handleResult, activityOptions)
- } else {
- activityTaskManager.startActivityFromRecents(taskId, activityOptions.toBundle())
- handleResult()
- }
+ activityTaskManager.startActivityFromRecents(task.taskId, activityOptions.toBundle())
+ resultHandler.returnSelectedApp(launchCookie)
}
-
private fun createAnimation(task: RecentTask, view: View): ActivityOptions =
if (pssAppSelectorAbruptExitFix() && task.isForegroundTask) {
// When the selected task is in the foreground, the scale up animation doesn't work.
@@ -172,14 +145,7 @@
/* startedListener = */ null,
/* finishedListener = */ null
)
- } else if (task.isLaunchingInSplitScreen()) {
- // When the selected task isn't in the foreground, but is launching in split screen,
- // then we don't need to specify an animation, since we'll already be passing a
- // manually built remote animation to SplitScreenController
- ActivityOptions.makeBasic()
} else {
- // The default case is a selected task not in the foreground and launching fullscreen,
- // so for this we can use the default ActivityOptions animation
ActivityOptions.makeScaleUpAnimation(
view,
/* startX= */ 0,
@@ -189,29 +155,6 @@
)
}
- private fun startSplitScreenTask(
- view: View,
- taskId: Int,
- splitBounds: SplitBounds,
- handleResult: () -> Unit,
- activityOptions: ActivityOptions,
- ) {
- val isLeftTopTask = taskId == splitBounds.leftTopTaskId
- val task2Id =
- if (isLeftTopTask) splitBounds.rightBottomTaskId else splitBounds.leftTopTaskId
- val splitPosition =
- if (isLeftTopTask) SPLIT_POSITION_TOP_OR_LEFT else SPLIT_POSITION_BOTTOM_OR_RIGHT
-
- val animationRunner = RemoteRecentSplitTaskTransitionRunner(taskId, task2Id,
- view.locationOnScreen, view.context.display.naturalBounds, handleResult)
- val remoteTransition = RemoteTransition(animationRunner,
- view.context.iApplicationThread, "startSplitScreenTask")
-
- splitScreen.get().startTasks(taskId, activityOptions.toBundle(), task2Id, null,
- splitPosition, splitBounds.snapPosition, remoteTransition, null)
- }
-
-
override fun onTaskSizeChanged(size: Rect) {
views?.recentsContainer?.setTaskHeightSize()
}
@@ -220,12 +163,12 @@
val thumbnailHeight = taskViewSizeProvider.size.height()
val itemHeight =
thumbnailHeight +
- context.resources.getDimensionPixelSize(
- R.dimen.media_projection_app_selector_task_icon_size
- ) +
- context.resources.getDimensionPixelSize(
- R.dimen.media_projection_app_selector_task_icon_margin
- ) * 2
+ context.resources.getDimensionPixelSize(
+ R.dimen.media_projection_app_selector_task_icon_size
+ ) +
+ context.resources.getDimensionPixelSize(
+ R.dimen.media_projection_app_selector_task_icon_margin
+ ) * 2
layoutParams = layoutParams.apply { height = itemHeight }
}
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RemoteRecentSplitTaskTransitionRunner.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RemoteRecentSplitTaskTransitionRunner.kt
deleted file mode 100644
index 9514c4a..0000000
--- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RemoteRecentSplitTaskTransitionRunner.kt
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2024 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.mediaprojection.appselector.view
-
-import android.animation.Animator
-import android.animation.AnimatorListenerAdapter
-import android.animation.AnimatorSet
-import android.animation.ValueAnimator
-import android.annotation.UiThread
-import android.graphics.Rect
-import android.os.IBinder
-import android.os.RemoteException
-import android.util.Log
-import android.view.SurfaceControl
-import android.view.animation.DecelerateInterpolator
-import android.window.IRemoteTransition
-import android.window.IRemoteTransitionFinishedCallback
-import android.window.TransitionInfo
-import android.window.WindowContainerToken
-import com.android.app.viewcapture.ViewCapture
-import com.android.internal.policy.TransitionAnimation
-import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorActivity.Companion.TAG
-
-class RemoteRecentSplitTaskTransitionRunner(
- private val firstTaskId: Int,
- private val secondTaskId: Int,
- private val viewPosition: IntArray,
- private val screenBounds: Rect,
- private val handleResult: () -> Unit,
-) : IRemoteTransition.Stub() {
- override fun startAnimation(
- transition: IBinder?,
- info: TransitionInfo?,
- t: SurfaceControl.Transaction?,
- finishedCallback: IRemoteTransitionFinishedCallback
- ) {
- val launchAnimation = AnimatorSet()
- var rootCandidate =
- info!!.changes.firstOrNull {
- it.taskInfo?.taskId == firstTaskId || it.taskInfo?.taskId == secondTaskId
- }
-
- // If we could not find a proper root candidate, something went wrong.
- check(rootCandidate != null) { "Could not find a split root candidate" }
-
- // Recurse up the tree until parent is null, then we've found our root.
- var parentToken: WindowContainerToken? = rootCandidate.parent
- while (parentToken != null) {
- rootCandidate = info.getChange(parentToken) ?: break
- parentToken = rootCandidate.parent
- }
-
- // Make sure nothing weird happened, like getChange() returning null.
- check(rootCandidate != null) { "Failed to find a root leash" }
-
- // Ending position is the full device screen.
- val startingScale = 0.25f
-
- val startX = viewPosition[0]
- val startY = viewPosition[1]
- val endX = screenBounds.left
- val endY = screenBounds.top
-
- ViewCapture.MAIN_EXECUTOR.execute {
- val progressUpdater = ValueAnimator.ofFloat(0f, 1f)
- with(progressUpdater) {
- interpolator = DecelerateInterpolator(1.5f)
- setDuration(TransitionAnimation.DEFAULT_APP_TRANSITION_DURATION.toLong())
-
- addUpdateListener { valueAnimator ->
- val progress = valueAnimator.animatedFraction
-
- val x = startX + ((endX - startX) * progress)
- val y = startY + ((endY - startY) * progress)
- val scale = startingScale + ((1 - startingScale) * progress)
-
- t!!
- .setPosition(rootCandidate.leash, x, y)
- .setScale(rootCandidate.leash, scale, scale)
- .setAlpha(rootCandidate.leash, progress)
- .apply()
- }
-
- addListener(
- object : AnimatorListenerAdapter() {
- override fun onAnimationEnd(animation: Animator) {
- try {
- onTransitionFinished()
- finishedCallback.onTransitionFinished(null, null)
- } catch (e: RemoteException) {
- Log.e(TAG, "Failed to call transition finished callback", e)
- }
- }
- }
- )
- }
-
- launchAnimation.play(progressUpdater)
- launchAnimation.start()
- }
- }
-
- override fun mergeAnimation(
- transition: IBinder?,
- info: TransitionInfo?,
- t: SurfaceControl.Transaction?,
- mergeTarget: IBinder?,
- finishedCallback: IRemoteTransitionFinishedCallback?
- ) {}
-
- @Throws(RemoteException::class)
- override fun onTransitionConsumed(transition: IBinder, aborted: Boolean) {
- Log.w(TAG, "unexpected consumption of app selector transition: aborted=$aborted")
- }
-
- @UiThread
- private fun onTransitionFinished() {
- // After finished transition, then invoke callback to close the app selector, so that
- // finish animation of app selector does not override the launch animation of the split
- // tasks
- handleResult()
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 0d2b3e1..1963d64 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -97,7 +97,6 @@
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.deviceentry.domain.interactor.BiometricMessageInteractor;
import com.android.systemui.dock.DockManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.keyguard.KeyguardIndication;
@@ -121,6 +120,7 @@
import java.io.PrintWriter;
import java.text.NumberFormat;
+import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;
@@ -181,7 +181,6 @@
private BroadcastReceiver mBroadcastReceiver;
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private KeyguardInteractor mKeyguardInteractor;
- private final BiometricMessageInteractor mBiometricMessageInteractor;
private String mPersistentUnlockMessage;
private String mAlignmentIndication;
private boolean mForceIsDismissible;
@@ -210,7 +209,7 @@
private boolean mBatteryPresent = true;
protected long mChargingTimeRemaining;
private Pair<String, BiometricSourceType> mBiometricErrorMessageToShowOnScreenOn;
- private Set<Integer> mCoExFaceAcquisitionMsgIdsToShow;
+ private final Set<Integer> mCoExFaceAcquisitionMsgIdsToShow;
private final FaceHelpMessageDeferral mFaceAcquiredMessageDeferral;
private boolean mInited;
@@ -228,10 +227,6 @@
mIsActiveDreamLockscreenHosted = isLockscreenHosted;
updateDeviceEntryIndication(false);
};
- @VisibleForTesting
- final Consumer<Set<Integer>> mCoExAcquisitionMsgIdsToShowCallback =
- (Set<Integer> coExFaceAcquisitionMsgIdsToShow) -> mCoExFaceAcquisitionMsgIdsToShow =
- coExFaceAcquisitionMsgIdsToShow;
private final ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() {
@Override
public void onScreenTurnedOn() {
@@ -291,8 +286,7 @@
BouncerMessageInteractor bouncerMessageInteractor,
FeatureFlags flags,
IndicationHelper indicationHelper,
- KeyguardInteractor keyguardInteractor,
- BiometricMessageInteractor biometricMessageInteractor
+ KeyguardInteractor keyguardInteractor
) {
mContext = context;
mBroadcastDispatcher = broadcastDispatcher;
@@ -321,9 +315,14 @@
mFeatureFlags = flags;
mIndicationHelper = indicationHelper;
mKeyguardInteractor = keyguardInteractor;
- mBiometricMessageInteractor = biometricMessageInteractor;
mFaceAcquiredMessageDeferral = faceHelpMessageDeferral.create();
+ mCoExFaceAcquisitionMsgIdsToShow = new HashSet<>();
+ int[] msgIds = context.getResources().getIntArray(
+ com.android.systemui.res.R.array.config_face_help_msgs_when_fingerprint_enrolled);
+ for (int msgId : msgIds) {
+ mCoExFaceAcquisitionMsgIdsToShow.add(msgId);
+ }
mHandler = new Handler(mainLooper) {
@Override
@@ -370,7 +369,7 @@
mIndicationArea = indicationArea;
mTopIndicationView = indicationArea.findViewById(R.id.keyguard_indication_text);
mLockScreenIndicationView = indicationArea.findViewById(
- R.id.keyguard_indication_text_bottom);
+ R.id.keyguard_indication_text_bottom);
mInitialTextColorState = mTopIndicationView != null
? mTopIndicationView.getTextColors() : ColorStateList.valueOf(Color.WHITE);
if (mRotateTextViewController != null) {
@@ -402,10 +401,6 @@
collectFlow(mIndicationArea, mKeyguardInteractor.isActiveDreamLockscreenHosted(),
mIsActiveDreamLockscreenHostedCallback);
}
-
- collectFlow(mIndicationArea,
- mBiometricMessageInteractor.getCoExFaceAcquisitionMsgIdsToShow(),
- mCoExAcquisitionMsgIdsToShowCallback);
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/OemSatelliteInputLog.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/DeviceBasedSatelliteInputLog.kt
similarity index 74%
copy from packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/OemSatelliteInputLog.kt
copy to packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/DeviceBasedSatelliteInputLog.kt
index 252945f..73c015d2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/OemSatelliteInputLog.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/DeviceBasedSatelliteInputLog.kt
@@ -16,11 +16,14 @@
package com.android.systemui.statusbar.pipeline.dagger
-import com.android.systemui.statusbar.pipeline.satellite.data.DeviceBasedSatelliteRepository
import javax.inject.Qualifier
-/** Detailed [DeviceBasedSatelliteRepository] logs */
+/**
+ * Logs for device-based satellite events that are **not** that frequent/chatty.
+ *
+ * For chatty logs, use [VerboseDeviceBasedSatelliteInputLog] instead.
+ */
@Qualifier
@MustBeDocumented
-@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
-annotation class OemSatelliteInputLog
+@Retention(AnnotationRetention.RUNTIME)
+annotation class DeviceBasedSatelliteInputLog
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt
index 3811d6b..9810af7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt
@@ -274,9 +274,16 @@
@Provides
@SysUISingleton
- @OemSatelliteInputLog
- fun provideOemSatelliteInputLog(factory: LogBufferFactory): LogBuffer {
- return factory.create("DeviceBasedSatelliteInputLog", 150)
+ @DeviceBasedSatelliteInputLog
+ fun provideDeviceBasedSatelliteInputLog(factory: LogBufferFactory): LogBuffer {
+ return factory.create("DeviceBasedSatelliteInputLog", 200)
+ }
+
+ @Provides
+ @SysUISingleton
+ @VerboseDeviceBasedSatelliteInputLog
+ fun provideVerboseDeviceBasedSatelliteInputLog(factory: LogBufferFactory): LogBuffer {
+ return factory.create("VerboseDeviceBasedSatelliteInputLog", 200)
}
const val FIRST_MOBILE_SUB_SHOWING_NETWORK_TYPE_ICON =
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/OemSatelliteInputLog.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/VerboseDeviceBasedSatelliteInputLog.kt
similarity index 75%
rename from packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/OemSatelliteInputLog.kt
rename to packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/VerboseDeviceBasedSatelliteInputLog.kt
index 252945f..af68055 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/OemSatelliteInputLog.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/VerboseDeviceBasedSatelliteInputLog.kt
@@ -16,11 +16,14 @@
package com.android.systemui.statusbar.pipeline.dagger
-import com.android.systemui.statusbar.pipeline.satellite.data.DeviceBasedSatelliteRepository
import javax.inject.Qualifier
-/** Detailed [DeviceBasedSatelliteRepository] logs */
+/**
+ * Logs for device-based satellite events that are frequent/chatty.
+ *
+ * For non-chatty logs, use [DeviceBasedSatelliteInputLog] instead.
+ */
@Qualifier
@MustBeDocumented
-@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
-annotation class OemSatelliteInputLog
+@Retention(AnnotationRetention.RUNTIME)
+annotation class VerboseDeviceBasedSatelliteInputLog
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImpl.kt
index 788375d..879aa1d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImpl.kt
@@ -30,7 +30,8 @@
import com.android.systemui.log.core.LogLevel
import com.android.systemui.log.core.MessageInitializer
import com.android.systemui.log.core.MessagePrinter
-import com.android.systemui.statusbar.pipeline.dagger.OemSatelliteInputLog
+import com.android.systemui.statusbar.pipeline.dagger.DeviceBasedSatelliteInputLog
+import com.android.systemui.statusbar.pipeline.dagger.VerboseDeviceBasedSatelliteInputLog
import com.android.systemui.statusbar.pipeline.satellite.data.DeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.data.prod.SatelliteSupport.Companion.whenSupported
import com.android.systemui.statusbar.pipeline.satellite.data.prod.SatelliteSupport.NotSupported
@@ -132,7 +133,8 @@
satelliteManagerOpt: Optional<SatelliteManager>,
@Background private val bgDispatcher: CoroutineDispatcher,
@Application private val scope: CoroutineScope,
- @OemSatelliteInputLog private val logBuffer: LogBuffer,
+ @DeviceBasedSatelliteInputLog private val logBuffer: LogBuffer,
+ @VerboseDeviceBasedSatelliteInputLog private val verboseLogBuffer: LogBuffer,
private val systemClock: SystemClock,
) : DeviceBasedSatelliteRepository {
@@ -233,7 +235,7 @@
private fun signalStrengthFlow(sm: SupportedSatelliteManager) =
conflatedCallbackFlow {
val cb = NtnSignalStrengthCallback { signalStrength ->
- logBuffer.i({ int1 = signalStrength.level }) {
+ verboseLogBuffer.i({ int1 = signalStrength.level }) {
"onNtnSignalStrengthChanged: level=$int1"
}
trySend(signalStrength.level)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt
index 5b954b2..b66ace6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt
@@ -21,7 +21,7 @@
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.log.LogBuffer
import com.android.systemui.log.core.LogLevel
-import com.android.systemui.statusbar.pipeline.dagger.OemSatelliteInputLog
+import com.android.systemui.statusbar.pipeline.dagger.DeviceBasedSatelliteInputLog
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
import com.android.systemui.statusbar.pipeline.satellite.data.DeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.shared.model.SatelliteConnectionState
@@ -48,7 +48,7 @@
deviceProvisioningInteractor: DeviceProvisioningInteractor,
wifiInteractor: WifiInteractor,
@Application scope: CoroutineScope,
- @OemSatelliteInputLog private val logBuffer: LogBuffer,
+ @DeviceBasedSatelliteInputLog private val logBuffer: LogBuffer,
) {
/** Must be observed by any UI showing Satellite iconography */
val isSatelliteAllowed =
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt
index d76fd40..0ed1b9b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt
@@ -24,7 +24,7 @@
import com.android.systemui.log.core.LogLevel
import com.android.systemui.res.R
import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepository
-import com.android.systemui.statusbar.pipeline.dagger.OemSatelliteInputLog
+import com.android.systemui.statusbar.pipeline.dagger.DeviceBasedSatelliteInputLog
import com.android.systemui.statusbar.pipeline.satellite.domain.interactor.DeviceBasedSatelliteInteractor
import com.android.systemui.statusbar.pipeline.satellite.shared.model.SatelliteConnectionState
import com.android.systemui.statusbar.pipeline.satellite.ui.model.SatelliteIconModel
@@ -70,7 +70,7 @@
interactor: DeviceBasedSatelliteInteractor,
@Application scope: CoroutineScope,
airplaneModeRepository: AirplaneModeRepository,
- @OemSatelliteInputLog logBuffer: LogBuffer,
+ @DeviceBasedSatelliteInputLog logBuffer: LogBuffer,
) : DeviceBasedSatelliteViewModel {
private val shouldShowIcon: Flow<Boolean> =
interactor.areAllConnectionsOutOfService.flatMapLatest { allOos ->
diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/Utils.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/Utils.kt
index 405b57a..a88be06 100644
--- a/packages/SystemUI/src/com/android/systemui/util/kotlin/Utils.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/kotlin/Utils.kt
@@ -28,8 +28,6 @@
fun <A, B, C, D> toQuad(a: A, b: B, c: C, d: D) = Quad(a, b, c, d)
fun <A, B, C, D> toQuad(a: A, bcd: Triple<B, C, D>) =
Quad(a, bcd.first, bcd.second, bcd.third)
- fun <A, B, C, D> toQuad(abc: Triple<A, B, C>, d: D) =
- Quad(abc.first, abc.second, abc.third, d)
fun <A, B, C, D, E> toQuint(a: A, b: B, c: C, d: D, e: E) = Quint(a, b, c, d, e)
fun <A, B, C, D, E> toQuint(a: A, bcde: Quad<B, C, D, E>) =
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt
index 13bc8dd..b594f91 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt
@@ -18,6 +18,7 @@
import android.app.ActivityTaskManager
import android.app.admin.DevicePolicyManager
import android.content.pm.PackageManager
+import android.content.res.Configuration
import android.hardware.biometrics.BiometricAuthenticator
import android.hardware.biometrics.BiometricConstants
import android.hardware.biometrics.BiometricManager
@@ -384,6 +385,33 @@
}
@Test
+ fun testAnimateToCredentialUI_rotateCredentialUI() {
+ val container = initializeFingerprintContainer(
+ authenticators = BiometricManager.Authenticators.BIOMETRIC_WEAK or
+ BiometricManager.Authenticators.DEVICE_CREDENTIAL
+ )
+ container.animateToCredentialUI(false)
+ waitForIdleSync()
+
+ assertThat(container.hasCredentialView()).isTrue()
+ assertThat(container.hasBiometricPrompt()).isFalse()
+
+ // Check credential view persists after new attachment
+ container.onAttachedToWindow()
+
+ assertThat(container.hasCredentialView()).isTrue()
+ assertThat(container.hasBiometricPrompt()).isFalse()
+
+ val configuration = Configuration(context.resources.configuration)
+ configuration.orientation = Configuration.ORIENTATION_LANDSCAPE
+ container.dispatchConfigurationChanged(configuration)
+ waitForIdleSync()
+
+ assertThat(container.hasCredentialView()).isTrue()
+ assertThat(container.hasBiometricPrompt()).isFalse()
+ }
+
+ @Test
fun testShowBiometricUI() {
val container = initializeFingerprintContainer()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorControllerTest.kt
index 2536078..44798ea 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorControllerTest.kt
@@ -257,8 +257,6 @@
userId = userId,
colorBackground = 0,
isForegroundTask = isForegroundTask,
- userType = RecentTask.UserType.STANDARD,
- splitBounds = null,
)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt
index c2289c4..b593def 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/data/ShellRecentTaskListProviderTest.kt
@@ -164,8 +164,6 @@
baseIntentComponent = null,
colorBackground = null,
isForegroundTask = false,
- userType = userType,
- splitBounds = null
)
private fun createSingleTask(taskId: Int, isVisible: Boolean = false): GroupedRecentTaskInfo =
diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewControllerTest.kt
index a50922a..ac41073 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewControllerTest.kt
@@ -18,28 +18,22 @@
import android.app.ActivityOptions
import android.app.IActivityTaskManager
-import android.graphics.Rect
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.test.filters.SmallTest
import com.android.systemui.Flags.FLAG_PSS_APP_SELECTOR_ABRUPT_EXIT_FIX
-import com.android.systemui.Flags.FLAG_PSS_APP_SELECTOR_RECENTS_SPLIT_SCREEN
import com.android.systemui.SysuiTestCase
import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorResultHandler
import com.android.systemui.mediaprojection.appselector.data.RecentTask
import com.android.systemui.util.mockito.mock
-import com.android.wm.shell.splitscreen.SplitScreen
-import com.android.wm.shell.util.SplitBounds
import com.google.common.truth.Expect
import com.google.common.truth.Truth.assertThat
-import java.util.Optional
import org.junit.Rule
import org.junit.Test
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers.eq
import org.mockito.Mockito.any
-import org.mockito.Mockito.anyInt
import org.mockito.Mockito.verify
@SmallTest
@@ -52,10 +46,9 @@
private val taskViewSizeProvider = mock<TaskPreviewSizeProvider>()
private val activityTaskManager = mock<IActivityTaskManager>()
private val resultHandler = mock<MediaProjectionAppSelectorResultHandler>()
- private val splitScreen = Optional.of(mock<SplitScreen>())
private val bundleCaptor = ArgumentCaptor.forClass(Bundle::class.java)
- private val fullScreenTask =
+ private val task =
RecentTask(
taskId = 123,
displayId = 456,
@@ -64,22 +57,6 @@
baseIntentComponent = null,
colorBackground = null,
isForegroundTask = false
- isForegroundTask = false,
- userType = RecentTask.UserType.STANDARD,
- splitBounds = null
- )
-
- private val splitScreenTask =
- RecentTask(
- taskId = 123,
- displayId = 456,
- userId = 789,
- topActivityComponent = null,
- baseIntentComponent = null,
- colorBackground = null,
- isForegroundTask = false,
- userType = RecentTask.UserType.STANDARD,
- splitBounds = SplitBounds(Rect(), Rect(), 0, 0, 0)
)
private val taskView =
@@ -92,97 +69,61 @@
tasksAdapterFactory,
taskViewSizeProvider,
activityTaskManager,
- resultHandler,
- splitScreen,
+ resultHandler
)
@Test
- fun onRecentAppClicked_fullScreenTaskWithSameIdIsStartedFromRecents() {
- controller.onRecentAppClicked(fullScreenTask, taskView)
+ fun onRecentAppClicked_taskWithSameIdIsStartedFromRecents() {
+ controller.onRecentAppClicked(task, taskView)
- verify(activityTaskManager).startActivityFromRecents(eq(fullScreenTask.taskId), any())
- }
-
- @Test
- fun onRecentAppClicked_splitScreenTaskWithSameIdIsStartedFromRecents() {
- mSetFlagsRule.enableFlags(FLAG_PSS_APP_SELECTOR_RECENTS_SPLIT_SCREEN)
- controller.onRecentAppClicked(splitScreenTask, taskView)
-
- verify(splitScreen.get())
- .startTasks(
- eq(splitScreenTask.taskId),
- any(),
- anyInt(),
- any(),
- anyInt(),
- anyInt(),
- any(),
- any()
- )
+ verify(activityTaskManager).startActivityFromRecents(eq(task.taskId), any())
}
@Test
fun onRecentAppClicked_launchDisplayIdIsSet() {
- controller.onRecentAppClicked(fullScreenTask, taskView)
+ controller.onRecentAppClicked(task, taskView)
- assertThat(getStartedTaskActivityOptions(fullScreenTask.taskId).launchDisplayId)
- .isEqualTo(fullScreenTask.displayId)
+ assertThat(getStartedTaskActivityOptions().launchDisplayId).isEqualTo(task.displayId)
}
@Test
- fun onRecentAppClicked_fullScreenTaskNotInForeground_usesScaleUpAnimation() {
- assertThat(fullScreenTask.isForegroundTask).isFalse()
- controller.onRecentAppClicked(fullScreenTask, taskView)
+ fun onRecentAppClicked_taskNotInForeground_usesScaleUpAnimation() {
+ controller.onRecentAppClicked(task, taskView)
- assertThat(getStartedTaskActivityOptions(fullScreenTask.taskId).animationType)
+ assertThat(getStartedTaskActivityOptions().animationType)
.isEqualTo(ActivityOptions.ANIM_SCALE_UP)
}
@Test
- fun onRecentAppClicked_fullScreenTaskInForeground_flagOff_usesScaleUpAnimation() {
+ fun onRecentAppClicked_taskInForeground_flagOff_usesScaleUpAnimation() {
mSetFlagsRule.disableFlags(FLAG_PSS_APP_SELECTOR_ABRUPT_EXIT_FIX)
- controller.onRecentAppClicked(fullScreenTask, taskView)
+ controller.onRecentAppClicked(task, taskView)
- assertThat(getStartedTaskActivityOptions(fullScreenTask.taskId).animationType)
+ assertThat(getStartedTaskActivityOptions().animationType)
.isEqualTo(ActivityOptions.ANIM_SCALE_UP)
}
@Test
- fun onRecentAppClicked_fullScreenTaskInForeground_flagOn_usesDefaultAnimation() {
+ fun onRecentAppClicked_taskInForeground_flagOn_usesDefaultAnimation() {
mSetFlagsRule.enableFlags(FLAG_PSS_APP_SELECTOR_ABRUPT_EXIT_FIX)
- assertForegroundTaskUsesDefaultCloseAnimation(fullScreenTask)
- }
-
- @Test
- fun onRecentAppClicked_splitScreenTaskInForeground_flagOn_usesDefaultAnimation() {
- mSetFlagsRule.enableFlags(
- FLAG_PSS_APP_SELECTOR_ABRUPT_EXIT_FIX,
- FLAG_PSS_APP_SELECTOR_RECENTS_SPLIT_SCREEN
- )
- assertForegroundTaskUsesDefaultCloseAnimation(splitScreenTask)
- }
-
- private fun assertForegroundTaskUsesDefaultCloseAnimation(task: RecentTask) {
val foregroundTask = task.copy(isForegroundTask = true)
+
controller.onRecentAppClicked(foregroundTask, taskView)
expect
- .that(getStartedTaskActivityOptions(foregroundTask.taskId).animationType)
+ .that(getStartedTaskActivityOptions().animationType)
.isEqualTo(ActivityOptions.ANIM_CUSTOM)
+ expect.that(getStartedTaskActivityOptions().overrideTaskTransition).isTrue()
expect
- .that(getStartedTaskActivityOptions(foregroundTask.taskId).overrideTaskTransition)
- .isTrue()
- expect
- .that(getStartedTaskActivityOptions(foregroundTask.taskId).customExitResId)
+ .that(getStartedTaskActivityOptions().customExitResId)
.isEqualTo(com.android.internal.R.anim.resolver_close_anim)
- expect
- .that(getStartedTaskActivityOptions(foregroundTask.taskId).customEnterResId)
- .isEqualTo(0)
+ expect.that(getStartedTaskActivityOptions().customEnterResId).isEqualTo(0)
}
- private fun getStartedTaskActivityOptions(taskId: Int): ActivityOptions {
- verify(activityTaskManager).startActivityFromRecents(eq(taskId), bundleCaptor.capture())
+ private fun getStartedTaskActivityOptions(): ActivityOptions {
+ verify(activityTaskManager)
+ .startActivityFromRecents(eq(task.taskId), bundleCaptor.capture())
return ActivityOptions.fromBundle(bundleCaptor.value)
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerBaseTest.java
index fe066ca2..2bd0d79 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerBaseTest.java
@@ -32,8 +32,6 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static java.util.Collections.emptySet;
-
import android.app.AlarmManager;
import android.app.Instrumentation;
import android.app.admin.DevicePolicyManager;
@@ -64,7 +62,6 @@
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor;
import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.deviceentry.domain.interactor.BiometricMessageInteractor;
import com.android.systemui.dock.DockManager;
import com.android.systemui.flags.FakeFeatureFlags;
import com.android.systemui.keyguard.KeyguardIndication;
@@ -84,8 +81,6 @@
import com.android.systemui.util.time.FakeSystemClock;
import com.android.systemui.util.wakelock.WakeLockFake;
-import kotlinx.coroutines.flow.StateFlow;
-
import org.junit.After;
import org.junit.Before;
import org.mockito.ArgumentCaptor;
@@ -148,8 +143,6 @@
@Mock
protected AlternateBouncerInteractor mAlternateBouncerInteractor;
@Mock
- protected BiometricMessageInteractor mBiometricMessageInteractor;
- @Mock
protected ScreenLifecycle mScreenLifecycle;
@Mock
protected AuthController mAuthController;
@@ -233,8 +226,6 @@
when(mDevicePolicyResourcesManager.getString(anyString(), any(), anyString()))
.thenReturn(mDisclosureWithOrganization);
when(mUserTracker.getUserId()).thenReturn(mCurrentUserId);
- when(mBiometricMessageInteractor.getCoExFaceAcquisitionMsgIdsToShow())
- .thenReturn(mock(StateFlow.class));
when(mFaceHelpMessageDeferralFactory.create()).thenReturn(mFaceHelpMessageDeferral);
@@ -278,12 +269,10 @@
mock(BouncerMessageInteractor.class),
mFlags,
mIndicationHelper,
- KeyguardInteractorFactory.create(mFlags).getKeyguardInteractor(),
- mBiometricMessageInteractor
+ KeyguardInteractorFactory.create(mFlags).getKeyguardInteractor()
);
mController.init();
mController.setIndicationArea(mIndicationArea);
- mController.mCoExAcquisitionMsgIdsToShowCallback.accept(emptySet());
verify(mStatusBarStateController).addCallback(mStatusBarStateListenerCaptor.capture());
mStatusBarStateListener = mStatusBarStateListenerCaptor.getValue();
verify(mBroadcastDispatcher).registerReceiver(mBroadcastReceiverCaptor.capture(), any());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
index 13b521b..1504d4c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java
@@ -88,8 +88,8 @@
import java.util.Set;
@SmallTest
-@RunWith(AndroidJUnit4.class)
-@TestableLooper.RunWithLooper(setAsMainLooper = true)
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
public class KeyguardIndicationControllerTest extends KeyguardIndicationControllerBaseTest {
@Test
public void afterFaceLockout_skipShowingFaceNotRecognized() {
@@ -131,11 +131,14 @@
@Test
public void onAlignmentStateChanged_showsSlowChargingIndication() {
- createController();
- verify(mDockManager).addAlignmentStateListener(mAlignmentListener.capture());
- mController.setVisible(true);
+ mInstrumentation.runOnMainSync(() -> {
+ createController();
+ verify(mDockManager).addAlignmentStateListener(mAlignmentListener.capture());
+ mController.setVisible(true);
- mAlignmentListener.getValue().onAlignmentStateChanged(DockManager.ALIGN_STATE_POOR);
+ mAlignmentListener.getValue().onAlignmentStateChanged(DockManager.ALIGN_STATE_POOR);
+ });
+ mInstrumentation.waitForIdleSync();
mTestableLooper.processAllMessages();
verifyIndicationMessage(INDICATION_TYPE_ALIGNMENT,
@@ -146,11 +149,14 @@
@Test
public void onAlignmentStateChanged_showsNotChargingIndication() {
- createController();
- verify(mDockManager).addAlignmentStateListener(mAlignmentListener.capture());
- mController.setVisible(true);
+ mInstrumentation.runOnMainSync(() -> {
+ createController();
+ verify(mDockManager).addAlignmentStateListener(mAlignmentListener.capture());
+ mController.setVisible(true);
- mAlignmentListener.getValue().onAlignmentStateChanged(DockManager.ALIGN_STATE_TERRIBLE);
+ mAlignmentListener.getValue().onAlignmentStateChanged(DockManager.ALIGN_STATE_TERRIBLE);
+ });
+ mInstrumentation.waitForIdleSync();
mTestableLooper.processAllMessages();
verifyIndicationMessage(INDICATION_TYPE_ALIGNMENT,
@@ -162,12 +168,15 @@
@FlakyTest(bugId = 279944472)
@Test
public void onAlignmentStateChanged_whileDozing_showsSlowChargingIndication() {
- createController();
- verify(mDockManager).addAlignmentStateListener(mAlignmentListener.capture());
- mController.setVisible(true);
- mStatusBarStateListener.onDozingChanged(true);
+ mInstrumentation.runOnMainSync(() -> {
+ createController();
+ verify(mDockManager).addAlignmentStateListener(mAlignmentListener.capture());
+ mController.setVisible(true);
+ mStatusBarStateListener.onDozingChanged(true);
- mAlignmentListener.getValue().onAlignmentStateChanged(DockManager.ALIGN_STATE_POOR);
+ mAlignmentListener.getValue().onAlignmentStateChanged(DockManager.ALIGN_STATE_POOR);
+ });
+ mInstrumentation.waitForIdleSync();
mTestableLooper.processAllMessages();
assertThat(mTextView.getText()).isEqualTo(
@@ -178,12 +187,15 @@
@Test
public void onAlignmentStateChanged_whileDozing_showsNotChargingIndication() {
- createController();
- verify(mDockManager).addAlignmentStateListener(mAlignmentListener.capture());
- mController.setVisible(true);
- mStatusBarStateListener.onDozingChanged(true);
+ mInstrumentation.runOnMainSync(() -> {
+ createController();
+ verify(mDockManager).addAlignmentStateListener(mAlignmentListener.capture());
+ mController.setVisible(true);
+ mStatusBarStateListener.onDozingChanged(true);
- mAlignmentListener.getValue().onAlignmentStateChanged(DockManager.ALIGN_STATE_TERRIBLE);
+ mAlignmentListener.getValue().onAlignmentStateChanged(DockManager.ALIGN_STATE_TERRIBLE);
+ });
+ mInstrumentation.waitForIdleSync();
mTestableLooper.processAllMessages();
assertThat(mTextView.getText()).isEqualTo(
@@ -630,12 +642,6 @@
@Test
public void sendFaceHelpMessages_fingerprintEnrolled() {
createController();
- mController.mCoExAcquisitionMsgIdsToShowCallback.accept(
- Set.of(
- BiometricFaceConstants.FACE_ACQUIRED_MOUTH_COVERING_DETECTED,
- BiometricFaceConstants.FACE_ACQUIRED_DARK_GLASSES_DETECTED
- )
- );
// GIVEN unlocking with fingerprint is possible and allowed
fingerprintUnlockIsPossibleAndAllowed();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt
index 77e48bff..8debe29d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt
@@ -88,7 +88,8 @@
Optional.empty(),
dispatcher,
testScope.backgroundScope,
- FakeLogBuffer.Factory.create(),
+ logBuffer = FakeLogBuffer.Factory.create(),
+ verboseLogBuffer = FakeLogBuffer.Factory.create(),
systemClock,
)
@@ -382,7 +383,8 @@
if (satMan != null) Optional.of(satMan) else Optional.empty(),
dispatcher,
testScope.backgroundScope,
- FakeLogBuffer.Factory.create(),
+ logBuffer = FakeLogBuffer.Factory.create(),
+ verboseLogBuffer = FakeLogBuffer.Factory.create(),
systemClock,
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractorKosmos.kt
index 77d39f0..3ea4687 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/BiometricMessageInteractorKosmos.kt
@@ -18,7 +18,6 @@
import android.content.res.mainResources
import com.android.systemui.biometrics.domain.interactor.fingerprintPropertyInteractor
-import com.android.systemui.keyguard.domain.interactor.devicePostureInteractor
import com.android.systemui.kosmos.Kosmos
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -32,6 +31,5 @@
faceAuthInteractor = deviceEntryFaceAuthInteractor,
biometricSettingsInteractor = deviceEntryBiometricSettingsInteractor,
faceHelpMessageDeferralInteractor = faceHelpMessageDeferralInteractor,
- devicePostureInteractor = devicePostureInteractor,
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryKosmos.kt
deleted file mode 100644
index 9bbb34c..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryKosmos.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2024 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.data.repository
-
-import com.android.systemui.kosmos.Kosmos
-
-val Kosmos.devicePostureRepository: DevicePostureRepository by
- Kosmos.Fixture { FakeDevicePostureRepository() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/DevicePostureInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/DevicePostureInteractorKosmos.kt
deleted file mode 100644
index 75eb3c9..0000000
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/DevicePostureInteractorKosmos.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2024 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.domain.interactor
-
-import com.android.systemui.keyguard.data.repository.devicePostureRepository
-import com.android.systemui.kosmos.Kosmos
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-
-@ExperimentalCoroutinesApi
-val Kosmos.devicePostureInteractor by
- Kosmos.Fixture {
- DevicePostureInteractor(
- devicePostureRepository = devicePostureRepository,
- )
- }