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

Commit b8ba884a authored by Caitlin Cassidy's avatar Caitlin Cassidy
Browse files

[Status Bar Refactor] Move LightsOutNotifController to the

FragmentComponent since it effectively gets re-created each time we
create a new status bar view.

Test: manual (verified controller was re-created each time SBV was
re-created and verified only one controller was active at a time)
Test: LightsOutNotifControllerTest
Bug: 209005990
Bug: 205609837

Change-Id: Idd80cf6461512a7e3e8a3b15667898991eef9e72
parent 77243f98
Loading
Loading
Loading
Loading
+26 −35
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.systemui.statusbar.phone;

import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS;

import static com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentModule.LIGHTS_OUT_NOTIF_VIEW;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.Nullable;
@@ -31,13 +33,15 @@ import android.view.animation.AccelerateInterpolator;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.internal.view.AppearanceRegion;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentScope;
import com.android.systemui.util.ViewController;

import javax.inject.Inject;
import javax.inject.Named;

/**
 * Apps can request a low profile mode {@link View.SYSTEM_UI_FLAG_LOW_PROFILE}
@@ -47,8 +51,8 @@ import javax.inject.Inject;
 * This controller shows and hides the notification dot in the status bar to indicate
 * whether there are notifications when the device is in {@link View.SYSTEM_UI_FLAG_LOW_PROFILE}.
 */
@SysUISingleton
public class LightsOutNotifController {
@StatusBarFragmentScope
public class LightsOutNotifController extends ViewController<View> {
    private final CommandQueue mCommandQueue;
    private final NotificationEntryManager mEntryManager;
    private final WindowManager mWindowManager;
@@ -57,40 +61,31 @@ public class LightsOutNotifController {
    @VisibleForTesting @Appearance int mAppearance;

    private int mDisplayId;
    private View mLightsOutNotifView;

    @Inject
    LightsOutNotifController(WindowManager windowManager,
    LightsOutNotifController(
            @Named(LIGHTS_OUT_NOTIF_VIEW) View lightsOutNotifView,
            WindowManager windowManager,
            NotificationEntryManager entryManager,
            CommandQueue commandQueue) {
        super(lightsOutNotifView);
        mWindowManager = windowManager;
        mEntryManager = entryManager;
        mCommandQueue = commandQueue;
    }

    /**
     * Sets the notification dot view after it is created in the StatusBar.
     * This is the view this controller will show and hide depending on whether:
     * 1. there are active notifications
     * 2. an app has requested {@link View.SYSTEM_UI_FLAG_LOW_PROFILE}
     */
    void setLightsOutNotifView(View lightsOutNotifView) {
        destroy();
        mLightsOutNotifView = lightsOutNotifView;

        if (mLightsOutNotifView != null) {
            mLightsOutNotifView.setVisibility(View.GONE);
            mLightsOutNotifView.setAlpha(0f);
            init();
        }
    }

    private void destroy() {
    @Override
    protected void onViewDetached() {
        mEntryManager.removeNotificationEntryListener(mEntryListener);
        mCommandQueue.removeCallback(mCallback);
    }

    private void init() {
    @Override
    protected void onViewAttached() {
        mView.setVisibility(View.GONE);
        mView.setAlpha(0f);

        mDisplayId = mWindowManager.getDefaultDisplay().getDisplayId();
        mEntryManager.addNotificationEntryListener(mEntryListener);
        mCommandQueue.addCallback(mCallback);
@@ -104,29 +99,25 @@ public class LightsOutNotifController {

    @VisibleForTesting
    void updateLightsOutView() {
        if (mLightsOutNotifView == null) {
            return;
        }

        final boolean showDot = shouldShowDot();
        if (showDot != isShowingDot()) {
            if (showDot) {
                mLightsOutNotifView.setAlpha(0f);
                mLightsOutNotifView.setVisibility(View.VISIBLE);
                mView.setAlpha(0f);
                mView.setVisibility(View.VISIBLE);
            }

            mLightsOutNotifView.animate()
            mView.animate()
                    .alpha(showDot ? 1 : 0)
                    .setDuration(showDot ? 750 : 250)
                    .setInterpolator(new AccelerateInterpolator(2.0f))
                    .setListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationEnd(Animator a) {
                            mLightsOutNotifView.setAlpha(showDot ? 1 : 0);
                            mLightsOutNotifView.setVisibility(showDot ? View.VISIBLE : View.GONE);
                            mView.setAlpha(showDot ? 1 : 0);
                            mView.setVisibility(showDot ? View.VISIBLE : View.GONE);
                            // Unset the listener, otherwise this may persist for
                            // another view property animation
                            mLightsOutNotifView.animate().setListener(null);
                            mView.animate().setListener(null);
                        }
                    })
                    .start();
@@ -135,8 +126,8 @@ public class LightsOutNotifController {

    @VisibleForTesting
    boolean isShowingDot() {
        return mLightsOutNotifView.getVisibility() == View.VISIBLE
                && mLightsOutNotifView.getAlpha() == 1.0f;
        return mView.getVisibility() == View.VISIBLE
                && mView.getAlpha() == 1.0f;
    }

    @VisibleForTesting
+0 −6
Original line number Diff line number Diff line
@@ -499,7 +499,6 @@ public class StatusBar extends CoreStartable implements
    private final StatusBarNotificationActivityStarter.Builder
            mStatusBarNotificationActivityStarterBuilder;
    private final ShadeController mShadeController;
    private final LightsOutNotifController mLightsOutNotifController;
    private final InitController mInitController;

    private final PluginDependencyProvider mPluginDependencyProvider;
@@ -756,7 +755,6 @@ public class StatusBar extends CoreStartable implements
            StatusBarComponent.Factory statusBarComponentFactory,
            PluginManager pluginManager,
            Optional<LegacySplitScreen> splitScreenOptional,
            LightsOutNotifController lightsOutNotifController,
            StatusBarNotificationActivityStarter.Builder
                    statusBarNotificationActivityStarterBuilder,
            ShadeController shadeController,
@@ -863,7 +861,6 @@ public class StatusBar extends CoreStartable implements
        mSplitScreenOptional = splitScreenOptional;
        mStatusBarNotificationActivityStarterBuilder = statusBarNotificationActivityStarterBuilder;
        mShadeController = shadeController;
        mLightsOutNotifController =  lightsOutNotifController;
        mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
        mKeyguardViewMediatorCallback = viewMediatorCallback;
        mInitController = initController;
@@ -1166,9 +1163,6 @@ public class StatusBar extends CoreStartable implements
                    // displayed).
                    mNotificationPanelViewController.updatePanelExpansionAndVisibility();
                    setBouncerShowingForStatusBarComponents(mBouncerShowing);

                    mLightsOutNotifController.setLightsOutNotifView(
                            mStatusBarView.findViewById(R.id.notification_lights_out));
                    mNotificationShadeWindowViewController.setStatusBarView(mStatusBarView);
                    checkBarModes();
                }).getFragmentManager()
+0 −3
Original line number Diff line number Diff line
@@ -85,7 +85,6 @@ import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
import com.android.systemui.statusbar.phone.LightBarController;
import com.android.systemui.statusbar.phone.LightsOutNotifController;
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
import com.android.systemui.statusbar.phone.LockscreenWallpaper;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
@@ -205,7 +204,6 @@ public interface StatusBarPhoneModule {
            StatusBarComponent.Factory statusBarComponentFactory,
            PluginManager pluginManager,
            Optional<LegacySplitScreen> splitScreenOptional,
            LightsOutNotifController lightsOutNotifController,
            StatusBarNotificationActivityStarter.Builder
                    statusBarNotificationActivityStarterBuilder,
            ShadeController shadeController,
@@ -308,7 +306,6 @@ public interface StatusBarPhoneModule {
                statusBarComponentFactory,
                pluginManager,
                splitScreenOptional,
                lightsOutNotifController,
                statusBarNotificationActivityStarterBuilder,
                shadeController,
                statusBarKeyguardViewManager,
+8 −2
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.statusbar.phone.fragment.dagger;
import com.android.systemui.battery.BatteryMeterViewController;
import com.android.systemui.dagger.qualifiers.RootView;
import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
import com.android.systemui.statusbar.phone.LightsOutNotifController;
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
import com.android.systemui.statusbar.phone.PhoneStatusBarViewController;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment;
@@ -55,11 +56,12 @@ public interface StatusBarFragmentComponent {
     * Initialize anything extra for the component. Must be called after the component is created.
     */
    default void init() {
        // No one accesses this controller, so we need to make sure we reference it here so it does
        // get initialized.
        // No one accesses these controllers, so we need to make sure we reference them here so they
        // do get initialized.
        getBatteryMeterViewController().init();
        getHeadsUpAppearanceController().init();
        getPhoneStatusBarViewController().init();
        getLightsOutNotifController().init();
    }

    /** */
@@ -78,4 +80,8 @@ public interface StatusBarFragmentComponent {
    /** */
    @StatusBarFragmentScope
    HeadsUpAppearanceController getHeadsUpAppearanceController();

    /** */
    @StatusBarFragmentScope
    LightsOutNotifController getLightsOutNotifController();
}
+15 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.systemui.statusbar.phone.fragment.dagger;

import android.view.View;

import com.android.systemui.R;
import com.android.systemui.battery.BatteryMeterView;
import com.android.systemui.dagger.qualifiers.RootView;
@@ -24,12 +26,17 @@ import com.android.systemui.statusbar.phone.PhoneStatusBarView;
import com.android.systemui.statusbar.phone.PhoneStatusBarViewController;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment;

import javax.inject.Named;

import dagger.Module;
import dagger.Provides;

/** Dagger module for {@link StatusBarFragmentComponent}. */
@Module
public interface StatusBarFragmentModule {

    String LIGHTS_OUT_NOTIF_VIEW = "lights_out_notif_view";

    /** */
    @Provides
    @RootView
@@ -46,6 +53,14 @@ public interface StatusBarFragmentModule {
        return view.findViewById(R.id.battery);
    }

    /** */
    @Provides
    @StatusBarFragmentScope
    @Named(LIGHTS_OUT_NOTIF_VIEW)
    static View provideLightsOutNotifView(@RootView PhoneStatusBarView view) {
        return view.findViewById(R.id.notification_lights_out);
    }

    /** */
    @Provides
    @StatusBarFragmentScope
Loading