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

Commit 0f95290d authored by András Kurucz's avatar András Kurucz
Browse files

Modernize LightsOutNotifController

- Refactor LightsOutNotifController to stop using NotifLiveData.
- Change the API of StatusBarModeRepository, to make it explicit which display is used when subscribing for StatusBarMode updates.

Bug: 308623704
Test: atest SystemUITests:CollapsedStatusBarViewModelImplTest SystemUITests:LightsOutInteractorTest SystemUITests:CollapsedStatusBarFragmentTest
Flag: ACONFIG com.android.systemui.notifications_live_data_store_refactor DEVELOPMENT

Change-Id: I908aedf856657cbbdb5f330a70e1100fea6337c1
parent d2639cb9
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.flags
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor
import com.android.systemui.statusbar.notification.shared.NotificationIconContainerRefactor
import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor
import javax.inject.Inject

/** A class in which engineers can define flag dependencies */
@@ -26,6 +27,7 @@ import javax.inject.Inject
class FlagDependencies @Inject constructor(featureFlags: FeatureFlagsClassic, handler: Handler) :
    FlagDependenciesBase(featureFlags, handler) {
    override fun defineDependencies() {
        NotificationsLiveDataStoreRefactor.token dependsOn NotificationIconContainerRefactor.token
        FooterViewRefactor.token dependsOn NotificationIconContainerRefactor.token
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -36,7 +36,8 @@ enum class StatusBarMode {
    /**
     * A mode where notification icons in the status bar are hidden and replaced by a dot (this mode
     * can be requested by apps). See
     * [com.android.systemui.statusbar.phone.LightsOutNotifController].
     * [com.android.systemui.statusbar.phone.LegacyLightsOutNotifController] and
     * [com.android.systemui.statusbar.phone.domain.interactor.LightsOutInteractor].
     */
    LIGHTS_OUT,
    /** Similar to [LIGHTS_OUT], but also with a transparent background for the status bar. */
+1 −1
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ import kotlinx.coroutines.flow.merge

/**
 * Repository for data that's specific to the status bar **on keyguard**. For data that applies to
 * all status bars, use [StatusBarModeRepository].
 * all status bars, use [StatusBarModeRepositoryStore].
 */
interface KeyguardStatusBarRepository {
    /** True if we can show the user switcher on keyguard and false otherwise. */
+13 −28
Original line number Diff line number Diff line
@@ -25,10 +25,8 @@ import android.view.WindowInsetsController.APPEARANCE_SEMI_TRANSPARENT_STATUS_BA
import android.view.WindowInsetsController.Appearance
import com.android.internal.statusbar.LetterboxDetails
import com.android.internal.view.AppearanceRegion
import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.Dumpable
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.DisplayId
import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewInitializedListener
import com.android.systemui.statusbar.data.model.StatusBarAppearance
@@ -38,13 +36,10 @@ import com.android.systemui.statusbar.phone.LetterboxAppearanceCalculator
import com.android.systemui.statusbar.phone.StatusBarBoundsProvider
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent
import com.android.systemui.statusbar.phone.ongoingcall.data.repository.OngoingCallRepository
import dagger.Binds
import dagger.Module
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
import dagger.multibindings.IntoSet
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import java.io.PrintWriter
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
@@ -61,7 +56,7 @@ import kotlinx.coroutines.flow.stateIn
 * Note: These status bar modes are status bar *window* states that are sent to us from
 * WindowManager, not determined internally.
 */
interface StatusBarModeRepository {
interface StatusBarModePerDisplayRepository {
    /**
     * True if the status bar window is showing transiently and will disappear soon, and false
     * otherwise. ("Otherwise" in this case means the status bar is persistently hidden OR
@@ -108,16 +103,15 @@ interface StatusBarModeRepository {
    fun clearTransient()
}

@SysUISingleton
class StatusBarModeRepositoryImpl
@Inject
class StatusBarModePerDisplayRepositoryImpl
@AssistedInject
constructor(
    @Application scope: CoroutineScope,
    @DisplayId thisDisplayId: Int,
    @Assisted("displayId") thisDisplayId: Int,
    private val commandQueue: CommandQueue,
    private val letterboxAppearanceCalculator: LetterboxAppearanceCalculator,
    ongoingCallRepository: OngoingCallRepository,
) : StatusBarModeRepository, CoreStartable, OnStatusBarViewInitializedListener {
) : StatusBarModePerDisplayRepository, OnStatusBarViewInitializedListener, Dumpable {

    private val commandQueueCallback =
        object : CommandQueue.Callbacks {
@@ -166,7 +160,7 @@ constructor(
            }
        }

    override fun start() {
    fun start() {
        commandQueue.addCallback(commandQueueCallback)
    }

@@ -340,16 +334,7 @@ constructor(
    )
}

@Module
interface StatusBarModeRepositoryModule {
    @Binds fun bindImpl(impl: StatusBarModeRepositoryImpl): StatusBarModeRepository

    @Binds
    @IntoMap
    @ClassKey(StatusBarModeRepositoryImpl::class)
    fun bindCoreStartable(impl: StatusBarModeRepositoryImpl): CoreStartable

    @Binds
    @IntoSet
    fun bindViewInitListener(impl: StatusBarModeRepositoryImpl): OnStatusBarViewInitializedListener
@AssistedFactory
interface StatusBarModePerDisplayRepositoryFactory {
    fun create(@Assisted("displayId") displayId: Int): StatusBarModePerDisplayRepositoryImpl
}
+83 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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.data.repository

import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.DisplayId
import com.android.systemui.statusbar.core.StatusBarInitializer
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent
import dagger.Binds
import dagger.Module
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
import dagger.multibindings.IntoSet
import java.io.PrintWriter
import javax.inject.Inject

interface StatusBarModeRepositoryStore {
    val defaultDisplay: StatusBarModePerDisplayRepository
    fun forDisplay(displayId: Int): StatusBarModePerDisplayRepository
}

@SysUISingleton
class StatusBarModeRepositoryImpl
@Inject
constructor(
    @DisplayId private val displayId: Int,
    factory: StatusBarModePerDisplayRepositoryFactory
) :
    StatusBarModeRepositoryStore,
    CoreStartable,
    StatusBarInitializer.OnStatusBarViewInitializedListener {
    override val defaultDisplay = factory.create(displayId)

    override fun forDisplay(displayId: Int) =
        if (this.displayId == displayId) {
            defaultDisplay
        } else {
            TODO("b/127878649 implement multi-display state management")
        }

    override fun start() {
        defaultDisplay.start()
    }

    override fun onStatusBarViewInitialized(component: StatusBarFragmentComponent) {
        defaultDisplay.onStatusBarViewInitialized(component)
    }

    override fun dump(pw: PrintWriter, args: Array<out String>) {
        defaultDisplay.dump(pw, args)
    }
}

@Module
interface StatusBarModeRepositoryModule {
    @Binds fun bindImpl(impl: StatusBarModeRepositoryImpl): StatusBarModeRepositoryStore

    @Binds
    @IntoMap
    @ClassKey(StatusBarModeRepositoryStore::class)
    fun bindCoreStartable(impl: StatusBarModeRepositoryImpl): CoreStartable

    @Binds
    @IntoSet
    fun bindViewInitListener(
        impl: StatusBarModeRepositoryImpl
    ): StatusBarInitializer.OnStatusBarViewInitializedListener
}
Loading