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

Commit 7bb32f7d authored by Matt Pietal's avatar Matt Pietal
Browse files

Move status view to keyguard root view

Moves the whole space without breaking it apart (yet). This includes
clocks, smartsapce, notif shelf, and media for split shade mode.

Add a guideline to support split shade in the new constraint layout.

Also, simplify how smartspace views are readded especially following a
config change to make sure they get updated.

Bug: 288242803
Test: atest KeyguardStatusViewControllerTest NotificationPanelViewControllerTest

Change-Id: Ide48b8dcd6d111cec8872bf758e8f78797f7860a
parent 5188820e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -212,6 +212,7 @@
    <item type="id" name="keyguard_indication_text" />
    <item type="id" name="keyguard_indication_text_bottom" />
    <item type="id" name="nssl_guideline" />
    <item type="id" name="split_shade_guideline" />
    <item type="id" name="lock_icon" />
    <item type="id" name="lock_icon_bg" />

+24 −33
Original line number Diff line number Diff line
@@ -243,24 +243,8 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
            return;
        }
        updateAodIcons();

        mStatusArea = mView.findViewById(R.id.keyguard_status_area);

        if (mSmartspaceController.isEnabled()) {
            View ksv = mView.findViewById(R.id.keyguard_slice_view);
            int viewIndex = mStatusArea.indexOfChild(ksv);
            ksv.setVisibility(View.GONE);

            // TODO(b/261757708): add content observer for the Settings toggle and add/remove
            //  weather according to the Settings.
            if (mSmartspaceController.isDateWeatherDecoupled()) {
                addDateWeatherView(viewIndex);
                viewIndex += 1;
            }

            addSmartspaceView(viewIndex);
        }

        mSecureSettings.registerContentObserverForUser(
                Settings.Secure.LOCKSCREEN_USE_DOUBLE_LINE_CLOCK,
                false, /* notifyForDescendants */
@@ -274,13 +258,27 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
                mShowWeatherObserver,
                UserHandle.USER_ALL
        );

        updateDoubleLineClock();
        setDateWeatherVisibility();
        setWeatherVisibility();

        mKeyguardUnlockAnimationController.addKeyguardUnlockAnimationListener(
                mKeyguardUnlockAnimationListener);

        if (mSmartspaceController.isEnabled()) {
            View ksv = mView.findViewById(R.id.keyguard_slice_view);
            int viewIndex = mStatusArea.indexOfChild(ksv);
            ksv.setVisibility(View.GONE);

            mSmartspaceController.removeViewsFromParent(mStatusArea);
            addSmartspaceView();
            // TODO(b/261757708): add content observer for the Settings toggle and add/remove
            //  weather according to the Settings.
            if (mSmartspaceController.isDateWeatherDecoupled()) {
                addDateWeatherView();
            }
        }

        setDateWeatherVisibility();
        setWeatherVisibility();
    }

    int getNotificationIconAreaHeight() {
@@ -301,29 +299,22 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS

    void onLocaleListChanged() {
        if (mSmartspaceController.isEnabled()) {
            mSmartspaceController.removeViewsFromParent(mStatusArea);
            addSmartspaceView();
            if (mSmartspaceController.isDateWeatherDecoupled()) {
                mDateWeatherView.removeView(mWeatherView);
                int index = mStatusArea.indexOfChild(mDateWeatherView);
                if (index >= 0) {
                    mStatusArea.removeView(mDateWeatherView);
                    addDateWeatherView(index);
                }
                addDateWeatherView();
                setDateWeatherVisibility();
                setWeatherVisibility();
            }
            int index = mStatusArea.indexOfChild(mSmartspaceView);
            if (index >= 0) {
                mStatusArea.removeView(mSmartspaceView);
                addSmartspaceView(index);
            }
        }
    }

    private void addDateWeatherView(int index) {
    private void addDateWeatherView() {
        mDateWeatherView = (ViewGroup) mSmartspaceController.buildAndConnectDateView(mView);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                MATCH_PARENT, WRAP_CONTENT);
        mStatusArea.addView(mDateWeatherView, index, lp);
        mStatusArea.addView(mDateWeatherView, 0, lp);
        int startPadding = getContext().getResources().getDimensionPixelSize(
                R.dimen.below_clock_padding_start);
        int endPadding = getContext().getResources().getDimensionPixelSize(
@@ -343,11 +334,11 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
        mWeatherView.setPaddingRelative(0, 0, 4, 0);
    }

    private void addSmartspaceView(int index) {
    private void addSmartspaceView() {
        mSmartspaceView = mSmartspaceController.buildAndConnectView(mView);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                MATCH_PARENT, WRAP_CONTENT);
        mStatusArea.addView(mSmartspaceView, index, lp);
        mStatusArea.addView(mSmartspaceView, 0, lp);
        int startPadding = getContext().getResources().getDimensionPixelSize(
                R.dimen.below_clock_padding_start);
        int endPadding = getContext().getResources().getDimensionPixelSize(
+23 −11
Original line number Diff line number Diff line
@@ -150,7 +150,8 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
    @Override
    public void onInit() {
        mKeyguardClockSwitchController.init();
        mDumpManager.registerDumpable(this);

        mDumpManager.registerDumpable(getInstanceName(), this);
        if (mFeatureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) {
            startCoroutines(EmptyCoroutineContext.INSTANCE);
        }
@@ -190,7 +191,7 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
     * Called in notificationPanelViewController to avoid leak
     */
    public void onDestroy() {
        mDumpManager.unregisterDumpable(TAG);
        mDumpManager.unregisterDumpable(getInstanceName());
    }

    /**
@@ -385,7 +386,7 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
     * Updates the alignment of the KeyguardStatusView and animates the transition if requested.
     */
    public void updateAlignment(
            ConstraintLayout notifContainerParent,
            ConstraintLayout layout,
            boolean splitShadeEnabled,
            boolean shouldBeCentered,
            boolean animate) {
@@ -395,16 +396,23 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
        }

        mStatusViewCentered = shouldBeCentered;
        if (notifContainerParent == null) {
        if (layout == null) {
            return;
        }

        ConstraintSet constraintSet = new ConstraintSet();
        constraintSet.clone(notifContainerParent);
        int statusConstraint = shouldBeCentered ? PARENT_ID : R.id.qs_edge_guideline;
        constraintSet.clone(layout);
        int guideline;
        if (mFeatureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) {
            guideline = R.id.split_shade_guideline;
        } else {
            guideline = R.id.qs_edge_guideline;
        }

        int statusConstraint = shouldBeCentered ? PARENT_ID : guideline;
        constraintSet.connect(R.id.keyguard_status_view, END, statusConstraint, END);
        if (!animate) {
            constraintSet.applyTo(notifContainerParent);
            constraintSet.applyTo(layout);
            return;
        }

@@ -447,7 +455,7 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
            // old animation rather than setting up the custom animations.
            if (clockContainerView == null || clockContainerView.getChildCount() == 0) {
                transition.addListener(mKeyguardStatusAlignmentTransitionListener);
                TransitionManager.beginDelayedTransition(notifContainerParent, transition);
                TransitionManager.beginDelayedTransition(layout, transition);
            } else {
                View clockView = clockContainerView.getChildAt(0);

@@ -481,14 +489,14 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
                }

                set.addListener(mKeyguardStatusAlignmentTransitionListener);
                TransitionManager.beginDelayedTransition(notifContainerParent, set);
                TransitionManager.beginDelayedTransition(layout, set);
            }
        } else {
            transition.addListener(mKeyguardStatusAlignmentTransitionListener);
            TransitionManager.beginDelayedTransition(notifContainerParent, transition);
            TransitionManager.beginDelayedTransition(layout, transition);
        }

        constraintSet.applyTo(notifContainerParent);
        constraintSet.applyTo(layout);
    }

    @Override
@@ -496,6 +504,10 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
        mView.dump(pw, args);
    }

    String getInstanceName() {
        return TAG + "#" + hashCode();
    }

    @VisibleForTesting
    static class SplitShadeTransitionAdapter extends Transition {
        private static final String PROP_BOUNDS_LEFT = "splitShadeTransitionAdapter:boundsLeft";
+33 −1
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ package com.android.systemui.keyguard
import android.content.res.Configuration
import android.view.View
import android.view.ViewGroup
import com.android.keyguard.KeyguardStatusViewController
import com.android.keyguard.dagger.KeyguardStatusViewComponent
import com.android.systemui.CoreStartable
import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
@@ -80,6 +82,7 @@ constructor(
    private val chipbarCoordinator: ChipbarCoordinator,
    private val keyguardBlueprintCommandListener: KeyguardBlueprintCommandListener,
    private val keyguardBlueprintViewModel: KeyguardBlueprintViewModel,
    private val keyguardStatusViewComponentFactory: KeyguardStatusViewComponent.Factory,
) : CoreStartable {

    private var rootViewHandle: DisposableHandle? = null
@@ -88,6 +91,7 @@ constructor(
    private var rightShortcutHandle: KeyguardQuickAffordanceViewBinder.Binding? = null
    private var ambientIndicationAreaHandle: KeyguardAmbientIndicationAreaViewBinder.Binding? = null
    private var settingsPopupMenuHandle: DisposableHandle? = null
    private var keyguardStatusViewController: KeyguardStatusViewController? = null

    override fun start() {
        bindKeyguardRootView()
@@ -96,6 +100,7 @@ constructor(
        unbindKeyguardBottomArea(notificationPanel)
        bindIndicationArea()
        bindLockIconView(notificationPanel)
        bindKeyguardStatusView(notificationPanel)
        setupNotificationStackScrollLayout(notificationPanel)
        bindLeftShortcut()
        bindRightShortcut()
@@ -117,7 +122,7 @@ constructor(
            sharedNotificationContainer.addNotificationStackScrollLayout(nssl)
            SharedNotificationContainerBinder.bind(
                sharedNotificationContainer,
                sharedNotificationContainerViewModel
                sharedNotificationContainerViewModel,
            )
        }
    }
@@ -255,4 +260,31 @@ constructor(
            }
        }
    }

    fun bindKeyguardStatusView(legacyParent: ViewGroup) {
        // At startup, 2 views with the ID `R.id.keyguard_status_view` will be available.
        // Disable one of them
        if (featureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) {
            legacyParent.findViewById<View>(R.id.keyguard_status_view)?.let {
                legacyParent.removeView(it)
            }

            val keyguardStatusView = keyguardRootView.addStatusView()
            val statusViewComponent = keyguardStatusViewComponentFactory.build(keyguardStatusView)
            val controller = statusViewComponent.getKeyguardStatusViewController()
            controller.init()
            keyguardStatusViewController = controller
        } else {
            keyguardRootView.findViewById<View?>(R.id.keyguard_status_view)?.let {
                keyguardRootView.removeView(it)
            }
        }
    }

    /**
     * Temporary, to allow NotificationPanelViewController to use the same instance while code is
     * migrated: b/288242803
     */
    fun getKeyguardStatusViewController() = keyguardStatusViewController
    fun getKeyguardRootView() = keyguardRootView
}
+6 −3
Original line number Diff line number Diff line
@@ -199,13 +199,16 @@ interface KeyguardRepository {
    fun setAnimateDozingTransitions(animate: Boolean)

    /** Sets the current amount of alpha that should be used for rendering the bottom area. */
    @Deprecated("Deprecated as part of b/278057014")
    fun setBottomAreaAlpha(alpha: Float)
    @Deprecated("Deprecated as part of b/278057014") fun setBottomAreaAlpha(alpha: Float)

    /** Sets the current amount of alpha that should be used for rendering the keyguard. */
    fun setKeyguardAlpha(alpha: Float)

    fun setKeyguardVisibility(statusBarState: Int, goingToFullShade: Boolean, occlusionTransitionRunning: Boolean)
    fun setKeyguardVisibility(
        statusBarState: Int,
        goingToFullShade: Boolean,
        occlusionTransitionRunning: Boolean
    )

    /**
     * Sets the relative offset of the lock-screen clock from its natural position on the screen.
Loading