Allow injecting DreamTouchHandlers into DreamOverlayComponent.

This changelist enables DreamTouchHandlers to be specified when
creating a new DreamOverlayComponent through its Factory. The
DreamOverlayService will specify no additional handlers until the
complication layer has been separated from the dream overlay.

Test: atest DreamOverlayServiceTest
Bug: 261781069
Change-Id: I041d45059e443c61ce5eb497319999858e544508
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
index e76d5b3..ace33ca 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java
@@ -146,7 +146,8 @@
         final ViewModelStore viewModelStore = new ViewModelStore();
         final Complication.Host host =
                 () -> mExecutor.execute(DreamOverlayService.this::requestExit);
-        mDreamOverlayComponent = dreamOverlayComponentFactory.create(viewModelStore, host);
+
+        mDreamOverlayComponent = dreamOverlayComponentFactory.create(viewModelStore, host, null);
         mLifecycleRegistry = mDreamOverlayComponent.getLifecycleRegistry();
 
         mExecutor.execute(() -> setCurrentStateLocked(Lifecycle.State.CREATED));
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayComponent.java b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayComponent.java
index f927ba6..fab4b86 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayComponent.java
@@ -16,8 +16,12 @@
 
 package com.android.systemui.dreams.dagger;
 
+import static com.android.systemui.dreams.dagger.DreamOverlayModule.DREAM_TOUCH_HANDLERS;
+
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
+import android.annotation.Nullable;
+
 import androidx.lifecycle.LifecycleOwner;
 import androidx.lifecycle.LifecycleRegistry;
 import androidx.lifecycle.ViewModelStore;
@@ -26,16 +30,19 @@
 import com.android.systemui.dreams.complication.Complication;
 import com.android.systemui.dreams.complication.dagger.ComplicationModule;
 import com.android.systemui.dreams.touch.DreamOverlayTouchMonitor;
+import com.android.systemui.dreams.touch.DreamTouchHandler;
 import com.android.systemui.dreams.touch.dagger.DreamTouchModule;
 
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-
-import javax.inject.Scope;
-
 import dagger.BindsInstance;
 import dagger.Subcomponent;
 
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.util.Set;
+
+import javax.inject.Named;
+import javax.inject.Scope;
+
 /**
  * Dagger subcomponent for {@link DreamOverlayModule}.
  */
@@ -50,7 +57,9 @@
     @Subcomponent.Factory
     interface Factory {
         DreamOverlayComponent create(@BindsInstance ViewModelStore store,
-                @BindsInstance Complication.Host host);
+                @BindsInstance Complication.Host host,
+                @BindsInstance @Named(DREAM_TOUCH_HANDLERS) @Nullable
+                        Set<DreamTouchHandler> dreamTouchHandlers);
     }
 
     /** Scope annotation for singleton items within the {@link DreamOverlayComponent}. */
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayModule.java b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayModule.java
index ed0e1d9..fc448a3 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayModule.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.dreams.dagger;
 
+import android.annotation.Nullable;
 import android.content.res.Resources;
 import android.view.LayoutInflater;
 import android.view.ViewGroup;
@@ -29,19 +30,24 @@
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.dreams.DreamOverlayContainerView;
 import com.android.systemui.dreams.DreamOverlayStatusBarView;
+import com.android.systemui.dreams.touch.DreamTouchHandler;
 import com.android.systemui.touch.TouchInsetManager;
 
-import java.util.concurrent.Executor;
-
-import javax.inject.Named;
-
 import dagger.Lazy;
 import dagger.Module;
 import dagger.Provides;
+import dagger.multibindings.ElementsIntoSet;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.Executor;
+
+import javax.inject.Named;
 
 /** Dagger module for {@link DreamOverlayComponent}. */
 @Module
 public abstract class DreamOverlayModule {
+    public static final String DREAM_TOUCH_HANDLERS = "dream_touch_handlers";
     public static final String DREAM_OVERLAY_CONTENT_VIEW = "dream_overlay_content_view";
     public static final String MAX_BURN_IN_OFFSET = "max_burn_in_offset";
     public static final String BURN_IN_PROTECTION_UPDATE_INTERVAL =
@@ -261,4 +267,11 @@
     static Lifecycle providesLifecycle(LifecycleOwner lifecycleOwner) {
         return lifecycleOwner.getLifecycle();
     }
+
+    @Provides
+    @ElementsIntoSet
+    static Set<DreamTouchHandler> providesDreamTouchHandlers(
+            @Named(DREAM_TOUCH_HANDLERS) @Nullable Set<DreamTouchHandler> touchHandlers) {
+        return touchHandlers != null ? touchHandlers : new HashSet<>();
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java
index ffb8342..ff2978d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.Mockito.clearInvocations;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
@@ -46,6 +47,7 @@
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.dreams.dagger.DreamOverlayComponent;
+import com.android.systemui.dreams.touch.BouncerSwipeTouchHandler;
 import com.android.systemui.dreams.touch.DreamOverlayTouchMonitor;
 import com.android.systemui.util.concurrency.FakeExecutor;
 import com.android.systemui.util.time.FakeSystemClock;
@@ -111,6 +113,9 @@
     ViewGroup mDreamOverlayContainerViewParent;
 
     @Mock
+    BouncerSwipeTouchHandler mBouncerSwipeTouchHandler;
+
+    @Mock
     UiEventLogger mUiEventLogger;
 
     @Captor
@@ -130,8 +135,10 @@
                 .thenReturn(mLifecycleRegistry);
         when(mDreamOverlayComponent.getDreamOverlayTouchMonitor())
                 .thenReturn(mDreamOverlayTouchMonitor);
+        // TODO(b/261781069): A touch handler should be passed in from the complication component
+        // when the complication component is introduced.
         when(mDreamOverlayComponentFactory
-                .create(any(), any()))
+                .create(any(), any(), isNull()))
                 .thenReturn(mDreamOverlayComponent);
         when(mDreamOverlayContainerViewController.getContainerView())
                 .thenReturn(mDreamOverlayContainerView);