From c585577fab3c3cc62471ffb647f35c46e39657bf Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Thu, 13 May 2021 13:03:44 -0400 Subject: [PATCH] Fix crash with smartspace view reparenting The current smartspace plugin creates a single view, which needs to be reparented properly when the host is created more than once. Fixes: 188050838 Test: atest LockscreenSmartspaceControllerTest Change-Id: I943993cb4e76ac0398190acff8032309418553f3 --- .../lockscreen/LockscreenSmartspaceController.kt | 7 ++++++- .../LockscreenSmartspaceControllerTest.kt | 14 +++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt index ce60c859e9bc8..a0d5eef027bc1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt @@ -107,7 +107,12 @@ class LockscreenSmartspaceController @Inject constructor( } private fun buildView(parent: ViewGroup) { - if (plugin == null || this::view.isInitialized) { + if (plugin == null) { + return + } + if (this::view.isInitialized) { + // Due to some oddities with a singleton smartspace view, allow reparenting + (view.getParent() as ViewGroup?)?.removeView(view) return } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt index 5366858231f07..9b5c33d64eb95 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.lockscreen - import android.app.smartspace.SmartspaceManager import android.app.smartspace.SmartspaceSession import android.app.smartspace.SmartspaceSession.OnTargetsAvailableListener @@ -415,8 +414,9 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { clearInvocations(smartspaceManager) clearInvocations(plugin) - // WHEN we're asked to connect a second time - controller.buildAndConnectView(fakeParent) + // WHEN we're asked to connect a second time and add to a parent + val view = controller.buildAndConnectView(fakeParent) + fakeParent.addView(view) // THEN the existing view and session are reused verify(smartspaceManager, never()).createSmartspaceSession(any()) @@ -424,8 +424,8 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { assertEquals(fakeSmartspaceView, controller.view) } - private fun connectSession(): View { - val view = controller.buildAndConnectView(fakeParent) + private fun connectSession() { + controller.buildAndConnectView(fakeParent) verify(smartspaceSession) .addOnTargetsAvailableListener(any(), capture(sessionListenerCaptor)) @@ -454,7 +454,7 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { verify(fakeSmartspaceView).setDozeAmount(0.5f) clearInvocations(fakeSmartspaceView) - return view + fakeParent.addView(fakeSmartspaceView) } private fun setActiveUser(userHandle: UserHandle) { @@ -515,4 +515,4 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { } private const val PRIVATE_LOCKSCREEN_SETTING = - Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS \ No newline at end of file + Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS