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

Commit 2a91e7e6 authored by Steve Elliott's avatar Steve Elliott Committed by Android (Google) Code Review
Browse files

Merge "Move NIC binding to CollapsedStatusBarFragment" into main

parents 933c1b3d 7f04c740
Loading
Loading
Loading
Loading
+2 −62
Original line number Diff line number Diff line
@@ -17,23 +17,17 @@ package com.android.systemui.statusbar.notification.icon.ui.viewbinder

import android.content.Context
import android.graphics.Rect
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import com.android.systemui.common.ui.ConfigurationState
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.demomode.DemoMode
import com.android.systemui.demomode.DemoModeController
import com.android.systemui.flags.FeatureFlagsClassic
import com.android.systemui.flags.Flags
import com.android.systemui.flags.RefactorFlag
import com.android.systemui.res.R
import com.android.systemui.statusbar.NotificationShelfController
import com.android.systemui.statusbar.StatusBarIconView
import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel
import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerShelfViewModel
import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerStatusBarViewModel
import com.android.systemui.statusbar.notification.shelf.ui.viewbinder.NotificationShelfViewBinderWrapperControllerImpl
import com.android.systemui.statusbar.phone.DozeParameters
import com.android.systemui.statusbar.phone.NotificationIconAreaController
@@ -54,34 +48,23 @@ import kotlinx.coroutines.DisposableHandle
class NotificationIconAreaControllerViewBinderWrapperImpl
@Inject
constructor(
    context: Context,
    private val configuration: ConfigurationState,
    private val configurationController: ConfigurationController,
    private val dozeParameters: DozeParameters,
    demoModeController: DemoModeController,
    private val featureFlags: FeatureFlagsClassic,
    private val screenOffAnimationController: ScreenOffAnimationController,
    private val shelfIconViewStore: ShelfNotificationIconViewStore,
    private val shelfIconsViewModel: NotificationIconContainerShelfViewModel,
    private val aodIconViewStore: AlwaysOnDisplayNotificationIconViewStore,
    private val aodIconsViewModel: NotificationIconContainerAlwaysOnDisplayViewModel,
    private val statusBarIconViewStore: StatusBarNotificationIconViewStore,
    private val statusBarIconsViewModel: NotificationIconContainerStatusBarViewModel,
) : NotificationIconAreaController, DemoMode {
) : NotificationIconAreaController {

    private val shelfRefactor = RefactorFlag(featureFlags, Flags.NOTIFICATION_SHELF_REFACTOR)

    private var notificationIconArea: View? = null
    private var notificationIcons: NotificationIconContainer? = null
    private var shelfIcons: NotificationIconContainer? = null
    private var aodIcons: NotificationIconContainer? = null
    private var aodBindJob: DisposableHandle? = null

    init {
        demoModeController.addCallback(this)
        initializeNotificationAreaViews(context)
    }

    /** Called by the Keyguard*ViewController whose view contains the aod icons. */
    override fun setupAodIcons(aodIcons: NotificationIconContainer) {
        val changed = this.aodIcons != null && aodIcons !== this.aodIcons
@@ -127,9 +110,7 @@ constructor(
    override fun onDensityOrFontScaleChanged(context: Context) = unsupported

    /** Returns the view that represents the notification area. */
    override fun getNotificationInnerAreaView(): View? {
        return notificationIconArea
    }
    override fun getNotificationInnerAreaView(): View? = unsupported

    /** Updates the notifications with the given list of notifications to display. */
    override fun updateNotificationIcons(entries: List<ListEntry>) = unsupported
@@ -149,47 +130,6 @@ constructor(
        return if (aodIcons == null) 0 else aodIcons!!.height
    }

    override fun demoCommands(): List<String> {
        val commands = ArrayList<String>()
        commands.add(DemoMode.COMMAND_NOTIFICATIONS)
        return commands
    }

    override fun dispatchDemoCommand(command: String, args: Bundle) {
        if (notificationIconArea != null) {
            val visible = args.getString("visible")
            val vis = if ("false" == visible) View.INVISIBLE else View.VISIBLE
            notificationIconArea?.visibility = vis
        }
    }

    override fun onDemoModeFinished() {
        if (notificationIconArea != null) {
            notificationIconArea?.visibility = View.VISIBLE
        }
    }

    private fun inflateIconArea(inflater: LayoutInflater): View {
        return inflater.inflate(R.layout.notification_icon_area, null)
    }

    /** Initializes the views that will represent the notification area. */
    private fun initializeNotificationAreaViews(context: Context) {
        val layoutInflater = LayoutInflater.from(context)
        notificationIconArea = inflateIconArea(layoutInflater)
        notificationIcons = notificationIconArea?.findViewById(R.id.notificationIcons)
        NotificationIconContainerViewBinder.bind(
            notificationIcons!!,
            statusBarIconsViewModel,
            configuration,
            configurationController,
            dozeParameters,
            featureFlags,
            screenOffAnimationController,
            statusBarIconViewStore,
        )
    }

    companion object {
        val unsupported: Nothing
            get() =
+1 −0
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ import kotlinx.coroutines.launch

/** Binds a [NotificationIconContainer] to its [view model][NotificationIconContainerViewModel]. */
object NotificationIconContainerViewBinder {
    @JvmStatic
    fun bind(
        view: NotificationIconContainer,
        viewModel: NotificationIconContainerViewModel,
+94 −14
Original line number Diff line number Diff line
@@ -38,9 +38,13 @@ import com.android.app.animation.Interpolators;
import com.android.app.animation.InterpolatorsAndroidX;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Dumpable;
import com.android.systemui.common.ui.ConfigurationState;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.demomode.DemoMode;
import com.android.systemui.demomode.DemoModeController;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.FeatureFlagsClassic;
import com.android.systemui.flags.Flags;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.res.R;
import com.android.systemui.shade.ShadeExpansionStateManager;
@@ -52,8 +56,15 @@ import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.disableflags.DisableFlagsLogger.DisableState;
import com.android.systemui.statusbar.events.SystemStatusAnimationCallback;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder;
import com.android.systemui.statusbar.notification.icon.ui.viewbinder.StatusBarNotificationIconViewStore;
import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerStatusBarViewModel;
import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerViewModel;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.NotificationIconContainer;
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
import com.android.systemui.statusbar.phone.StatusBarHideIconsForBouncerManager;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager;
@@ -66,6 +77,7 @@ import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallListener;
import com.android.systemui.statusbar.pipeline.shared.ui.binder.CollapsedStatusBarViewBinder;
import com.android.systemui.statusbar.pipeline.shared.ui.binder.StatusBarVisibilityChangeListener;
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.CollapsedStatusBarViewModel;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.window.StatusBarWindowStateController;
import com.android.systemui.statusbar.window.StatusBarWindowStateListener;
@@ -83,6 +95,7 @@ import java.util.Set;
import java.util.concurrent.Executor;

import javax.inject.Inject;

import kotlin.Unit;

/**
@@ -128,7 +141,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
    private final OngoingCallController mOngoingCallController;
    private final SystemStatusAnimationScheduler mAnimationScheduler;
    private final StatusBarLocationPublisher mLocationPublisher;
    private final FeatureFlags mFeatureFlags;
    private final FeatureFlagsClassic mFeatureFlags;
    private final NotificationIconAreaController mNotificationIconAreaController;
    private final ShadeExpansionStateManager mShadeExpansionStateManager;
    private final StatusBarIconController mStatusBarIconController;
@@ -142,6 +155,13 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
    private final DumpManager mDumpManager;
    private final StatusBarWindowStateController mStatusBarWindowStateController;
    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    private final NotificationIconContainerViewModel mStatusBarIconsViewModel;
    private final ConfigurationState mConfigurationState;
    private final ConfigurationController mConfigurationController;
    private final DozeParameters mDozeParameters;
    private final ScreenOffAnimationController mScreenOffAnimationController;
    private final NotificationIconContainerViewBinder.IconViewStore mStatusBarIconViewStore;
    private final DemoModeController mDemoModeController;

    private List<String> mBlockedIcons = new ArrayList<>();
    private Map<Startable, Startable.State> mStartableStates = new ArrayMap<>();
@@ -211,9 +231,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
            StatusBarLocationPublisher locationPublisher,
            NotificationIconAreaController notificationIconAreaController,
            ShadeExpansionStateManager shadeExpansionStateManager,
            FeatureFlags featureFlags,
            FeatureFlagsClassic featureFlags,
            StatusBarIconController statusBarIconController,
            StatusBarIconController.DarkIconManager.Factory darkIconManagerFactory,
            DarkIconManager.Factory darkIconManagerFactory,
            CollapsedStatusBarViewModel collapsedStatusBarViewModel,
            CollapsedStatusBarViewBinder collapsedStatusBarViewBinder,
            StatusBarHideIconsForBouncerManager statusBarHideIconsForBouncerManager,
@@ -228,8 +248,14 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
            @Main Executor mainExecutor,
            DumpManager dumpManager,
            StatusBarWindowStateController statusBarWindowStateController,
            KeyguardUpdateMonitor keyguardUpdateMonitor
    ) {
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            NotificationIconContainerStatusBarViewModel statusBarIconsViewModel,
            ConfigurationState configurationState,
            ConfigurationController configurationController,
            DozeParameters dozeParameters,
            ScreenOffAnimationController screenOffAnimationController,
            StatusBarNotificationIconViewStore statusBarIconViewStore,
            DemoModeController demoModeController) {
        mStatusBarFragmentComponentFactory = statusBarFragmentComponentFactory;
        mOngoingCallController = ongoingCallController;
        mAnimationScheduler = animationScheduler;
@@ -254,18 +280,55 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
        mDumpManager = dumpManager;
        mStatusBarWindowStateController = statusBarWindowStateController;
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mStatusBarIconsViewModel = statusBarIconsViewModel;
        mConfigurationState = configurationState;
        mConfigurationController = configurationController;
        mDozeParameters = dozeParameters;
        mScreenOffAnimationController = screenOffAnimationController;
        mStatusBarIconViewStore = statusBarIconViewStore;
        mDemoModeController = demoModeController;
    }

    private final DemoMode mDemoModeCallback = new DemoMode() {
        @Override
        public List<String> demoCommands() {
            return List.of(DemoMode.COMMAND_NOTIFICATIONS);
        }

        @Override
        public void dispatchDemoCommand(String command, Bundle args) {
            if (mNotificationIconAreaInner == null) return;
            String visible = args.getString("visible");
            if ("false".equals(visible)) {
                mNotificationIconAreaInner.setVisibility(View.INVISIBLE);
            } else {
                mNotificationIconAreaInner.setVisibility(View.VISIBLE);
            }
        }

        @Override
        public void onDemoModeFinished() {
            if (mNotificationIconAreaInner == null) return;
            mNotificationIconAreaInner.setVisibility(View.VISIBLE);
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mStatusBarWindowStateController.addListener(mStatusBarWindowStateListener);
        if (mFeatureFlags.isEnabled(Flags.NOTIFICATION_ICON_CONTAINER_REFACTOR)) {
            mDemoModeController.addCallback(mDemoModeCallback);
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mStatusBarWindowStateController.removeListener(mStatusBarWindowStateListener);
        if (mFeatureFlags.isEnabled(Flags.NOTIFICATION_ICON_CONTAINER_REFACTOR)) {
            mDemoModeController.removeCallback(mDemoModeCallback);
        }
    }

    @Override
@@ -405,7 +468,23 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue

    /** Initializes views related to the notification icon area. */
    public void initNotificationIconArea() {
        ViewGroup notificationIconArea = mStatusBar.findViewById(R.id.notification_icon_area);
        ViewGroup notificationIconArea = mStatusBar.requireViewById(R.id.notification_icon_area);
        if (mFeatureFlags.isEnabled(Flags.NOTIFICATION_ICON_CONTAINER_REFACTOR)) {
            mNotificationIconAreaInner =
                LayoutInflater.from(getContext())
                        .inflate(R.layout.notification_icon_area, notificationIconArea, true);
            NotificationIconContainer notificationIcons =
                    notificationIconArea.requireViewById(R.id.notificationIcons);
            NotificationIconContainerViewBinder.bind(
                    notificationIcons,
                    mStatusBarIconsViewModel,
                    mConfigurationState,
                    mConfigurationController,
                    mDozeParameters,
                    mFeatureFlags,
                    mScreenOffAnimationController,
                    mStatusBarIconViewStore);
        } else {
            mNotificationIconAreaInner =
                    mNotificationIconAreaController.getNotificationInnerAreaView();
            if (mNotificationIconAreaInner.getParent() != null) {
@@ -413,6 +492,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
                        .removeView(mNotificationIconAreaInner);
            }
            notificationIconArea.addView(mNotificationIconAreaInner);
        }

        updateNotificationIconAreaAndCallChip(/* animate= */ false);
    }
+18 −4
Original line number Diff line number Diff line
@@ -48,23 +48,29 @@ import android.widget.FrameLayout;
import androidx.test.filters.SmallTest;

import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.res.R;
import com.android.systemui.SysuiBaseFragmentTest;
import com.android.systemui.animation.AnimatorTestRule;
import com.android.systemui.common.ui.ConfigurationState;
import com.android.systemui.demomode.DemoModeController;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.FeatureFlagsClassic;
import com.android.systemui.log.LogBuffer;
import com.android.systemui.log.LogcatEchoTracker;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.res.R;
import com.android.systemui.shade.ShadeExpansionStateManager;
import com.android.systemui.shade.ShadeViewController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.OperatorNameViewController;
import com.android.systemui.statusbar.disableflags.DisableFlagsLogger;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
import com.android.systemui.statusbar.notification.icon.ui.viewbinder.StatusBarNotificationIconViewStore;
import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerStatusBarViewModel;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
import com.android.systemui.statusbar.phone.StatusBarHideIconsForBouncerManager;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarLocationPublisher;
@@ -72,6 +78,7 @@ import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentCom
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.FakeCollapsedStatusBarViewBinder;
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.FakeCollapsedStatusBarViewModel;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.window.StatusBarWindowStateController;
import com.android.systemui.statusbar.window.StatusBarWindowStateListener;
@@ -682,7 +689,7 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
                mLocationPublisher,
                mMockNotificationAreaController,
                mShadeExpansionStateManager,
                mock(FeatureFlags.class),
                mock(FeatureFlagsClassic.class),
                mStatusBarIconController,
                mIconManagerFactory,
                mCollapsedStatusBarViewModel,
@@ -702,7 +709,14 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
                mExecutor,
                mDumpManager,
                mStatusBarWindowStateController,
                mKeyguardUpdateMonitor);
                mKeyguardUpdateMonitor,
                mock(NotificationIconContainerStatusBarViewModel.class),
                mock(ConfigurationState.class),
                mock(ConfigurationController.class),
                mock(DozeParameters.class),
                mock(ScreenOffAnimationController.class),
                mock(StatusBarNotificationIconViewStore.class),
                mock(DemoModeController.class));
    }

    private void setUpDaggerComponent() {