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

Commit e5db5c65 authored by Nicolo' Mazzucato's avatar Nicolo' Mazzucato
Browse files

Fix status bar icon size when shade goes around

NotificationIconContainerStatusBarViewBinder was using the configuration state for the shade, even if it was used for the statusbar in any display.

This was causing icon sizes to change (to wrong values) every time the shade changed display.

Bug: 362719719
Bug: 389600840
Test: Move shade between displays and check icon sizes
Flag: com.android.systemui.shade_window_goes_around
Flag: com.android.systemui.shared.status_bar_connected_displays
Change-Id: Ie34a4ac6665cc588d5be20aa810843a35693a89c
parent 976713c2
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import androidx.annotation.ColorInt
import androidx.annotation.DimenRes
import androidx.annotation.LayoutRes
import com.android.settingslib.Utils
import com.android.systemui.statusbar.data.repository.StatusBarConfigurationState
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.onDensityOrFontScaleChanged
import com.android.systemui.statusbar.policy.onThemeChanged
@@ -78,7 +79,7 @@ class ConfigurationStateImpl
constructor(
    @Assisted private val configurationController: ConfigurationController,
    @Assisted private val context: Context,
) : ConfigurationState {
) : ConfigurationState, StatusBarConfigurationState {

    private val layoutInflater = LayoutInflater.from(context)

@@ -147,7 +148,7 @@ constructor(
         */
        fun create(
            context: Context,
            configurationController: ConfigurationController
            configurationController: ConfigurationController,
        ): ConfigurationStateImpl
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import com.android.systemui.statusbar.data.repository.KeyguardStatusBarRepositor
import com.android.systemui.statusbar.data.repository.LightBarControllerStoreModule
import com.android.systemui.statusbar.data.repository.RemoteInputRepositoryModule
import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerModule
import com.android.systemui.statusbar.data.repository.StatusBarConfigurationStateModule
import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStoreModule
import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryModule
import com.android.systemui.statusbar.data.repository.SystemEventChipAnimationControllerStoreModule
@@ -34,6 +35,7 @@ import dagger.Module
            LightBarControllerStoreModule::class,
            RemoteInputRepositoryModule::class,
            StatusBarConfigurationControllerModule::class,
            StatusBarConfigurationStateModule::class,
            StatusBarContentInsetsProviderStoreModule::class,
            StatusBarModeRepositoryModule::class,
            StatusBarPhoneDataLayerModule::class,
+120 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 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 android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR
import com.android.systemui.CoreStartable
import com.android.systemui.common.ui.ConfigurationState
import com.android.systemui.common.ui.ConfigurationStateImpl
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.display.data.repository.DisplayRepository
import com.android.systemui.display.data.repository.DisplayWindowPropertiesRepository
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 dagger.Lazy
import dagger.Module
import dagger.Provides
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope

/** Status bar specific interface to disambiguate from the global [ConfigurationState]. */
interface StatusBarConfigurationState : ConfigurationState

/** Provides per display instances of [ConfigurationState], specifically for the Status Bar. */
interface StatusBarConfigurationStateStore : PerDisplayStore<StatusBarConfigurationState>

@SysUISingleton
class MultiDisplayStatusBarConfigurationStateStore
@Inject
constructor(
    @Background backgroundApplicationScope: CoroutineScope,
    displayRepository: DisplayRepository,
    private val displayWindowPropertiesRepository: DisplayWindowPropertiesRepository,
    private val statusBarConfigurationControllerStore: StatusBarConfigurationControllerStore,
    private val factory: ConfigurationStateImpl.Factory,
) :
    StatusBarConfigurationStateStore,
    PerDisplayStoreImpl<StatusBarConfigurationState>(
        backgroundApplicationScope,
        displayRepository,
    ) {

    init {
        StatusBarConnectedDisplays.unsafeAssertInNewMode()
    }

    override fun createInstanceForDisplay(displayId: Int): StatusBarConfigurationState? {
        val displayWindowProperties =
            displayWindowPropertiesRepository.get(displayId, TYPE_STATUS_BAR) ?: return null
        val configController =
            statusBarConfigurationControllerStore.forDisplay(displayId) ?: return null
        return factory.create(displayWindowProperties.context, configController)
    }

    override val instanceClass = StatusBarConfigurationState::class.java
}

@SysUISingleton
class SingleDisplayStatusBarConfigurationStateStore
@Inject
constructor(@Main globalConfigState: ConfigurationState) :
    StatusBarConfigurationStateStore,
    PerDisplayStore<StatusBarConfigurationState> by SingleDisplayStore(
        globalConfigState as StatusBarConfigurationState
    ) {

    init {
        StatusBarConnectedDisplays.assertInLegacyMode()
    }
}

@Module
object StatusBarConfigurationStateModule {

    @Provides
    @SysUISingleton
    fun store(
        singleDisplayLazy: Lazy<SingleDisplayStatusBarConfigurationStateStore>,
        multiDisplayLazy: Lazy<MultiDisplayStatusBarConfigurationStateStore>,
    ): StatusBarConfigurationStateStore {
        return if (StatusBarConnectedDisplays.isEnabled) {
            multiDisplayLazy.get()
        } else {
            singleDisplayLazy.get()
        }
    }

    @Provides
    @SysUISingleton
    @IntoMap
    @ClassKey(StatusBarConfigurationStateStore::class)
    fun storeAsCoreStartable(
        multiDisplayLazy: Lazy<MultiDisplayStatusBarConfigurationStateStore>
    ): CoreStartable {
        return if (StatusBarConnectedDisplays.isEnabled) {
            multiDisplayLazy.get()
        } else {
            CoreStartable.NOP
        }
    }
}
+6 −4
Original line number Diff line number Diff line
@@ -18,11 +18,10 @@ package com.android.systemui.statusbar.notification.icon.ui.viewbinder

import android.view.Display
import androidx.lifecycle.lifecycleScope
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.app.tracing.traceSection
import com.android.systemui.common.ui.ConfigurationState
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.shade.ShadeDisplayAware
import com.android.systemui.statusbar.data.repository.StatusBarConfigurationStateStore
import com.android.systemui.statusbar.notification.collection.NotifCollection
import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder.IconViewStore
import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerStatusBarViewModel
@@ -37,7 +36,8 @@ class NotificationIconContainerStatusBarViewBinder
@Inject
constructor(
    private val viewModel: NotificationIconContainerStatusBarViewModel,
    @ShadeDisplayAware private val configuration: ConfigurationState,
    private val configurationStore: StatusBarConfigurationStateStore,
    private val defaultConfigurationState: ConfigurationState,
    private val systemBarUtilsState: SystemBarUtilsState,
    private val failureTracker: StatusBarIconViewBindingFailureTracker,
    private val defaultDisplayViewStore: StatusBarNotificationIconViewStore,
@@ -56,12 +56,14 @@ constructor(
                            lifecycleScope.launch { it.activate() }
                        }
                    }
                val configurationState: ConfigurationState =
                    configurationStore.forDisplay(displayId) ?: defaultConfigurationState
                lifecycleScope.launch {
                    NotificationIconContainerViewBinder.bind(
                        displayId = displayId,
                        view = view,
                        viewModel = viewModel,
                        configuration = configuration,
                        configuration = configurationState,
                        systemBarUtilsState = systemBarUtilsState,
                        failureTracker = failureTracker,
                        viewStore = viewStore,