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

Commit cbd07517 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov Committed by Android (Google) Code Review
Browse files

Merge changes I053e6bc2,I1272d78d into main

* changes:
  [SB] Update view model to hide status bar when in keyguard or shade.
  [SB] Set up is<ChildView>Visible flows in CollapsedStatusBarViewModel.
parents 51a6f525 fac24018
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -17,8 +17,12 @@ package com.android.systemui.statusbar.disableflags.data.model
import android.app.StatusBarManager.DISABLE2_NONE
import android.app.StatusBarManager.DISABLE2_NOTIFICATION_SHADE
import android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS
import android.app.StatusBarManager.DISABLE2_SYSTEM_ICONS
import android.app.StatusBarManager.DISABLE_CLOCK
import android.app.StatusBarManager.DISABLE_NONE
import android.app.StatusBarManager.DISABLE_NOTIFICATION_ALERTS
import android.app.StatusBarManager.DISABLE_NOTIFICATION_ICONS
import android.app.StatusBarManager.DISABLE_SYSTEM_INFO
import com.android.systemui.log.LogBuffer
import com.android.systemui.log.core.LogLevel
import com.android.systemui.statusbar.disableflags.DisableFlagsLogger
@@ -27,12 +31,14 @@ import com.android.systemui.statusbar.disableflags.DisableFlagsLogger
 * Model for the disable flags that come from [IStatusBar].
 *
 * For clients of the disable flags: do *not* refer to the disable integers directly. Instead,
 * re-use or define a helper method that internally processes the flags. (We want to hide the
 * bitwise logic here so no one else has to worry about it.)
 * re-use or define a helper method or property that internally processes the flags. (We want to
 * hide the bitwise logic here so no one else has to worry about it.)
 */
data class DisableFlagsModel(
    private val disable1: Int = DISABLE_NONE,
    private val disable2: Int = DISABLE2_NONE,
    /** True if we should animate any view visibility changes and false otherwise. */
    val animate: Boolean = false,
) {
    /** Returns true if notification alerts are allowed based on the flags. */
    fun areNotificationAlertsEnabled(): Boolean {
@@ -49,6 +55,13 @@ data class DisableFlagsModel(
        return (disable2 and DISABLE2_QUICK_SETTINGS) == 0
    }

    val isClockEnabled = (disable1 and DISABLE_CLOCK) == 0

    val areNotificationIconsEnabled = (disable1 and DISABLE_NOTIFICATION_ICONS) == 0

    val isSystemInfoEnabled =
        (disable1 and DISABLE_SYSTEM_INFO) == 0 && (disable2 and DISABLE2_SYSTEM_ICONS) == 0

    /** Logs the change to the provided buffer. */
    fun logChange(buffer: LogBuffer, disableFlagsLogger: DisableFlagsLogger) {
        buffer.log(
@@ -60,9 +73,9 @@ data class DisableFlagsModel(
            },
            {
                disableFlagsLogger.getDisableFlagsString(
                    new = DisableFlagsLogger.DisableState(int1, int2),
                    new = DisableFlagsLogger.DisableState(int1, int2)
                )
            }
            },
        )
    }

+2 −1
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ constructor(
                                    // [QuickSettingsInteractor]-type class. However, that's out of
                                    // scope for the CentralSurfaces removal project.
                                    remoteInputQuickSettingsDisabler.adjustDisableFlags(state2),
                                    animate,
                                )
                            )
                        }
@@ -82,5 +83,5 @@ constructor(
            .distinctUntilChanged()
            .onEach { it.logChange(logBuffer, disableFlagsLogger) }
            // Use Eagerly because we always need to know about disable flags
            .stateIn(scope, SharingStarted.Eagerly, DisableFlagsModel())
            .stateIn(scope, SharingStarted.Eagerly, DisableFlagsModel(animate = false))
}
+61 −8
Original line number Diff line number Diff line
@@ -56,7 +56,8 @@ import com.android.systemui.statusbar.OperatorNameView;
import com.android.systemui.statusbar.OperatorNameViewController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.chips.ron.shared.StatusBarRonChips;
import com.android.systemui.statusbar.disableflags.DisableFlagsLogger.DisableState;
import com.android.systemui.statusbar.core.StatusBarSimpleFragment;
import com.android.systemui.statusbar.disableflags.DisableFlagsLogger;
import com.android.systemui.statusbar.events.SystemStatusAnimationCallback;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerStatusBarViewBinder;
@@ -366,8 +367,10 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
        mPrimaryOngoingActivityChip = mStatusBar.findViewById(R.id.ongoing_activity_chip_primary);
        mSecondaryOngoingActivityChip =
                mStatusBar.findViewById(R.id.ongoing_activity_chip_secondary);
        if (!StatusBarSimpleFragment.isEnabled()) {
            showEndSideContent(false);
            showClock(false);
        }
        initOperatorName();
        initNotificationIconArea();
        mSystemEventAnimator = getSystemEventAnimator();
@@ -455,7 +458,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
        super.onPause();
        mCommandQueue.removeCallback(this);
        mStatusBarStateController.removeCallback(this);
        if (!StatusBarSimpleFragment.isEnabled()) {
            mOngoingCallController.removeCallback(mOngoingCallListener);
        }
        mAnimationScheduler.removeCallback(this);
        mSecureSettings.unregisterContentObserverSync(mVolumeSettingObserver);
    }
@@ -490,7 +495,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
        mNotificationIconAreaInner = notificationIcons;
        mNicBindingDisposable = mNicViewBinder.bindWhileAttached(notificationIcons);

        if (!StatusBarSimpleFragment.isEnabled()) {
            updateNotificationIconAreaAndOngoingActivityChip(/* animate= */ false);
        }
        Trace.endSection();
    }

@@ -509,11 +516,17 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
            new StatusBarVisibilityChangeListener() {
                @Override
                public void onStatusBarVisibilityMaybeChanged() {
                    if (StatusBarSimpleFragment.isEnabled()) {
                        return;
                    }
                    updateStatusBarVisibilities(/* animate= */ true);
                }

                @Override
                public void onTransitionFromLockscreenToDreamStarted() {
                    if (StatusBarSimpleFragment.isEnabled()) {
                        return;
                    }
                    mTransitionFromLockscreenToDreamStarted = true;
                }

@@ -522,6 +535,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
                        boolean hasPrimaryOngoingActivity,
                        boolean hasSecondaryOngoingActivity,
                        boolean shouldAnimate) {
                    if (StatusBarSimpleFragment.isEnabled()) {
                        return;
                    }
                    mHasPrimaryOngoingActivity = hasPrimaryOngoingActivity;
                    mHasSecondaryOngoingActivity = hasSecondaryOngoingActivity;
                    updateStatusBarVisibilities(shouldAnimate);
@@ -530,6 +546,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
                @Override
                public void onIsHomeStatusBarAllowedBySceneChanged(
                        boolean isHomeStatusBarAllowedByScene) {
                    if (StatusBarSimpleFragment.isEnabled()) {
                        return;
                    }
                    mHomeStatusBarAllowedByScene = isHomeStatusBarAllowedByScene;
                    updateStatusBarVisibilities(/* animate= */ true);
                }
@@ -537,17 +556,22 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue

    @Override
    public void disable(int displayId, int state1, int state2, boolean animate) {
        if (StatusBarSimpleFragment.isEnabled()) {
            return;
        }
        if (displayId != getContext().getDisplayId()) {
            return;
        }
        mCollapsedStatusBarFragmentLogger
                .logDisableFlagChange(new DisableState(state1, state2));
                .logDisableFlagChange(new DisableFlagsLogger.DisableState(state1, state2));
        mLastSystemVisibility =
                StatusBarVisibilityModel.createModelFromFlags(state1, state2);
        updateStatusBarVisibilities(animate);
    }

    private void updateStatusBarVisibilities(boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();

        StatusBarVisibilityModel previousModel = mLastModifiedVisibility;
        StatusBarVisibilityModel newModel = calculateInternalModel(mLastSystemVisibility);
        mCollapsedStatusBarFragmentLogger.logVisibilityModel(newModel);
@@ -587,6 +611,8 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue

    private StatusBarVisibilityModel calculateInternalModel(
            StatusBarVisibilityModel externalModel) {
        StatusBarSimpleFragment.assertInLegacyMode();

        // TODO(b/328393714) use HeadsUpNotificationInteractor.showHeadsUpStatusBar instead.
        boolean headsUpVisible =
                mStatusBarFragmentComponent.getHeadsUpAppearanceController().shouldBeVisible();
@@ -639,6 +665,8 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
     * mLastModifiedVisibility.
     */
    private void updateNotificationIconAreaAndOngoingActivityChip(boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();

        StatusBarVisibilityModel visibilityModel = mLastModifiedVisibility;
        boolean disableNotifications = !visibilityModel.getShowNotificationIcons();
        boolean hasOngoingActivity = visibilityModel.getShowPrimaryOngoingActivityChip();
@@ -674,6 +702,8 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
    }

    private boolean shouldHideStatusBar() {
        StatusBarSimpleFragment.assertInLegacyMode();

        if (!mShadeExpansionStateManager.isClosed()
                && mPanelExpansionInteractor.shouldHideStatusBarIconsWhenExpanded()) {
            return true;
@@ -728,6 +758,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
    }

    private void hideEndSideContent(boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        if (!animate || !mAnimationsEnabled) {
            mEndSideAlphaController.setAlpha(/*alpha*/ 0f, SOURCE_OTHER);
        } else {
@@ -737,6 +768,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
    }

    private void showEndSideContent(boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        if (!animate || !mAnimationsEnabled) {
            mEndSideAlphaController.setAlpha(1f, SOURCE_OTHER);
            return;
@@ -753,15 +785,18 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
    }

    private void hideClock(boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        animateHiddenState(mClockView, clockHiddenMode(), animate);
    }

    private void showClock(boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        animateShow(mClockView, animate);
    }

    /** Hides the primary ongoing activity chip. */
    private void hidePrimaryOngoingActivityChip(boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        animateHiddenState(mPrimaryOngoingActivityChip, View.GONE, animate);
    }

@@ -773,15 +808,18 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
     * activities. See b/332662551.
     */
    private void showPrimaryOngoingActivityChip(boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        animateShow(mPrimaryOngoingActivityChip, animate);
    }

    private void hideSecondaryOngoingActivityChip(boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        animateHiddenState(mSecondaryOngoingActivityChip, View.GONE, animate);
    }

    private void showSecondaryOngoingActivityChip(boolean animate) {
        StatusBarRonChips.assertInNewMode();
        StatusBarSimpleFragment.assertInLegacyMode();
        animateShow(mSecondaryOngoingActivityChip, animate);
    }

@@ -790,6 +828,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
     * don't set the clock GONE otherwise it'll mess up the animation.
     */
    private int clockHiddenMode() {
        StatusBarSimpleFragment.assertInLegacyMode();
        if (!mShadeExpansionStateManager.isClosed() && !mKeyguardStateController.isShowing()
                && !mStatusBarStateController.isDozing()) {
            return View.INVISIBLE;
@@ -798,20 +837,24 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
    }

    public void hideNotificationIconArea(boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        animateHide(mNotificationIconAreaInner, animate);
    }

    public void showNotificationIconArea(boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        animateShow(mNotificationIconAreaInner, animate);
    }

    public void hideOperatorName(boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        if (mOperatorNameViewController != null) {
            animateHide(mOperatorNameViewController.getView(), animate);
        }
    }

    public void showOperatorName(boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        if (mOperatorNameViewController != null) {
            animateShow(mOperatorNameViewController.getView(), animate);
        }
@@ -821,6 +864,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
     * Animate a view to INVISIBLE or GONE
     */
    private void animateHiddenState(final View v, int state, boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        v.animate().cancel();
        if (!animate || !mAnimationsEnabled) {
            v.setAlpha(0f);
@@ -840,6 +884,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
     * Hides a view.
     */
    private void animateHide(final View v, boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        animateHiddenState(v, View.INVISIBLE, animate);
    }

@@ -847,6 +892,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
     * Shows a view, and synchronizes the animation with Keyguard exit animations, if applicable.
     */
    private void animateShow(View v, boolean animate) {
        StatusBarSimpleFragment.assertInLegacyMode();
        v.animate().cancel();
        v.setVisibility(View.VISIBLE);
        if (!animate || !mAnimationsEnabled) {
@@ -883,13 +929,17 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
            mOperatorNameViewController.init();
            // This view should not be visible on lock-screen
            if (mKeyguardStateController.isShowing()) {
                if (!StatusBarSimpleFragment.isEnabled()) {
                    hideOperatorName(false);
                }
            }
        }
    }

    private void initOngoingCallChip() {
        if (!StatusBarSimpleFragment.isEnabled()) {
            mOngoingCallController.addCallback(mOngoingCallListener);
        }
        // TODO(b/364653005): Do we also need to set the secondary activity chip?
        mOngoingCallController.setChipView(mPrimaryOngoingActivityChip);
    }
@@ -899,6 +949,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue

    @Override
    public void onDozingChanged(boolean isDozing) {
        if (StatusBarSimpleFragment.isEnabled()) {
            return;
        }
        updateStatusBarVisibilities(/* animate= */ false);
    }

+6 −3
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.view.View
import androidx.core.animation.Interpolator
import androidx.core.animation.ValueAnimator
import com.android.app.animation.InterpolatorsAndroidX
import com.android.systemui.statusbar.core.StatusBarSimpleFragment

/**
 * A controller that keeps track of multiple sources applying alpha value changes to a view. It will
@@ -48,7 +49,7 @@ constructor(private val view: View, private val initialAlpha: Float = 1f) {
        sourceId: Int,
        duration: Long,
        interpolator: Interpolator = InterpolatorsAndroidX.ALPHA_IN,
        startDelay: Long = 0
        startDelay: Long = 0,
    ) {
        animators[sourceId]?.cancel()
        val animator = ValueAnimator.ofFloat(getMinAlpha(), alpha)
@@ -74,9 +75,11 @@ constructor(private val view: View, private val initialAlpha: Float = 1f) {

    private fun applyAlphaToView() {
        val minAlpha = getMinAlpha()
        if (!StatusBarSimpleFragment.isEnabled) {
            view.visibility = if (minAlpha != 0f) View.VISIBLE else View.INVISIBLE
            view.alpha = minAlpha
        }
    }

    private fun getMinAlpha() = alphas.minOfOrNull { it.value } ?: initialAlpha
}
+47 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.statusbar.pipeline.shared.domain.interactor

import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.disableflags.data.repository.DisableFlagsRepository
import com.android.systemui.statusbar.pipeline.shared.domain.model.StatusBarDisableFlagsVisibilityModel
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

/**
 * Interactor for the home screen status bar (aka
 * [com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment]).
 */
@SysUISingleton
class CollapsedStatusBarInteractor
@Inject
constructor(disableFlagsRepository: DisableFlagsRepository) {
    /**
     * The visibilities of various status bar child views, based only on the information we received
     * from disable flags.
     */
    val visibilityViaDisableFlags: Flow<StatusBarDisableFlagsVisibilityModel> =
        disableFlagsRepository.disableFlags.map {
            StatusBarDisableFlagsVisibilityModel(
                isClockAllowed = it.isClockEnabled,
                areNotificationIconsAllowed = it.areNotificationIconsEnabled,
                isSystemInfoAllowed = it.isSystemInfoEnabled,
                animate = it.animate,
            )
        }
}
Loading