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

Commit 39990acb authored by Darrell Shi's avatar Darrell Shi
Browse files

Allow ongoing activity chips on dream to receive touch

This change allows the TouchInsetManager to track the ongoing activity
chips view in order for them to receive touches.

Test: atest AmbientStatusBarViewControllerTest
Test: verified touches passed to ongoing activity chips on dream
Fix: 422471181
Flag: com.android.systemui.ongoing_activity_chips_on_dream
Change-Id: I8196856b6839b6fcc7a95610b4d26a3d6a9ff38e
parent 629fed4e
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -44,7 +44,9 @@ constructor(private val factory: AmbientStatusBarComponent.Factory) {
                        ) as AmbientStatusBarView)
                    .apply {
                        visibility = View.VISIBLE
                        factory.create(this).getController().apply { init() }
                        factory.create(this, touchInsetSession = null).getController().apply {
                            init()
                        }
                    }
            },
            modifier = modifier.element(Communal.Elements.StatusBar),
+25 −0
Original line number Diff line number Diff line
@@ -36,14 +36,17 @@ import android.app.AlarmManager;
import android.content.Context;
import android.content.res.Resources;
import android.hardware.SensorPrivacyManager;
import android.platform.test.annotations.EnableFlags;
import android.provider.Settings;
import android.testing.TestableLooper;
import android.view.View;

import androidx.compose.ui.platform.ComposeView;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;

import com.android.systemui.SysuiTestCase;
import com.android.systemui.ambient.statusbar.shared.flag.OngoingActivityChipsOnDream;
import com.android.systemui.dreams.DreamOverlayNotificationCountProvider;
import com.android.systemui.dreams.DreamOverlayStateController;
import com.android.systemui.dreams.DreamOverlayStatusBarItemsProvider;
@@ -62,6 +65,7 @@ import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.statusbar.window.StatusBarWindowStateController;
import com.android.systemui.statusbar.window.StatusBarWindowStateListener;
import com.android.systemui.touch.TouchInsetManager;
import com.android.systemui.util.time.DateFormatUtil;

import org.junit.Before;
@@ -85,6 +89,8 @@ public class AmbientStatusBarViewControllerTest extends SysuiTestCase {
    private static final String NOTIFICATION_INDICATOR_FORMATTER_STRING =
            "{count, plural, =1 {# notification} other {# notifications}}";

    @Mock
    Context mContext;
    @Mock
    MockAmbientStatusBarView mView;
    @Mock
@@ -119,6 +125,8 @@ public class AmbientStatusBarViewControllerTest extends SysuiTestCase {
    AmbientStatusBarViewModel.Factory mAmbientStatusBarViewModelFactory;
    @Mock
    ConnectedDisplaysStatusBarNotificationIconViewStore.Factory mIconViewStoreFactory;
    @Mock
    TouchInsetManager.TouchInsetSession mTouchInsetSession;

    LogBuffer mLogBuffer = FakeLogBuffer.Factory.Companion.create();

@@ -142,6 +150,7 @@ public class AmbientStatusBarViewControllerTest extends SysuiTestCase {
        doCallRealMethod().when(mView).setVisibility(anyInt());
        doCallRealMethod().when(mView).getVisibility();
        when(mUserTracker.getUserId()).thenReturn(ActivityManager.getCurrentUser());
        when(mView.getContext()).thenReturn(mContext);

        mController = new AmbientStatusBarViewController(
                mView,
@@ -162,6 +171,7 @@ public class AmbientStatusBarViewControllerTest extends SysuiTestCase {
                mKosmos.getCommunalSceneInteractor(),
                mAmbientStatusBarViewModelFactory,
                mIconViewStoreFactory,
                mTouchInsetSession,
                mLogBuffer);
        mController.onInit();
    }
@@ -342,6 +352,7 @@ public class AmbientStatusBarViewControllerTest extends SysuiTestCase {
                mKosmos.getCommunalSceneInteractor(),
                mAmbientStatusBarViewModelFactory,
                mIconViewStoreFactory,
                mTouchInsetSession,
                mLogBuffer);
        controller.onViewAttached();
        verify(mView, never()).showIcon(
@@ -596,6 +607,20 @@ public class AmbientStatusBarViewControllerTest extends SysuiTestCase {
        verify(mStatusBarWindowStateController).removeListener(eq(listenerCaptor.getValue()));
    }

    @EnableFlags(OngoingActivityChipsOnDream.FLAG_NAME)
    @Test
    public void testAddAndRemoveOngoingActivityChipsViewFromTouchInsetSession() {
        final ComposeView ongoingActivityChipsView = Mockito.mock(ComposeView.class);
        when(mView.findViewById(R.id.dream_overlay_ongoing_activity_chips))
                .thenReturn(ongoingActivityChipsView);

        mController.onViewAttached();
        verify(mTouchInsetSession).addViewToTracking(ongoingActivityChipsView);

        mController.onViewDetached();
        verify(mTouchInsetSession).removeViewFromTracking(ongoingActivityChipsView);
    }

    private StatusBarWindowStateListener updateStatusBarWindowState(boolean show) {
        when(mStatusBarWindowStateController.windowIsShowing()).thenReturn(show);
        final ArgumentCaptor<StatusBarWindowStateListener>
+2 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.ambient.statusbar.dagger

import com.android.systemui.ambient.statusbar.ui.AmbientStatusBarView
import com.android.systemui.ambient.statusbar.ui.AmbientStatusBarViewController
import com.android.systemui.touch.TouchInsetManager
import dagger.BindsInstance
import dagger.Subcomponent

@@ -31,6 +32,7 @@ interface AmbientStatusBarComponent {
    interface Factory {
        fun create(
            @BindsInstance view: AmbientStatusBarView,
            @BindsInstance touchInsetSession: TouchInsetManager.TouchInsetSession?,
        ): AmbientStatusBarComponent
    }

+28 −6
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.statusbar.window.StatusBarWindowStateController;
import com.android.systemui.statusbar.window.StatusBarWindowStateListener;
import com.android.systemui.touch.TouchInsetManager;
import com.android.systemui.util.ViewController;
import com.android.systemui.util.time.DateFormatUtil;

@@ -100,12 +101,17 @@ public class AmbientStatusBarViewController extends ViewController<AmbientStatus
    private final ConnectedDisplaysStatusBarNotificationIconViewStore.Factory mIconViewStoreFactory;
    private final DreamLogger mLogger;

    @Nullable
    private final TouchInsetManager.TouchInsetSession mTouchInsetSession;

    private boolean mIsAttached;
    private boolean mCommunalVisible;

    // Whether dream entry animations are finished.
    private boolean mEntryAnimationsFinished = false;

    @Nullable private ComposeView mOngoingActivityChipsView = null;

    private final DreamOverlayStateController.Callback mDreamOverlayStateCallback =
            new DreamOverlayStateController.Callback() {
                @Override
@@ -169,6 +175,7 @@ public class AmbientStatusBarViewController extends ViewController<AmbientStatus
            CommunalSceneInteractor communalSceneInteractor,
            AmbientStatusBarViewModel.Factory ambientStatusBarViewModelFactory,
            ConnectedDisplaysStatusBarNotificationIconViewStore.Factory iconViewStoreFactory,
            @Nullable TouchInsetManager.TouchInsetSession touchInsetSession,
            @DreamLog LogBuffer logBuffer) {
        super(view);
        mResources = resources;
@@ -188,6 +195,7 @@ public class AmbientStatusBarViewController extends ViewController<AmbientStatus
        mCommunalSceneInteractor = communalSceneInteractor;
        mAmbientStatusBarViewModelFactory = ambientStatusBarViewModelFactory;
        mIconViewStoreFactory = iconViewStoreFactory;
        mTouchInsetSession = touchInsetSession;
        mLogger = new DreamLogger(logBuffer, TAG);
    }

@@ -214,13 +222,21 @@ public class AmbientStatusBarViewController extends ViewController<AmbientStatus
        mIsAttached = true;

        if (OngoingActivityChipsOnDream.isEnabled()) {
            final ComposeView ongoingActivityChipsView =
            mOngoingActivityChipsView =
                    mView.findViewById(R.id.dream_overlay_ongoing_activity_chips);

            if (mOngoingActivityChipsView != null) {
                AmbientStatusBarViewBinder.bindOngoingActivityChipsView(
                        getContext(),
                    ongoingActivityChipsView,
                        mOngoingActivityChipsView,
                        mAmbientStatusBarViewModelFactory,
                        mIconViewStoreFactory);

                // Allow the ongoing activity chips view to receive touch events.
                if (mTouchInsetSession != null) {
                    mTouchInsetSession.addViewToTracking(mOngoingActivityChipsView);
                }
            }
        }

        mFlows.add(collectFlow(
@@ -268,6 +284,12 @@ public class AmbientStatusBarViewController extends ViewController<AmbientStatus
            flow.dispose();
        }
        mFlows.clear();

        if (mTouchInsetSession != null && mOngoingActivityChipsView != null) {
            mTouchInsetSession.removeViewFromTracking(mOngoingActivityChipsView);
            mOngoingActivityChipsView = null;
        }

        mIsAttached = false;
    }

+3 −2
Original line number Diff line number Diff line
@@ -104,8 +104,9 @@ public abstract class DreamOverlayModule {
    @Provides
    @DreamOverlayComponent.DreamOverlayScope
    public static AmbientStatusBarViewController providesStatusBarViewController(
            AmbientStatusBarView view, AmbientStatusBarComponent.Factory factory) {
        return factory.create(view).getController();
            AmbientStatusBarView view, AmbientStatusBarComponent.Factory factory,
            TouchInsetManager.TouchInsetSession touchInsetSession) {
        return factory.create(view, touchInsetSession).getController();
    }

    /**  */