Remove dependency on WindowManager-Shell in the animation lib

Bug: 193569148
Test: atest ActivityLaunchAnimatorTest
Change-Id: I40d9546d14085a2ba3fe6e4ee559e43e463ce08a
This commit is contained in:
Jordan Demeulenaere
2021-07-14 11:27:30 +02:00
parent 94240f3acd
commit 12b651b469
4 changed files with 31 additions and 28 deletions

View File

@@ -36,7 +36,6 @@ android_library {
static_libs: [
"PluginCoreLib",
"WindowManager-Shell",
],
manifest: "AndroidManifest.xml",

View File

@@ -7,6 +7,7 @@ import android.app.ActivityManager
import android.app.ActivityTaskManager
import android.app.AppGlobals
import android.app.PendingIntent
import android.app.TaskInfo
import android.content.Context
import android.graphics.Matrix
import android.graphics.PorterDuff
@@ -30,8 +31,6 @@ import android.view.animation.AnimationUtils
import android.view.animation.PathInterpolator
import com.android.internal.annotations.VisibleForTesting
import com.android.internal.policy.ScreenDecorationsUtils
import com.android.wm.shell.startingsurface.SplashscreenContentDrawer
import com.android.wm.shell.startingsurface.StartingSurface
import kotlin.math.roundToInt
private const val TAG = "ActivityLaunchAnimator"
@@ -41,8 +40,7 @@ private const val TAG = "ActivityLaunchAnimator"
* nicely into the starting window.
*/
class ActivityLaunchAnimator(
private val keyguardHandler: KeyguardHandler,
private val startingSurface: StartingSurface?,
private val callback: Callback,
context: Context
) {
companion object {
@@ -120,7 +118,7 @@ class ActivityLaunchAnimator(
Log.d(TAG, "Starting intent with a launch animation")
val runner = Runner(controller)
val isOnKeyguard = keyguardHandler.isOnKeyguard()
val isOnKeyguard = callback.isOnKeyguard()
// Pass the RemoteAnimationAdapter to the intent starter only if we are not on the keyguard.
val animationAdapter = if (!isOnKeyguard) {
@@ -163,7 +161,7 @@ class ActivityLaunchAnimator(
// Hide the keyguard using the launch animation instead of the default unlock animation.
if (isOnKeyguard) {
keyguardHandler.hideKeyguardWithAnimation(runner)
callback.hideKeyguardWithAnimation(runner)
}
}
}
@@ -212,7 +210,7 @@ class ActivityLaunchAnimator(
fun startPendingIntent(animationAdapter: RemoteAnimationAdapter?): Int
}
interface KeyguardHandler {
interface Callback {
/** Whether we are currently on the keyguard or not. */
fun isOnKeyguard(): Boolean
@@ -221,6 +219,9 @@ class ActivityLaunchAnimator(
/** Enable/disable window blur so they don't overlap with the window launch animation **/
fun setBlursDisabledForAppLaunch(disabled: Boolean)
/* Get the background color of [task]. */
fun getBackgroundColor(task: TaskInfo): Int
}
/**
@@ -484,12 +485,7 @@ class ActivityLaunchAnimator(
// which is usually the same color of the app background. We first fade in this layer
// to hide the expanding view, then we fade it out with SRC mode to draw a hole in the
// launch container and reveal the opening window.
val windowBackgroundColor = if (startingSurface != null) {
startingSurface.getBackgroundColor(window.taskInfo)
} else {
Log.w(TAG, "No starting surface, defaulting to SystemBGColor")
SplashscreenContentDrawer.getSystemBGColor()
}
val windowBackgroundColor = callback.getBackgroundColor(window.taskInfo)
val windowBackgroundLayer = GradientDrawable().apply {
setColor(windowBackgroundColor)
alpha = 0
@@ -505,7 +501,7 @@ class ActivityLaunchAnimator(
animator.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator?, isReverse: Boolean) {
Log.d(TAG, "Animation started")
keyguardHandler.setBlursDisabledForAppLaunch(true)
callback.setBlursDisabledForAppLaunch(true)
controller.onLaunchAnimationStart(isExpandingFullyAbove)
// Add the drawable to the launch container overlay. Overlays always draw
@@ -516,7 +512,7 @@ class ActivityLaunchAnimator(
override fun onAnimationEnd(animation: Animator?) {
Log.d(TAG, "Animation ended")
keyguardHandler.setBlursDisabledForAppLaunch(false)
callback.setBlursDisabledForAppLaunch(false)
iCallback?.invoke()
controller.onLaunchAnimationEnd(isExpandingFullyAbove)
launchContainerOverlay.remove(windowBackgroundLayer)

View File

@@ -55,6 +55,7 @@ import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.StatusBarManager;
import android.app.TaskInfo;
import android.app.UiModeManager;
import android.app.WallpaperInfo;
import android.app.WallpaperManager;
@@ -247,6 +248,7 @@ import com.android.systemui.volume.VolumeComponent;
import com.android.systemui.wmshell.BubblesManager;
import com.android.wm.shell.bubbles.Bubbles;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.startingsurface.SplashscreenContentDrawer;
import com.android.wm.shell.startingsurface.StartingSurface;
import java.io.FileDescriptor;
@@ -269,7 +271,7 @@ public class StatusBar extends SystemUI implements DemoMode,
ColorExtractor.OnColorsChangedListener, ConfigurationListener,
StatusBarStateController.StateListener,
LifecycleOwner, BatteryController.BatteryStateChangeCallback,
ActivityLaunchAnimator.KeyguardHandler {
ActivityLaunchAnimator.Callback {
public static final boolean MULTIUSER_DEBUG = false;
protected static final int MSG_HIDE_RECENT_APPS = 1020;
@@ -1421,9 +1423,7 @@ public class StatusBar extends SystemUI implements DemoMode,
private void setUpPresenter() {
// Set up the initial notification state.
mActivityLaunchAnimator = new ActivityLaunchAnimator(this,
mStartingSurfaceOptional.orElse(null),
mContext);
mActivityLaunchAnimator = new ActivityLaunchAnimator(this, mContext);
mNotificationAnimationProvider = new NotificationLaunchAnimatorControllerProvider(
mNotificationShadeWindowViewController,
mStackScrollerController.getNotificationListContainer(),
@@ -2123,6 +2123,16 @@ public class StatusBar extends SystemUI implements DemoMode,
mKeyguardViewMediator.setBlursDisabledForAppLaunch(disabled);
}
@Override
public int getBackgroundColor(TaskInfo task) {
if (!mStartingSurfaceOptional.isPresent()) {
Log.w(TAG, "No starting surface, defaulting to SystemBGColor");
return SplashscreenContentDrawer.getSystemBGColor();
}
return mStartingSurfaceOptional.get().getBackgroundColor(task);
}
public boolean isDeviceInVrMode() {
return mPresenter.isDeviceInVrMode();
}

View File

@@ -22,7 +22,6 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.wm.shell.startingsurface.StartingSurface
import junit.framework.Assert.assertFalse
import junit.framework.Assert.assertNotNull
import junit.framework.Assert.assertNull
@@ -47,10 +46,9 @@ import org.mockito.junit.MockitoJUnit
@RunWithLooper
class ActivityLaunchAnimatorTest : SysuiTestCase() {
private val launchContainer = LinearLayout(mContext)
@Mock lateinit var keyguardHandler: ActivityLaunchAnimator.KeyguardHandler
@Mock lateinit var callback: ActivityLaunchAnimator.Callback
@Spy private val controller = TestLaunchAnimatorController(launchContainer)
@Mock lateinit var iCallback: IRemoteAnimationFinishedCallback
@Mock lateinit var startingSurface: StartingSurface
@Mock lateinit var failHandler: Log.TerribleFailureHandler
private lateinit var activityLaunchAnimator: ActivityLaunchAnimator
@@ -58,7 +56,7 @@ class ActivityLaunchAnimatorTest : SysuiTestCase() {
@Before
fun setup() {
activityLaunchAnimator = ActivityLaunchAnimator(keyguardHandler, startingSurface, mContext)
activityLaunchAnimator = ActivityLaunchAnimator(callback, mContext)
}
private fun startIntentWithAnimation(
@@ -121,8 +119,8 @@ class ActivityLaunchAnimatorTest : SysuiTestCase() {
@Test
fun animatesIfActivityIsAlreadyOpenAndIsOnKeyguard() {
`when`(keyguardHandler.isOnKeyguard()).thenReturn(true)
val animator = ActivityLaunchAnimator(keyguardHandler, startingSurface, context)
`when`(callback.isOnKeyguard()).thenReturn(true)
val animator = ActivityLaunchAnimator(callback, context)
val willAnimateCaptor = ArgumentCaptor.forClass(Boolean::class.java)
var animationAdapter: RemoteAnimationAdapter? = null
@@ -134,7 +132,7 @@ class ActivityLaunchAnimatorTest : SysuiTestCase() {
waitForIdleSync()
verify(controller).onIntentStarted(willAnimateCaptor.capture())
verify(keyguardHandler).hideKeyguardWithAnimation(any())
verify(callback).hideKeyguardWithAnimation(any())
assertTrue(willAnimateCaptor.value)
assertNull(animationAdapter)
@@ -176,7 +174,7 @@ class ActivityLaunchAnimatorTest : SysuiTestCase() {
val runner = activityLaunchAnimator.createRunner(controller)
runner.onAnimationStart(0, arrayOf(fakeWindow()), emptyArray(), emptyArray(), iCallback)
waitForIdleSync()
verify(keyguardHandler).setBlursDisabledForAppLaunch(eq(true))
verify(callback).setBlursDisabledForAppLaunch(eq(true))
verify(controller).onLaunchAnimationStart(anyBoolean())
}