diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index 3a59f4b5436ca..246528653380e 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -40,6 +40,7 @@ import com.android.systemui.controls.dagger.ControlsModule; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.demomode.dagger.DemoModeModule; import com.android.systemui.doze.dagger.DozeComponent; +import com.android.systemui.dreams.complication.dagger.ComplicationComponent; import com.android.systemui.dreams.dagger.DreamModule; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; @@ -163,6 +164,7 @@ import dagger.Provides; }, subcomponents = { CentralSurfacesComponent.class, + ComplicationComponent.class, NavigationBarComponent.class, NotificationRowComponent.class, DozeComponent.class, diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java index e76d5b30d3e61..b927ae752cd85 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java @@ -41,6 +41,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dreams.complication.Complication; +import com.android.systemui.dreams.complication.dagger.ComplicationComponent; import com.android.systemui.dreams.dagger.DreamOverlayComponent; import com.android.systemui.dreams.touch.DreamOverlayTouchMonitor; @@ -80,6 +81,8 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ // True if the service has been destroyed. private boolean mDestroyed = false; + private final ComplicationComponent mComplicationComponent; + private final DreamOverlayComponent mDreamOverlayComponent; private final LifecycleRegistry mLifecycleRegistry; @@ -128,6 +131,7 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ Context context, @Main Executor executor, WindowManager windowManager, + ComplicationComponent.Factory complicationComponentFactory, DreamOverlayComponent.Factory dreamOverlayComponentFactory, DreamOverlayStateController stateController, KeyguardUpdateMonitor keyguardUpdateMonitor, @@ -146,7 +150,9 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ final ViewModelStore viewModelStore = new ViewModelStore(); final Complication.Host host = () -> mExecutor.execute(DreamOverlayService.this::requestExit); - mDreamOverlayComponent = dreamOverlayComponentFactory.create(viewModelStore, host); + + mComplicationComponent = complicationComponentFactory.create(); + 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/complication/dagger/ComplicationComponent.kt b/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/ComplicationComponent.kt new file mode 100644 index 0000000000000..89497098f8ae2 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/dagger/ComplicationComponent.kt @@ -0,0 +1,12 @@ +package com.android.systemui.dreams.complication.dagger + +import dagger.Subcomponent + +@Subcomponent +interface ComplicationComponent { + /** Factory for generating [ComplicationComponent]. */ + @Subcomponent.Factory + interface Factory { + fun create(): ComplicationComponent + } +} 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 f927ba64a92bc..fab4b86979b25 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.DreamOverlayContainerViewController; 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 @@ public interface DreamOverlayComponent { @Subcomponent.Factory interface Factory { DreamOverlayComponent create(@BindsInstance ViewModelStore store, - @BindsInstance Complication.Host host); + @BindsInstance Complication.Host host, + @BindsInstance @Named(DREAM_TOUCH_HANDLERS) @Nullable + Set 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 ed0e1d97e40af..fc448a34f00a6 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.R; 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 @@ public abstract class DreamOverlayModule { static Lifecycle providesLifecycle(LifecycleOwner lifecycleOwner) { return lifecycleOwner.getLifecycle(); } + + @Provides + @ElementsIntoSet + static Set providesDreamTouchHandlers( + @Named(DREAM_TOUCH_HANDLERS) @Nullable Set 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 ffb8342a56a54..99ca9a6c1553d 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 @@ package com.android.systemui.dreams; 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; @@ -45,6 +46,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.logging.UiEventLogger; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; +import com.android.systemui.dreams.complication.dagger.ComplicationComponent; import com.android.systemui.dreams.dagger.DreamOverlayComponent; import com.android.systemui.dreams.touch.DreamOverlayTouchMonitor; import com.android.systemui.util.concurrency.FakeExecutor; @@ -86,6 +88,12 @@ public class DreamOverlayServiceTest extends SysuiTestCase { @Mock WindowManagerImpl mWindowManager; + @Mock + ComplicationComponent.Factory mComplicationComponentFactory; + + @Mock + ComplicationComponent mComplicationComponent; + @Mock DreamOverlayComponent.Factory mDreamOverlayComponentFactory; @@ -130,13 +138,19 @@ public class DreamOverlayServiceTest extends SysuiTestCase { .thenReturn(mLifecycleRegistry); when(mDreamOverlayComponent.getDreamOverlayTouchMonitor()) .thenReturn(mDreamOverlayTouchMonitor); + when(mComplicationComponentFactory + .create()) + .thenReturn(mComplicationComponent); + // 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); mService = new DreamOverlayService(mContext, mMainExecutor, mWindowManager, + mComplicationComponentFactory, mDreamOverlayComponentFactory, mStateController, mKeyguardUpdateMonitor,