Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6eb501e6 authored by Bryce Lee's avatar Bryce Lee
Browse files

Move Lifecycle out of DreamOverlayModule.

Lifecycle is used by both dreams and complications to understand their
current state. The lifecycles of these two components can be the same,
such as when the complications are part of the dream overlay. However,
it is possible the lifecycles can be unrelated in the future, such as
complications being hosted in another SystemUI surface.

This changelist addresses this possibility by moving the current
lifecycle out of the DreamOverlayModule and instead injecting it into
the DreamOverlayService. In the case the service creates the
complication layer, this lifecycle will be bound to the appropriate
component. This change also introduces a concrete implementation of
LifecycleOwner, which exposes the registry.

Test: atest DreamOverlayServiceTest
Bug: 261781069
Change-Id: Ic04f62a89405b835c397b1ce348780d8aa2f05c1
parent dfda68c1
Loading
Loading
Loading
Loading
+34 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.dreams

import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry
import javax.inject.Inject

/**
 * {@link DreamOverlayLifecycleOwner} is a concrete implementation of {@link LifecycleOwner}, which
 * provides access to an associated {@link LifecycleRegistry}.
 */
class DreamOverlayLifecycleOwner @Inject constructor() : LifecycleOwner {
    val registry: LifecycleRegistry = LifecycleRegistry(this)

    override fun getLifecycle(): Lifecycle {
        return registry
    }
}
+7 −2
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.ViewModelStore;
import androidx.lifecycle.ViewModelStore;


@@ -85,6 +86,7 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ


    private final DreamOverlayComponent mDreamOverlayComponent;
    private final DreamOverlayComponent mDreamOverlayComponent;


    private final DreamOverlayLifecycleOwner mLifecycleOwner;
    private final LifecycleRegistry mLifecycleRegistry;
    private final LifecycleRegistry mLifecycleRegistry;


    private DreamOverlayTouchMonitor mDreamOverlayTouchMonitor;
    private DreamOverlayTouchMonitor mDreamOverlayTouchMonitor;
@@ -130,6 +132,7 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ
    public DreamOverlayService(
    public DreamOverlayService(
            Context context,
            Context context,
            @Main Executor executor,
            @Main Executor executor,
            DreamOverlayLifecycleOwner lifecycleOwner,
            WindowManager windowManager,
            WindowManager windowManager,
            ComplicationComponent.Factory complicationComponentFactory,
            ComplicationComponent.Factory complicationComponentFactory,
            DreamOverlayComponent.Factory dreamOverlayComponentFactory,
            DreamOverlayComponent.Factory dreamOverlayComponentFactory,
@@ -152,8 +155,10 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ
                () -> mExecutor.execute(DreamOverlayService.this::requestExit);
                () -> mExecutor.execute(DreamOverlayService.this::requestExit);


        mComplicationComponent = complicationComponentFactory.create();
        mComplicationComponent = complicationComponentFactory.create();
        mDreamOverlayComponent = dreamOverlayComponentFactory.create(viewModelStore, host, null);
        mDreamOverlayComponent =
        mLifecycleRegistry = mDreamOverlayComponent.getLifecycleRegistry();
                dreamOverlayComponentFactory.create(lifecycleOwner, viewModelStore, host, null);
        mLifecycleOwner = lifecycleOwner;
        mLifecycleRegistry = mLifecycleOwner.getRegistry();


        mExecutor.execute(() -> setCurrentStateLocked(Lifecycle.State.CREATED));
        mExecutor.execute(() -> setCurrentStateLocked(Lifecycle.State.CREATED));
    }
    }
+3 −8
Original line number Original line Diff line number Diff line
@@ -23,7 +23,6 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
import android.annotation.Nullable;
import android.annotation.Nullable;


import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.ViewModelStore;
import androidx.lifecycle.ViewModelStore;


import com.android.systemui.dreams.DreamOverlayContainerViewController;
import com.android.systemui.dreams.DreamOverlayContainerViewController;
@@ -56,7 +55,9 @@ public interface DreamOverlayComponent {
    /** Simple factory for {@link DreamOverlayComponent}. */
    /** Simple factory for {@link DreamOverlayComponent}. */
    @Subcomponent.Factory
    @Subcomponent.Factory
    interface Factory {
    interface Factory {
        DreamOverlayComponent create(@BindsInstance ViewModelStore store,
        DreamOverlayComponent create(
                @BindsInstance LifecycleOwner lifecycleOwner,
                @BindsInstance ViewModelStore store,
                @BindsInstance Complication.Host host,
                @BindsInstance Complication.Host host,
                @BindsInstance @Named(DREAM_TOUCH_HANDLERS) @Nullable
                @BindsInstance @Named(DREAM_TOUCH_HANDLERS) @Nullable
                        Set<DreamTouchHandler> dreamTouchHandlers);
                        Set<DreamTouchHandler> dreamTouchHandlers);
@@ -71,12 +72,6 @@ public interface DreamOverlayComponent {
    /** Builds a {@link DreamOverlayContainerViewController}. */
    /** Builds a {@link DreamOverlayContainerViewController}. */
    DreamOverlayContainerViewController getDreamOverlayContainerViewController();
    DreamOverlayContainerViewController getDreamOverlayContainerViewController();


    /** Builds a {@link androidx.lifecycle.LifecycleRegistry} */
    LifecycleRegistry getLifecycleRegistry();

    /** Builds a {@link androidx.lifecycle.LifecycleOwner} */
    LifecycleOwner getLifecycleOwner();

    /** Builds a {@link DreamOverlayTouchMonitor} */
    /** Builds a {@link DreamOverlayTouchMonitor} */
    DreamOverlayTouchMonitor getDreamOverlayTouchMonitor();
    DreamOverlayTouchMonitor getDreamOverlayTouchMonitor();
}
}
+0 −14
Original line number Original line Diff line number Diff line
@@ -23,7 +23,6 @@ import android.view.ViewGroup;


import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;


import com.android.internal.util.Preconditions;
import com.android.internal.util.Preconditions;
import com.android.systemui.R;
import com.android.systemui.R;
@@ -36,7 +35,6 @@ import com.android.systemui.dreams.dreamcomplication.dagger.ComplicationComponen
import com.android.systemui.dreams.touch.DreamTouchHandler;
import com.android.systemui.dreams.touch.DreamTouchHandler;
import com.android.systemui.touch.TouchInsetManager;
import com.android.systemui.touch.TouchInsetManager;


import dagger.Lazy;
import dagger.Module;
import dagger.Module;
import dagger.Provides;
import dagger.Provides;
import dagger.multibindings.ElementsIntoSet;
import dagger.multibindings.ElementsIntoSet;
@@ -254,18 +252,6 @@ public abstract class DreamOverlayModule {
        return (long) resources.getInteger(R.integer.config_dreamOverlayOutBlurDurationMs);
        return (long) resources.getInteger(R.integer.config_dreamOverlayOutBlurDurationMs);
    }
    }


    @Provides
    @DreamOverlayComponent.DreamOverlayScope
    static LifecycleOwner providesLifecycleOwner(Lazy<LifecycleRegistry> lifecycleRegistryLazy) {
        return () -> lifecycleRegistryLazy.get();
    }

    @Provides
    @DreamOverlayComponent.DreamOverlayScope
    static LifecycleRegistry providesLifecycleRegistry(LifecycleOwner lifecycleOwner) {
        return new LifecycleRegistry(lifecycleOwner);
    }

    @Provides
    @Provides
    @DreamOverlayComponent.DreamOverlayScope
    @DreamOverlayComponent.DreamOverlayScope
    static Lifecycle providesLifecycle(LifecycleOwner lifecycleOwner) {
    static Lifecycle providesLifecycle(LifecycleOwner lifecycleOwner) {
+7 −7
Original line number Original line Diff line number Diff line
@@ -39,7 +39,6 @@ import android.view.WindowManager;
import android.view.WindowManagerImpl;
import android.view.WindowManagerImpl;


import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.LifecycleRegistry;
import androidx.test.filters.SmallTest;
import androidx.test.filters.SmallTest;


@@ -72,7 +71,7 @@ public class DreamOverlayServiceTest extends SysuiTestCase {
    private final FakeExecutor mMainExecutor = new FakeExecutor(mFakeSystemClock);
    private final FakeExecutor mMainExecutor = new FakeExecutor(mFakeSystemClock);


    @Mock
    @Mock
    LifecycleOwner mLifecycleOwner;
    DreamOverlayLifecycleOwner mLifecycleOwner;


    @Mock
    @Mock
    LifecycleRegistry mLifecycleRegistry;
    LifecycleRegistry mLifecycleRegistry;
@@ -132,9 +131,7 @@ public class DreamOverlayServiceTest extends SysuiTestCase {


        when(mDreamOverlayComponent.getDreamOverlayContainerViewController())
        when(mDreamOverlayComponent.getDreamOverlayContainerViewController())
                .thenReturn(mDreamOverlayContainerViewController);
                .thenReturn(mDreamOverlayContainerViewController);
        when(mDreamOverlayComponent.getLifecycleOwner())
        when(mLifecycleOwner.getRegistry())
                .thenReturn(mLifecycleOwner);
        when(mDreamOverlayComponent.getLifecycleRegistry())
                .thenReturn(mLifecycleRegistry);
                .thenReturn(mLifecycleRegistry);
        when(mDreamOverlayComponent.getDreamOverlayTouchMonitor())
        when(mDreamOverlayComponent.getDreamOverlayTouchMonitor())
                .thenReturn(mDreamOverlayTouchMonitor);
                .thenReturn(mDreamOverlayTouchMonitor);
@@ -144,12 +141,15 @@ public class DreamOverlayServiceTest extends SysuiTestCase {
        // TODO(b/261781069): A touch handler should be passed in from the complication component
        // TODO(b/261781069): A touch handler should be passed in from the complication component
        // when the complication component is introduced.
        // when the complication component is introduced.
        when(mDreamOverlayComponentFactory
        when(mDreamOverlayComponentFactory
                .create(any(), any(), isNull()))
                .create(any(), any(), any(), isNull()))
                .thenReturn(mDreamOverlayComponent);
                .thenReturn(mDreamOverlayComponent);
        when(mDreamOverlayContainerViewController.getContainerView())
        when(mDreamOverlayContainerViewController.getContainerView())
                .thenReturn(mDreamOverlayContainerView);
                .thenReturn(mDreamOverlayContainerView);


        mService = new DreamOverlayService(mContext, mMainExecutor, mWindowManager,
        mService = new DreamOverlayService(mContext,
                mMainExecutor,
                mLifecycleOwner,
                mWindowManager,
                mComplicationComponentFactory,
                mComplicationComponentFactory,
                mDreamOverlayComponentFactory,
                mDreamOverlayComponentFactory,
                mStateController,
                mStateController,