Limit ComplicationHostViewController observer to attached lifecycle.

This changelist makes the ComplicationHostViewController only observe
the lifecycle state while the associated view is attached. Previously,
this observation started during init and was never unregistered.

Fixes: 378102090
Test: atest ComplicationHostViewControllerTest
Flag: EXEMPT bugfix
Change-Id: I5603da2b5dd6e6b482b67e982458d2fa865b7259
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);
     }
 
     /**