Merge "Limit ComplicationHostViewController observer to attached lifecycle." into main
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationHostViewControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationHostViewControllerTest.java
index dd3f991..2ae611d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationHostViewControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationHostViewControllerTest.java
@@ -133,6 +133,7 @@
      */
     @Test
     public void testViewModelObservation() {
+        mController.onViewAttached();
         final Observer<Collection<ComplicationViewModel>> observer =
                 captureComplicationViewModelsObserver();
 
@@ -152,6 +153,7 @@
 
     @Test
     public void testMalformedComplicationAddition() {
+        mController.onViewAttached();
         final Observer<Collection<ComplicationViewModel>> observer =
                 captureComplicationViewModelsObserver();
 
@@ -167,6 +169,7 @@
 
     @Test
     public void testNewComplicationsBeforeEntryAnimationsFinishSetToInvisible() {
+        mController.onViewAttached();
         final Observer<Collection<ComplicationViewModel>> observer =
                 captureComplicationViewModelsObserver();
 
@@ -181,6 +184,7 @@
 
     @Test
     public void testNewComplicationsAfterEntryAnimationsFinishNotSetToInvisible() {
+        mController.onViewAttached();
         final Observer<Collection<ComplicationViewModel>> observer =
                 captureComplicationViewModelsObserver();
 
@@ -198,6 +202,7 @@
 
     @Test
     public void testAnimationsDisabled_ComplicationsNeverSetToInvisible() {
+        mController.onViewAttached();
         //Disable animations
         mController.mIsAnimationEnabled = false;
 
@@ -213,6 +218,16 @@
         verify(mComplicationView, never()).setVisibility(View.INVISIBLE);
     }
 
+    @Test
+    public void testLifecycleObserve_activeOnlyDuringAttachedState() {
+        verify(mComplicationViewModelLiveData, never()).observe(any(), any());
+        mController.onViewAttached();
+        final Observer<Collection<ComplicationViewModel>> observer =
+                captureComplicationViewModelsObserver();
+        mController.onViewDetached();
+        verify(mComplicationViewModelLiveData).removeObserver(eq(observer));
+    }
+
     private Observer<Collection<ComplicationViewModel>> captureComplicationViewModelsObserver() {
         verify(mComplicationViewModelLiveData).observe(eq(mLifecycleOwner),
                 mObserverCaptor.capture());
diff --git a/packages/SystemUI/src/com/android/systemui/complication/ComplicationHostViewController.java b/packages/SystemUI/src/com/android/systemui/complication/ComplicationHostViewController.java
index 8527dcb3..35592a5 100644
--- a/packages/SystemUI/src/com/android/systemui/complication/ComplicationHostViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/complication/ComplicationHostViewController.java
@@ -29,6 +29,7 @@
 
 import androidx.constraintlayout.widget.ConstraintLayout;
 import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.Observer;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.systemui.dreams.DreamOverlayStateController;
@@ -58,6 +59,14 @@
     private final LifecycleOwner mLifecycleOwner;
     private final ComplicationCollectionViewModel mComplicationCollectionViewModel;
     private final HashMap<ComplicationId, Complication.ViewHolder> mComplications = new HashMap<>();
+
+    private final Observer<Collection<ComplicationViewModel>> mComplicationViewModelObserver =
+            new Observer<>() {
+                @Override
+                public void onChanged(Collection<ComplicationViewModel> complicationViewModels) {
+                    updateComplications(complicationViewModels);
+                }
+            };
     @VisibleForTesting
     boolean mIsAnimationEnabled;
 
@@ -80,13 +89,6 @@
                 Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f, UserHandle.USER_CURRENT) != 0.0f;
     }
 
-    @Override
-    protected void onInit() {
-        super.onInit();
-        mComplicationCollectionViewModel.getComplications().observe(mLifecycleOwner,
-                complicationViewModels -> updateComplications(complicationViewModels));
-    }
-
     /**
      * Returns the region in display space occupied by complications. Touches in this region
      * (composed of a collection of individual rectangular regions) should be directed to the
@@ -166,10 +168,14 @@
 
     @Override
     protected void onViewAttached() {
+        mComplicationCollectionViewModel.getComplications().observe(mLifecycleOwner,
+                mComplicationViewModelObserver);
     }
 
     @Override
     protected void onViewDetached() {
+        mComplicationCollectionViewModel.getComplications().removeObserver(
+                mComplicationViewModelObserver);
     }
 
     /**