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

Commit 1468a5f3 authored by Chris Göllner's avatar Chris Göllner
Browse files

Introduce PrivacyDotViewControllerStore for multiple displays

+ Adds "stop" method so that the controller can unregister listeners

Test: Tested by parent abstract class
Test: Build & run
Flag: com.android.systemui.status_bar_connected_displays
Bug: 362720432
Change-Id: I20fbf998432a1745d59ed1f36a5a2e02e4ebdebd
parent f4bef470
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.data

import com.android.systemui.statusbar.data.repository.KeyguardStatusBarRepositoryModule
import com.android.systemui.statusbar.data.repository.PrivacyDotViewControllerStoreModule
import com.android.systemui.statusbar.data.repository.RemoteInputRepositoryModule
import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerModule
import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStoreModule
@@ -27,6 +28,7 @@ import dagger.Module
    includes =
        [
            KeyguardStatusBarRepositoryModule::class,
            PrivacyDotViewControllerStoreModule::class,
            RemoteInputRepositoryModule::class,
            StatusBarConfigurationControllerModule::class,
            StatusBarContentInsetsProviderStoreModule::class,
+108 −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.data.repository

import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.display.data.repository.DisplayRepository
import com.android.systemui.display.data.repository.DisplayScopeRepository
import com.android.systemui.display.data.repository.PerDisplayStore
import com.android.systemui.display.data.repository.PerDisplayStoreImpl
import com.android.systemui.display.data.repository.SingleDisplayStore
import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
import com.android.systemui.statusbar.events.PrivacyDotViewController
import com.android.systemui.statusbar.events.PrivacyDotViewControllerImpl
import dagger.Lazy
import dagger.Module
import dagger.Provides
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope

/** Provides per display instances of [PrivacyDotViewController]. */
interface PrivacyDotViewControllerStore : PerDisplayStore<PrivacyDotViewController>

@SysUISingleton
class MultiDisplayPrivacyDotViewControllerStore
@Inject
constructor(
    @Background backgroundApplicationScope: CoroutineScope,
    displayRepository: DisplayRepository,
    private val factory: PrivacyDotViewControllerImpl.Factory,
    private val displayScopeRepository: DisplayScopeRepository,
    private val statusBarConfigurationControllerStore: StatusBarConfigurationControllerStore,
    private val contentInsetsProviderStore: StatusBarContentInsetsProviderStore,
) :
    PrivacyDotViewControllerStore,
    PerDisplayStoreImpl<PrivacyDotViewController>(backgroundApplicationScope, displayRepository) {

    override fun createInstanceForDisplay(displayId: Int): PrivacyDotViewController {
        return factory.create(
            displayScopeRepository.scopeForDisplay(displayId),
            statusBarConfigurationControllerStore.forDisplay(displayId),
            contentInsetsProviderStore.forDisplay(displayId),
        )
    }

    override suspend fun onDisplayRemovalAction(instance: PrivacyDotViewController) {
        instance.stop()
    }

    override val instanceClass = PrivacyDotViewController::class.java
}

@SysUISingleton
class SingleDisplayPrivacyDotViewControllerStore
@Inject
constructor(defaultController: PrivacyDotViewController) :
    PrivacyDotViewControllerStore,
    PerDisplayStore<PrivacyDotViewController> by SingleDisplayStore(
        defaultInstance = defaultController
    )

@Module
object PrivacyDotViewControllerStoreModule {

    @Provides
    @SysUISingleton
    fun store(
        singleDisplayLazy: Lazy<SingleDisplayPrivacyDotViewControllerStore>,
        multiDisplayLazy: Lazy<MultiDisplayPrivacyDotViewControllerStore>,
    ): PrivacyDotViewControllerStore {
        return if (StatusBarConnectedDisplays.isEnabled) {
            multiDisplayLazy.get()
        } else {
            singleDisplayLazy.get()
        }
    }

    @Provides
    @SysUISingleton
    @IntoMap
    @ClassKey(PrivacyDotViewControllerStore::class)
    fun storeAsCoreStartable(
        multiDisplayLazy: Lazy<MultiDisplayPrivacyDotViewControllerStore>
    ): CoreStartable {
        return if (StatusBarConnectedDisplays.isEnabled) {
            multiDisplayLazy.get()
        } else {
            CoreStartable.NOP
        }
    }
}
+43 −30
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import com.android.systemui.res.R
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.statusbar.StatusBarState.SHADE
import com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED
import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore
import com.android.systemui.statusbar.phone.StatusBarContentInsetsChangedListener
import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
@@ -70,6 +71,11 @@ import kotlinx.coroutines.launch
 */
interface PrivacyDotViewController {

    /**
     * Called when the [PrivacyDotViewController] should stop doing any work and clean up if needed.
     */
    fun stop()

    // Only can be modified on @UiThread
    var currentViewState: ViewState

@@ -138,21 +144,19 @@ constructor(

    override var showingListener: PrivacyDotViewController.ShowingListener? = null

    init {
        contentInsetsProvider.addCallback(
    private val insetsChangedListener =
        object : StatusBarContentInsetsChangedListener {
            override fun onStatusBarContentInsetsChanged() {
                dlog("onStatusBarContentInsetsChanged: ")
                setNewLayoutRects()
            }
        }
        )

        configurationController.addCallback(
    private val configurationListener =
        object : ConfigurationController.ConfigurationListener {
            override fun onLayoutDirectionChanged(isRtl: Boolean) {
                uiExecutor?.execute {
                        // If rtl changed, hide all dotes until the next state resolves
                    // If rtl changed, hide all dots until the next state resolves
                    setCornerVisibilities(View.INVISIBLE)

                    synchronized(this) {
@@ -163,9 +167,8 @@ constructor(
                }
            }
        }
        )

        stateController.addCallback(
    private val statusBarStateListener =
        object : StatusBarStateController.StateListener {
            override fun onExpandedChanged(isExpanded: Boolean) {
                updateStatusBarState()
@@ -175,8 +178,11 @@ constructor(
                updateStatusBarState()
            }
        }
        )

    init {
        contentInsetsProvider.addCallback(insetsChangedListener)
        configurationController.addCallback(configurationListener)
        stateController.addCallback(statusBarStateListener)
        scope.launch {
            shadeInteractor?.isQsExpanded?.collect { isQsExpanded ->
                dlog("setQsExpanded $isQsExpanded")
@@ -185,6 +191,13 @@ constructor(
        }
    }

    override fun stop() {
        StatusBarConnectedDisplays.assertInNewMode()
        contentInsetsProvider.removeCallback(insetsChangedListener)
        configurationController.removeCallback(configurationListener)
        stateController.removeCallback(statusBarStateListener)
    }

    override fun setUiExecutor(e: DelayableExecutor) {
        uiExecutor = e
    }