From 851230d66e750a5e6e300c3f2727e53134ca937e Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Tue, 28 Apr 2020 14:14:11 -0400 Subject: [PATCH] Controls UI - Fix crash on missing control Properly clean up state when switching structures. Due to events coming in from the listing controller, do not assume controls that were initially created are still present. Bug: 152678308 Test: manual, switch structures after reboot Change-Id: Ic60782c5a7e292ea633ad812f3313efd33574cc6 --- .../controls/ui/ControlsUiControllerImpl.kt | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt index f3693c1c72ab3..3649a02efdb5f 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -170,11 +170,17 @@ class ControlsUiControllerImpl @Inject constructor ( private fun reload(parent: ViewGroup) { if (hidden) return + controlsListingController.get().removeCallback(listingCallback) + controlsController.get().unsubscribe() + val fadeAnim = ObjectAnimator.ofFloat(parent, "alpha", 1.0f, 0.0f) fadeAnim.setInterpolator(AccelerateInterpolator(1.0f)) fadeAnim.setDuration(FADE_IN_MILLIS) fadeAnim.addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { + controlViewsById.clear() + controlsById.clear() + show(parent, dismissGlobalActions) val showAnim = ObjectAnimator.ofFloat(parent, "alpha", 0.0f, 1.0f) showAnim.setInterpolator(DecelerateInterpolator(1.0f)) @@ -448,21 +454,23 @@ class ControlsUiControllerImpl @Inject constructor ( val listView = parent.requireViewById(R.id.global_actions_controls_list) as ViewGroup var lastRow: ViewGroup = createRow(inflater, listView) selectedStructure.controls.forEach { - if (lastRow.getChildCount() == maxColumns) { - lastRow = createRow(inflater, listView) - } - val baseLayout = inflater.inflate( - R.layout.controls_base_item, lastRow, false) as ViewGroup - lastRow.addView(baseLayout) - val cvh = ControlViewHolder( - baseLayout, - controlsController.get(), - uiExecutor, - bgExecutor - ) val key = ControlKey(selectedStructure.componentName, it.controlId) - cvh.bindData(controlsById.getValue(key)) - controlViewsById.put(key, cvh) + controlsById.get(key)?.let { + if (lastRow.getChildCount() == maxColumns) { + lastRow = createRow(inflater, listView) + } + val baseLayout = inflater.inflate( + R.layout.controls_base_item, lastRow, false) as ViewGroup + lastRow.addView(baseLayout) + val cvh = ControlViewHolder( + baseLayout, + controlsController.get(), + uiExecutor, + bgExecutor + ) + cvh.bindData(it) + controlViewsById.put(key, cvh) + } } // add spacers if necessary to keep control size consistent @@ -528,7 +536,6 @@ class ControlsUiControllerImpl @Inject constructor ( if (newSelection != selectedStructure) { selectedStructure = newSelection updatePreferences(selectedStructure) - controlsListingController.get().removeCallback(listingCallback) reload(parent) } } @@ -545,6 +552,7 @@ class ControlsUiControllerImpl @Inject constructor ( parent.removeAllViews() controlsById.clear() controlViewsById.clear() + controlsListingController.get().removeCallback(listingCallback) RenderInfo.clearCache()