summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2024-04-26 02:14:45 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-04-26 02:14:45 +0000
commitffeed61e0d2ea28db3567180aece667671e1fcde (patch)
tree263b48473bb4ffbdc8b1bc73e64414fa29e7f8a6
parent8cf22a2f172f0dcb943c6fd6bd95b89dc5ad2378 (diff)
parent03f9f8ada2925390fac4c7f6af3d6c394ce6a261 (diff)
Merge "[SB][Misc] Move IconManager classes into their own files." into main
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt4
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt4
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java602
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/DarkIconManager.java141
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/IconManager.java307
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/StatusBarIconController.java117
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/StatusBarIconControllerImpl.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java)13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/StatusBarIconList.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java)7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/TintedIconManager.java124
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconsBinder.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/repository/ConnectivityRepository.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/WifiUiAdapter.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/ClockPreference.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt31
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt1
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ui/StatusBarIconControllerImplTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImplTest.kt)9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ui/StatusBarIconControllerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java)39
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ui/StatusBarIconListTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconListTest.java)10
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java4
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/LeakCheckedTest.java2
39 files changed, 799 insertions, 704 deletions
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
index fc32440e40fe..f6575dc9768b 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
@@ -78,9 +78,9 @@ import com.android.systemui.shade.ui.composable.ExpandedShadeHeader
import com.android.systemui.shade.ui.composable.Shade
import com.android.systemui.shade.ui.composable.ShadeHeader
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
-import com.android.systemui.statusbar.phone.StatusBarIconController
-import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager
import com.android.systemui.statusbar.phone.StatusBarLocation
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController
+import com.android.systemui.statusbar.phone.ui.TintedIconManager
import javax.inject.Inject
import kotlin.math.roundToInt
import kotlinx.coroutines.CoroutineScope
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt
index cfb069a4414e..d3b3d1585f83 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt
@@ -69,10 +69,10 @@ import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.ui.composable.ShadeHeader.Dimensions.CollapsedHeight
import com.android.systemui.shade.ui.composable.ShadeHeader.Values.ClockScale
import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel
-import com.android.systemui.statusbar.phone.StatusBarIconController
-import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.StatusIconContainer
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController
+import com.android.systemui.statusbar.phone.ui.TintedIconManager
import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernShadeCarrierGroupMobileView
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModel
import com.android.systemui.statusbar.policy.Clock
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
index 944d6ef76272..91a9d2af7959 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
@@ -82,9 +82,9 @@ import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.ui.composable.ComposableScene
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.shade.ui.viewmodel.ShadeSceneViewModel
-import com.android.systemui.statusbar.phone.StatusBarIconController
-import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager
import com.android.systemui.statusbar.phone.StatusBarLocation
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController
+import com.android.systemui.statusbar.phone.ui.TintedIconManager
import com.android.systemui.util.animation.MeasurementInput
import javax.inject.Inject
import javax.inject.Named
diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java
index 3cb612f7801b..4f13e6ffd0b5 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java
@@ -36,8 +36,8 @@ import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.res.R;
import com.android.systemui.settings.UserTracker;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarLocation;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.tuner.TunerService;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
index c3744df5faeb..8278c790226b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
@@ -46,7 +46,7 @@ import com.android.systemui.qs.pipeline.data.repository.CustomTileAddedRepositor
import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.concurrency.DelayableExecutor;
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
index f7c435898137..37da114137fe 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
@@ -59,10 +59,11 @@ import com.android.systemui.shade.ShadeViewProviderModule.Companion.SHADE_HEADER
import com.android.systemui.shade.carrier.ShadeCarrierGroup
import com.android.systemui.shade.carrier.ShadeCarrierGroupController
import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
-import com.android.systemui.statusbar.phone.StatusBarIconController
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.phone.StatusOverlayHoverListenerFactory
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController
+import com.android.systemui.statusbar.phone.ui.TintedIconManager
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.NextAlarmController
@@ -88,7 +89,7 @@ class ShadeHeaderController
constructor(
@Named(SHADE_HEADER) private val header: MotionLayout,
private val statusBarIconController: StatusBarIconController,
- private val tintedIconManagerFactory: StatusBarIconController.TintedIconManager.Factory,
+ private val tintedIconManagerFactory: TintedIconManager.Factory,
private val privacyIconsController: HeaderPrivacyIconsController,
private val insetsProvider: StatusBarContentInsetsProvider,
private val configurationController: ConfigurationController,
@@ -127,7 +128,7 @@ constructor(
var shadeCollapseAction: Runnable? = null
- private lateinit var iconManager: StatusBarIconController.TintedIconManager
+ private lateinit var iconManager: TintedIconManager
private lateinit var carrierIconSlots: List<String>
private lateinit var mShadeCarrierGroupController: ShadeCarrierGroupController
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
index 594c1913fd33..8a53e0ce94c4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java
@@ -55,10 +55,10 @@ import com.android.systemui.statusbar.notification.collection.render.Notificatio
import com.android.systemui.statusbar.phone.CentralSurfacesImpl;
import com.android.systemui.statusbar.phone.ManagedProfileController;
import com.android.systemui.statusbar.phone.ManagedProfileControllerImpl;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl;
-import com.android.systemui.statusbar.phone.StatusBarIconList;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconList;
import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconControllerImpl;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import dagger.Binds;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index c055a8214a91..3cdf68f5c231 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -48,6 +48,7 @@ import com.android.systemui.battery.BatteryMeterView;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher.DarkChange;
+import com.android.systemui.statusbar.phone.ui.TintedIconManager;
import com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherContainer;
import com.android.systemui.user.ui.binder.StatusBarUserChipViewBinder;
import com.android.systemui.user.ui.viewmodel.StatusBarUserChipViewModel;
@@ -421,7 +422,7 @@ public class KeyguardStatusBarView extends RelativeLayout {
}
/** Should only be called from {@link KeyguardStatusBarViewController}. */
- void onThemeChanged(StatusBarIconController.TintedIconManager iconManager) {
+ void onThemeChanged(TintedIconManager iconManager) {
mBatteryView.setColorsFromContext(mContext);
updateIconsAndTextColors(iconManager);
}
@@ -438,7 +439,7 @@ public class KeyguardStatusBarView extends RelativeLayout {
}
}
- private void updateIconsAndTextColors(StatusBarIconController.TintedIconManager iconManager) {
+ private void updateIconsAndTextColors(TintedIconManager iconManager) {
@ColorInt int textColor = Utils.getColorAttrDefaultColor(mContext,
R.attr.wallpaperTextColor);
float luminance = Color.luminance(textColor);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
index a5ad68f7bd1d..45d86c0e765c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
@@ -64,6 +64,8 @@ import com.android.systemui.statusbar.notification.stack.AnimationProperties;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.phone.fragment.StatusBarIconBlocklistKt;
import com.android.systemui.statusbar.phone.fragment.StatusBarSystemEventDefaultAnimator;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
+import com.android.systemui.statusbar.phone.ui.TintedIconManager;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -107,7 +109,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
private final BatteryController mBatteryController;
private final UserInfoController mUserInfoController;
private final StatusBarIconController mStatusBarIconController;
- private final StatusBarIconController.TintedIconManager.Factory mTintedIconManagerFactory;
+ private final TintedIconManager.Factory mTintedIconManagerFactory;
private final BatteryMeterViewController mBatteryMeterViewController;
private final ShadeViewStateProvider mShadeViewStateProvider;
private final KeyguardStateController mKeyguardStateController;
@@ -248,7 +250,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
private final int mNotificationsHeaderCollideDistance;
private boolean mBatteryListening;
- private StatusBarIconController.TintedIconManager mTintedIconManager;
+ private TintedIconManager mTintedIconManager;
private float mKeyguardStatusBarAnimateAlpha = 1f;
/**
@@ -281,7 +283,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
BatteryController batteryController,
UserInfoController userInfoController,
StatusBarIconController statusBarIconController,
- StatusBarIconController.TintedIconManager.Factory tintedIconManagerFactory,
+ TintedIconManager.Factory tintedIconManagerFactory,
BatteryMeterViewController batteryMeterViewController,
ShadeViewStateProvider shadeViewStateProvider,
KeyguardStateController keyguardStateController,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index 44acb070a032..3c688057c17f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -59,6 +59,7 @@ import com.android.systemui.res.R;
import com.android.systemui.screenrecord.RecordingController;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.statusbar.policy.BluetoothController;
import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.CastController.CastDevice;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
deleted file mode 100644
index d7cbe5df419b..000000000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
+++ /dev/null
@@ -1,602 +0,0 @@
-/*
- * Copyright (C) 2017 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.phone;
-
-import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_BINDABLE;
-import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_ICON;
-import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_MOBILE_NEW;
-import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_WIFI_NEW;
-
-import android.annotation.Nullable;
-import android.content.Context;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.util.ArraySet;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.LinearLayout;
-import android.widget.LinearLayout.LayoutParams;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.internal.statusbar.StatusBarIcon;
-import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.demomode.DemoModeCommandReceiver;
-import com.android.systemui.plugins.DarkIconDispatcher;
-import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
-import com.android.systemui.res.R;
-import com.android.systemui.statusbar.BaseStatusBarFrameLayout;
-import com.android.systemui.statusbar.StatusBarIconView;
-import com.android.systemui.statusbar.StatusIconDisplayable;
-import com.android.systemui.statusbar.connectivity.ui.MobileContextProvider;
-import com.android.systemui.statusbar.phone.StatusBarIconHolder.BindableIconHolder;
-import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.CallIndicatorIconState;
-import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter;
-import com.android.systemui.statusbar.pipeline.mobile.ui.binder.MobileIconsBinder;
-import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernStatusBarMobileView;
-import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel;
-import com.android.systemui.statusbar.pipeline.shared.ui.view.ModernStatusBarView;
-import com.android.systemui.statusbar.pipeline.wifi.ui.WifiUiAdapter;
-import com.android.systemui.statusbar.pipeline.wifi.ui.view.ModernStatusBarWifiView;
-import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel;
-import com.android.systemui.util.Assert;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.inject.Inject;
-
-public interface StatusBarIconController {
-
- /**
- * When an icon is added with TAG_PRIMARY, it will be treated as the primary icon
- * in that slot and not added as a sub slot.
- */
- int TAG_PRIMARY = 0;
-
- /** */
- void addIconGroup(IconManager iconManager);
- /** */
- void removeIconGroup(IconManager iconManager);
-
- /** Refresh the state of an IconManager by recreating the views */
- void refreshIconGroup(IconManager iconManager);
-
- /**
- * Adds or updates an icon that comes from an active tile service.
- *
- * If the icon is null, the icon will be removed.
- */
- void setIconFromTile(String slot, @Nullable StatusBarIcon icon);
-
- /** Removes an icon that had come from an active tile service. */
- void removeIconForTile(String slot);
-
- /** Adds or updates an icon for the given slot for **internal system icons**. */
- void setIcon(String slot, int resourceId, CharSequence contentDescription);
-
- /**
- * Sets up a wifi icon using the new data pipeline. No effect if the wifi icon has already been
- * set up (inflated and added to the view hierarchy).
- */
- void setNewWifiIcon();
-
- /**
- * Notify this class that there is a new set of mobile icons to display, keyed off of this list
- * of subIds. The icons will be added and bound to the mobile data pipeline via
- * {@link com.android.systemui.statusbar.pipeline.mobile.ui.binder.MobileIconBinder}.
- */
- void setNewMobileIconSubIds(List<Integer> subIds);
- /**
- * Display the no calling & SMS icons.
- */
- void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states);
-
- /**
- * Display the no calling & SMS icons.
- */
- void setNoCallingIcons(String slot, List<CallIndicatorIconState> states);
-
- public void setIconVisibility(String slot, boolean b);
-
- /**
- * Sets the live region mode for the icon
- *
- * @param slot Icon slot to set region for
- * @param accessibilityLiveRegion live region mode for the icon
- * @see android.view.View#setAccessibilityLiveRegion(int)
- */
- void setIconAccessibilityLiveRegion(String slot, int accessibilityLiveRegion);
-
- /**
- * If you don't know what to pass for `tag`, either remove all icons for slot, or use
- * TAG_PRIMARY to refer to the first icon at a given slot.
- */
- void removeIcon(String slot, int tag);
-
- // TODO: See if we can rename this tunable name.
- String ICON_HIDE_LIST = "icon_blacklist";
-
- /** Reads the default hide list from config value unless hideListStr is provided. */
- static ArraySet<String> getIconHideList(Context context, String hideListStr) {
- ArraySet<String> ret = new ArraySet<>();
- String[] hideList = hideListStr == null
- ? context.getResources().getStringArray(R.array.config_statusBarIconsToExclude)
- : hideListStr.split(",");
- for (String slot : hideList) {
- if (!TextUtils.isEmpty(slot)) {
- ret.add(slot);
- }
- }
- return ret;
- }
-
- /**
- * Version of ViewGroup that observes state from the DarkIconDispatcher.
- */
- class DarkIconManager extends IconManager {
- private final DarkIconDispatcher mDarkIconDispatcher;
- private final int mIconHorizontalMargin;
-
- public DarkIconManager(
- LinearLayout linearLayout,
- StatusBarLocation location,
- WifiUiAdapter wifiUiAdapter,
- MobileUiAdapter mobileUiAdapter,
- MobileContextProvider mobileContextProvider,
- DarkIconDispatcher darkIconDispatcher) {
- super(linearLayout,
- location,
- wifiUiAdapter,
- mobileUiAdapter,
- mobileContextProvider);
- mIconHorizontalMargin = mContext.getResources().getDimensionPixelSize(
- R.dimen.status_bar_icon_horizontal_margin);
- mDarkIconDispatcher = darkIconDispatcher;
- }
-
- @Override
- protected void onIconAdded(int index, String slot, boolean blocked,
- StatusBarIconHolder holder) {
- StatusIconDisplayable view = addHolder(index, slot, blocked, holder);
- mDarkIconDispatcher.addDarkReceiver((DarkReceiver) view);
- }
-
- @Override
- protected LayoutParams onCreateLayoutParams() {
- LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize);
- lp.setMargins(mIconHorizontalMargin, 0, mIconHorizontalMargin, 0);
- return lp;
- }
-
- @Override
- protected void destroy() {
- for (int i = 0; i < mGroup.getChildCount(); i++) {
- mDarkIconDispatcher.removeDarkReceiver((DarkReceiver) mGroup.getChildAt(i));
- }
- mGroup.removeAllViews();
- }
-
- @Override
- protected void onRemoveIcon(int viewIndex) {
- mDarkIconDispatcher.removeDarkReceiver((DarkReceiver) mGroup.getChildAt(viewIndex));
- super.onRemoveIcon(viewIndex);
- }
-
- @Override
- public void onSetIcon(int viewIndex, StatusBarIcon icon) {
- super.onSetIcon(viewIndex, icon);
- mDarkIconDispatcher.applyDark((DarkReceiver) mGroup.getChildAt(viewIndex));
- }
-
- @Override
- protected DemoStatusIcons createDemoStatusIcons() {
- DemoStatusIcons icons = super.createDemoStatusIcons();
- mDarkIconDispatcher.addDarkReceiver(icons);
-
- return icons;
- }
-
- @Override
- protected void exitDemoMode() {
- mDarkIconDispatcher.removeDarkReceiver(mDemoStatusIcons);
- super.exitDemoMode();
- }
-
- @SysUISingleton
- public static class Factory {
- private final WifiUiAdapter mWifiUiAdapter;
- private final MobileContextProvider mMobileContextProvider;
- private final MobileUiAdapter mMobileUiAdapter;
- private final DarkIconDispatcher mDarkIconDispatcher;
-
- @Inject
- public Factory(
- WifiUiAdapter wifiUiAdapter,
- MobileContextProvider mobileContextProvider,
- MobileUiAdapter mobileUiAdapter,
- DarkIconDispatcher darkIconDispatcher) {
- mWifiUiAdapter = wifiUiAdapter;
- mMobileContextProvider = mobileContextProvider;
- mMobileUiAdapter = mobileUiAdapter;
- mDarkIconDispatcher = darkIconDispatcher;
- }
-
- public DarkIconManager create(LinearLayout group, StatusBarLocation location) {
- return new DarkIconManager(
- group,
- location,
- mWifiUiAdapter,
- mMobileUiAdapter,
- mMobileContextProvider,
- mDarkIconDispatcher);
- }
- }
- }
-
- /**
- *
- */
- class TintedIconManager extends IconManager {
- // The main tint, used as the foreground in non layer drawables
- private int mColor;
- // To be used as the main tint in drawables that wish to have a layer
- private int mForegroundColor;
-
- public TintedIconManager(
- ViewGroup group,
- StatusBarLocation location,
- WifiUiAdapter wifiUiAdapter,
- MobileUiAdapter mobileUiAdapter,
- MobileContextProvider mobileContextProvider
- ) {
- super(group,
- location,
- wifiUiAdapter,
- mobileUiAdapter,
- mobileContextProvider);
- }
-
- @Override
- protected void onIconAdded(int index, String slot, boolean blocked,
- StatusBarIconHolder holder) {
- StatusIconDisplayable view = addHolder(index, slot, blocked, holder);
- view.setStaticDrawableColor(mColor, mForegroundColor);
- view.setDecorColor(mColor);
- }
-
- /**
- * Most icons are a single layer, and tintColor will be used as the tint in those cases.
- * For icons that have a background, foregroundColor becomes the contrasting tint used
- * for the foreground.
- *
- * @param tintColor the main tint to use for the icons in the group
- * @param foregroundColor used as the main tint for layer-ish drawables where tintColor is
- * being used as the background
- */
- public void setTint(int tintColor, int foregroundColor) {
- mColor = tintColor;
- mForegroundColor = foregroundColor;
-
- for (int i = 0; i < mGroup.getChildCount(); i++) {
- View child = mGroup.getChildAt(i);
- if (child instanceof StatusIconDisplayable) {
- StatusIconDisplayable icon = (StatusIconDisplayable) child;
- icon.setStaticDrawableColor(mColor, mForegroundColor);
- icon.setDecorColor(mColor);
- }
- }
-
- if (mDemoStatusIcons != null) {
- mDemoStatusIcons.setColor(tintColor, foregroundColor);
- }
- }
-
- @Override
- protected DemoStatusIcons createDemoStatusIcons() {
- DemoStatusIcons icons = super.createDemoStatusIcons();
- icons.setColor(mColor, mForegroundColor);
- return icons;
- }
-
- @SysUISingleton
- public static class Factory {
- private final WifiUiAdapter mWifiUiAdapter;
- private final MobileContextProvider mMobileContextProvider;
- private final MobileUiAdapter mMobileUiAdapter;
-
- @Inject
- public Factory(
- WifiUiAdapter wifiUiAdapter,
- MobileUiAdapter mobileUiAdapter,
- MobileContextProvider mobileContextProvider
- ) {
- mWifiUiAdapter = wifiUiAdapter;
- mMobileUiAdapter = mobileUiAdapter;
- mMobileContextProvider = mobileContextProvider;
- }
-
- public TintedIconManager create(ViewGroup group, StatusBarLocation location) {
- return new TintedIconManager(
- group,
- location,
- mWifiUiAdapter,
- mMobileUiAdapter,
- mMobileContextProvider);
- }
- }
- }
-
- /**
- * Turns info from StatusBarIconController into ImageViews in a ViewGroup.
- */
- class IconManager implements DemoModeCommandReceiver {
- protected final ViewGroup mGroup;
- private final MobileContextProvider mMobileContextProvider;
- private final LocationBasedWifiViewModel mWifiViewModel;
- private final MobileIconsViewModel mMobileIconsViewModel;
-
- protected final Context mContext;
- protected int mIconSize;
- // Whether or not these icons show up in dumpsys
- protected boolean mShouldLog = false;
- private StatusBarIconController mController;
- private final StatusBarLocation mLocation;
-
- // Enables SystemUI demo mode to take effect in this group
- protected boolean mDemoable = true;
- private boolean mIsInDemoMode;
- protected DemoStatusIcons mDemoStatusIcons;
-
- protected ArrayList<String> mBlockList = new ArrayList<>();
-
- public IconManager(
- ViewGroup group,
- StatusBarLocation location,
- WifiUiAdapter wifiUiAdapter,
- MobileUiAdapter mobileUiAdapter,
- MobileContextProvider mobileContextProvider
- ) {
- mGroup = group;
- mMobileContextProvider = mobileContextProvider;
- mContext = group.getContext();
- mLocation = location;
-
- reloadDimens();
-
- // This starts the flow for the new pipeline, and will notify us of changes via
- // {@link #setNewMobileIconIds}
- mMobileIconsViewModel = mobileUiAdapter.getMobileIconsViewModel();
- MobileIconsBinder.bind(mGroup, mMobileIconsViewModel);
-
- mWifiViewModel = wifiUiAdapter.bindGroup(mGroup, mLocation);
- }
-
- public boolean isDemoable() {
- return mDemoable;
- }
-
- public void setIsDemoable(boolean demoable) {
- mDemoable = demoable;
- }
-
- void setController(StatusBarIconController controller) {
- mController = controller;
- }
-
- public void setBlockList(@Nullable List<String> blockList) {
- Assert.isMainThread();
- mBlockList.clear();
- mBlockList.addAll(blockList);
- if (mController != null) {
- mController.refreshIconGroup(this);
- }
- }
-
- public void setShouldLog(boolean should) {
- mShouldLog = should;
- }
-
- public boolean shouldLog() {
- return mShouldLog;
- }
-
- protected void onIconAdded(int index, String slot, boolean blocked,
- StatusBarIconHolder holder) {
- addHolder(index, slot, blocked, holder);
- }
-
- protected StatusIconDisplayable addHolder(int index, String slot, boolean blocked,
- StatusBarIconHolder holder) {
- // This is a little hacky, and probably regrettable, but just set `blocked` on any icon
- // that is in our blocked list, then we'll never see it
- if (mBlockList.contains(slot)) {
- blocked = true;
- }
- switch (holder.getType()) {
- case TYPE_ICON:
- return addIcon(index, slot, blocked, holder.getIcon());
-
- case TYPE_WIFI_NEW:
- return addNewWifiIcon(index, slot);
-
- case TYPE_MOBILE_NEW:
- return addNewMobileIcon(index, slot, holder.getTag());
-
- case TYPE_BINDABLE:
- // Safe cast, since only BindableIconHolders can set this tag on themselves
- return addBindableIcon((BindableIconHolder) holder, index);
- }
-
- return null;
- }
-
- @VisibleForTesting
- protected StatusBarIconView addIcon(int index, String slot, boolean blocked,
- StatusBarIcon icon) {
- StatusBarIconView view = onCreateStatusBarIconView(slot, blocked);
- view.set(icon);
- mGroup.addView(view, index, onCreateLayoutParams());
- return view;
- }
-
- /**
- * ModernStatusBarViews can be created and bound, and thus do not need to update their
- * drawable by sending multiple calls to setIcon. Instead, by using a bindable
- * icon view, we can simply create the icon when requested and allow the
- * ViewBinder to control its visual state.
- */
- protected StatusIconDisplayable addBindableIcon(BindableIconHolder holder, int index) {
- ModernStatusBarView view = holder.getInitializer().createAndBind(mContext);
- mGroup.addView(view, index, onCreateLayoutParams());
- return view;
- }
-
- protected StatusIconDisplayable addNewWifiIcon(int index, String slot) {
- ModernStatusBarWifiView view = onCreateModernStatusBarWifiView(slot);
- mGroup.addView(view, index, onCreateLayoutParams());
-
- if (mIsInDemoMode) {
- mDemoStatusIcons.addModernWifiView(mWifiViewModel);
- }
-
- return view;
- }
-
-
- protected StatusIconDisplayable addNewMobileIcon(
- int index,
- String slot,
- int subId
- ) {
- BaseStatusBarFrameLayout view = onCreateModernStatusBarMobileView(slot, subId);
- mGroup.addView(view, index, onCreateLayoutParams());
-
- if (mIsInDemoMode) {
- Context mobileContext = mMobileContextProvider
- .getMobileContextForSub(subId, mContext);
- mDemoStatusIcons.addModernMobileView(
- mobileContext,
- mMobileIconsViewModel.getLogger(),
- subId);
- }
-
- return view;
- }
-
- private StatusBarIconView onCreateStatusBarIconView(String slot, boolean blocked) {
- return new StatusBarIconView(mContext, slot, null, blocked);
- }
-
- private ModernStatusBarWifiView onCreateModernStatusBarWifiView(String slot) {
- return ModernStatusBarWifiView.constructAndBind(mContext, slot, mWifiViewModel);
- }
-
- private ModernStatusBarMobileView onCreateModernStatusBarMobileView(
- String slot, int subId) {
- Context mobileContext = mMobileContextProvider.getMobileContextForSub(subId, mContext);
- return ModernStatusBarMobileView
- .constructAndBind(
- mobileContext,
- mMobileIconsViewModel.getLogger(),
- slot,
- mMobileIconsViewModel.viewModelForSub(subId, mLocation)
- );
- }
-
- protected LinearLayout.LayoutParams onCreateLayoutParams() {
- return new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize);
- }
-
- protected void destroy() {
- mGroup.removeAllViews();
- }
-
- protected void reloadDimens() {
- mIconSize = mContext.getResources().getDimensionPixelSize(
- com.android.internal.R.dimen.status_bar_icon_size_sp);
- }
-
- protected void onRemoveIcon(int viewIndex) {
- if (mIsInDemoMode) {
- mDemoStatusIcons.onRemoveIcon((StatusIconDisplayable) mGroup.getChildAt(viewIndex));
- }
- mGroup.removeViewAt(viewIndex);
- }
-
- public void onSetIcon(int viewIndex, StatusBarIcon icon) {
- StatusBarIconView view = (StatusBarIconView) mGroup.getChildAt(viewIndex);
- view.set(icon);
- }
-
- public void onSetIconHolder(int viewIndex, StatusBarIconHolder holder) {
- switch (holder.getType()) {
- case TYPE_ICON:
- onSetIcon(viewIndex, holder.getIcon());
- return;
- case TYPE_MOBILE_NEW:
- case TYPE_WIFI_NEW:
- case TYPE_BINDABLE:
- // Nothing, the new icons update themselves
- return;
- default:
- break;
- }
- }
-
- @Override
- public void dispatchDemoCommand(String command, Bundle args) {
- if (!mDemoable) {
- return;
- }
-
- mDemoStatusIcons.dispatchDemoCommand(command, args);
- }
-
- @Override
- public void onDemoModeStarted() {
- mIsInDemoMode = true;
- if (mDemoStatusIcons == null) {
- mDemoStatusIcons = createDemoStatusIcons();
- mDemoStatusIcons.addModernWifiView(mWifiViewModel);
- }
- mDemoStatusIcons.onDemoModeStarted();
- }
-
- @Override
- public void onDemoModeFinished() {
- if (mDemoStatusIcons != null) {
- mDemoStatusIcons.onDemoModeFinished();
- exitDemoMode();
- mIsInDemoMode = false;
- }
- }
-
- protected void exitDemoMode() {
- mDemoStatusIcons.remove();
- mDemoStatusIcons = null;
- }
-
- protected DemoStatusIcons createDemoStatusIcons() {
- return new DemoStatusIcons(
- (LinearLayout) mGroup,
- mMobileIconsViewModel,
- mLocation,
- mIconSize
- );
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
index ac6783f8b11f..ba5939835a08 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
@@ -28,6 +28,7 @@ import com.android.systemui.res.R;
import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.SignalCallback;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.statusbar.policy.SecurityController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java
index 7910e6f7413c..144939d1086f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java
@@ -38,6 +38,7 @@ import com.android.systemui.statusbar.StatusIconDisplayable;
import com.android.systemui.statusbar.notification.stack.AnimationFilter;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
import com.android.systemui.statusbar.notification.stack.ViewState;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import java.util.ArrayList;
import java.util.List;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
index 2ce710c26f08..4fc11df5aaa5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java
@@ -60,14 +60,14 @@ import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.NotificationIconContainer;
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
import com.android.systemui.statusbar.phone.StatusBarHideIconsForBouncerManager;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager;
import com.android.systemui.statusbar.phone.StatusBarLocation;
import com.android.systemui.statusbar.phone.StatusBarLocationPublisher;
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent;
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent.Startable;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallListener;
+import com.android.systemui.statusbar.phone.ui.DarkIconManager;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.statusbar.pipeline.shared.ui.binder.CollapsedStatusBarViewBinder;
import com.android.systemui.statusbar.pipeline.shared.ui.binder.StatusBarVisibilityChangeListener;
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.CollapsedStatusBarViewModel;
@@ -79,10 +79,6 @@ import com.android.systemui.util.CarrierConfigTracker.CarrierConfigChangedListen
import com.android.systemui.util.CarrierConfigTracker.DefaultDataSubscriptionChangedListener;
import com.android.systemui.util.settings.SecureSettings;
-import kotlin.Unit;
-
-import kotlinx.coroutines.DisposableHandle;
-
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
@@ -93,6 +89,10 @@ import java.util.concurrent.Executor;
import javax.inject.Inject;
+import kotlin.Unit;
+
+import kotlinx.coroutines.DisposableHandle;
+
/**
* Contains the collapsed status bar and handles hiding/showing based on disable flags
* and keyguard state. Also manages lifecycle to make sure the views it contains are being
@@ -143,7 +143,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
private final CollapsedStatusBarViewModel mCollapsedStatusBarViewModel;
private final CollapsedStatusBarViewBinder mCollapsedStatusBarViewBinder;
private final StatusBarHideIconsForBouncerManager mStatusBarHideIconsForBouncerManager;
- private final StatusBarIconController.DarkIconManager.Factory mDarkIconManagerFactory;
+ private final DarkIconManager.Factory mDarkIconManagerFactory;
private final SecureSettings mSecureSettings;
private final Executor mMainExecutor;
private final DumpManager mDumpManager;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/DarkIconManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/DarkIconManager.java
new file mode 100644
index 000000000000..8871dae3c620
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/DarkIconManager.java
@@ -0,0 +1,141 @@
+/*
+ * 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.phone.ui;
+
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+import com.android.internal.statusbar.StatusBarIcon;
+import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.plugins.DarkIconDispatcher;
+import com.android.systemui.statusbar.StatusIconDisplayable;
+import com.android.systemui.statusbar.connectivity.ui.MobileContextProvider;
+import com.android.systemui.statusbar.phone.DemoStatusIcons;
+import com.android.systemui.statusbar.phone.StatusBarIconHolder;
+import com.android.systemui.statusbar.phone.StatusBarLocation;
+import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter;
+import com.android.systemui.statusbar.pipeline.wifi.ui.WifiUiAdapter;
+
+import javax.inject.Inject;
+
+/**
+ * Version of {@link IconManager} that observes state from the DarkIconDispatcher.
+ */
+public class DarkIconManager extends IconManager {
+ private final DarkIconDispatcher mDarkIconDispatcher;
+ private final int mIconHorizontalMargin;
+
+ public DarkIconManager(
+ LinearLayout linearLayout,
+ StatusBarLocation location,
+ WifiUiAdapter wifiUiAdapter,
+ MobileUiAdapter mobileUiAdapter,
+ MobileContextProvider mobileContextProvider,
+ DarkIconDispatcher darkIconDispatcher) {
+ super(linearLayout,
+ location,
+ wifiUiAdapter,
+ mobileUiAdapter,
+ mobileContextProvider);
+ mIconHorizontalMargin = mContext.getResources().getDimensionPixelSize(
+ com.android.systemui.res.R.dimen.status_bar_icon_horizontal_margin);
+ mDarkIconDispatcher = darkIconDispatcher;
+ }
+
+ @Override
+ protected void onIconAdded(int index, String slot, boolean blocked,
+ StatusBarIconHolder holder) {
+ StatusIconDisplayable view = addHolder(index, slot, blocked, holder);
+ mDarkIconDispatcher.addDarkReceiver(view);
+ }
+
+ @Override
+ protected LinearLayout.LayoutParams onCreateLayoutParams() {
+ LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize);
+ lp.setMargins(mIconHorizontalMargin, 0, mIconHorizontalMargin, 0);
+ return lp;
+ }
+
+ @Override
+ protected void destroy() {
+ for (int i = 0; i < mGroup.getChildCount(); i++) {
+ mDarkIconDispatcher.removeDarkReceiver(
+ (DarkIconDispatcher.DarkReceiver) mGroup.getChildAt(i));
+ }
+ mGroup.removeAllViews();
+ }
+
+ @Override
+ protected void onRemoveIcon(int viewIndex) {
+ mDarkIconDispatcher.removeDarkReceiver(
+ (DarkIconDispatcher.DarkReceiver) mGroup.getChildAt(viewIndex));
+ super.onRemoveIcon(viewIndex);
+ }
+
+ @Override
+ public void onSetIcon(int viewIndex, StatusBarIcon icon) {
+ super.onSetIcon(viewIndex, icon);
+ mDarkIconDispatcher.applyDark(
+ (DarkIconDispatcher.DarkReceiver) mGroup.getChildAt(viewIndex));
+ }
+
+ @Override
+ protected DemoStatusIcons createDemoStatusIcons() {
+ DemoStatusIcons icons = super.createDemoStatusIcons();
+ mDarkIconDispatcher.addDarkReceiver(icons);
+
+ return icons;
+ }
+
+ @Override
+ protected void exitDemoMode() {
+ mDarkIconDispatcher.removeDarkReceiver(mDemoStatusIcons);
+ super.exitDemoMode();
+ }
+
+ @SysUISingleton
+ public static class Factory {
+ private final WifiUiAdapter mWifiUiAdapter;
+ private final MobileContextProvider mMobileContextProvider;
+ private final MobileUiAdapter mMobileUiAdapter;
+ private final DarkIconDispatcher mDarkIconDispatcher;
+
+ @Inject
+ public Factory(
+ WifiUiAdapter wifiUiAdapter,
+ MobileContextProvider mobileContextProvider,
+ MobileUiAdapter mobileUiAdapter,
+ DarkIconDispatcher darkIconDispatcher) {
+ mWifiUiAdapter = wifiUiAdapter;
+ mMobileContextProvider = mobileContextProvider;
+ mMobileUiAdapter = mobileUiAdapter;
+ mDarkIconDispatcher = darkIconDispatcher;
+ }
+
+ /** Creates a new {@link DarkIconManager} for the given view group and location. */
+ public DarkIconManager create(LinearLayout group, StatusBarLocation location) {
+ return new DarkIconManager(
+ group,
+ location,
+ mWifiUiAdapter,
+ mMobileUiAdapter,
+ mMobileContextProvider,
+ mDarkIconDispatcher);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/IconManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/IconManager.java
new file mode 100644
index 000000000000..0ed94203ffa0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/IconManager.java
@@ -0,0 +1,307 @@
+/*
+ * 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.phone.ui;
+
+import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_BINDABLE;
+import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_ICON;
+import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_MOBILE_NEW;
+import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_WIFI_NEW;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.internal.statusbar.StatusBarIcon;
+import com.android.systemui.demomode.DemoModeCommandReceiver;
+import com.android.systemui.statusbar.BaseStatusBarFrameLayout;
+import com.android.systemui.statusbar.StatusBarIconView;
+import com.android.systemui.statusbar.StatusIconDisplayable;
+import com.android.systemui.statusbar.connectivity.ui.MobileContextProvider;
+import com.android.systemui.statusbar.phone.DemoStatusIcons;
+import com.android.systemui.statusbar.phone.StatusBarIconHolder;
+import com.android.systemui.statusbar.phone.StatusBarLocation;
+import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter;
+import com.android.systemui.statusbar.pipeline.mobile.ui.binder.MobileIconsBinder;
+import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernStatusBarMobileView;
+import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel;
+import com.android.systemui.statusbar.pipeline.shared.ui.view.ModernStatusBarView;
+import com.android.systemui.statusbar.pipeline.wifi.ui.WifiUiAdapter;
+import com.android.systemui.statusbar.pipeline.wifi.ui.view.ModernStatusBarWifiView;
+import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel;
+import com.android.systemui.util.Assert;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Turns info from StatusBarIconController into ImageViews in a ViewGroup.
+ */
+public class IconManager implements DemoModeCommandReceiver {
+ protected final ViewGroup mGroup;
+ private final MobileContextProvider mMobileContextProvider;
+ private final LocationBasedWifiViewModel mWifiViewModel;
+ private final MobileIconsViewModel mMobileIconsViewModel;
+
+ protected final Context mContext;
+ protected int mIconSize;
+ // Whether or not these icons show up in dumpsys
+ protected boolean mShouldLog = false;
+ private StatusBarIconController mController;
+ private final StatusBarLocation mLocation;
+
+ // Enables SystemUI demo mode to take effect in this group
+ protected boolean mDemoable = true;
+ private boolean mIsInDemoMode;
+ protected DemoStatusIcons mDemoStatusIcons;
+
+ protected ArrayList<String> mBlockList = new ArrayList<>();
+
+ public IconManager(
+ ViewGroup group,
+ StatusBarLocation location,
+ WifiUiAdapter wifiUiAdapter,
+ MobileUiAdapter mobileUiAdapter,
+ MobileContextProvider mobileContextProvider
+ ) {
+ mGroup = group;
+ mMobileContextProvider = mobileContextProvider;
+ mContext = group.getContext();
+ mLocation = location;
+
+ reloadDimens();
+
+ // This starts the flow for the new pipeline, and will notify us of changes via
+ // {@link #setNewMobileIconIds}
+ mMobileIconsViewModel = mobileUiAdapter.getMobileIconsViewModel();
+ MobileIconsBinder.bind(mGroup, mMobileIconsViewModel);
+
+ mWifiViewModel = wifiUiAdapter.bindGroup(mGroup, mLocation);
+ }
+
+ public boolean isDemoable() {
+ return mDemoable;
+ }
+
+ void setController(StatusBarIconController controller) {
+ mController = controller;
+ }
+
+ /** Sets the list of slots that should be blocked from showing in the status bar. */
+ public void setBlockList(@Nullable List<String> blockList) {
+ Assert.isMainThread();
+ mBlockList.clear();
+ mBlockList.addAll(blockList);
+ if (mController != null) {
+ mController.refreshIconGroup(this);
+ }
+ }
+
+ /** Sets whether this manager's changes should be dumped in a bug report. */
+ public void setShouldLog(boolean should) {
+ mShouldLog = should;
+ }
+
+ /** Returns true if this manager's changes should be dumped in a bug report. */
+ public boolean shouldLog() {
+ return mShouldLog;
+ }
+
+ protected void onIconAdded(int index, String slot, boolean blocked,
+ StatusBarIconHolder holder) {
+ addHolder(index, slot, blocked, holder);
+ }
+
+ protected StatusIconDisplayable addHolder(int index, String slot, boolean blocked,
+ StatusBarIconHolder holder) {
+ // This is a little hacky, and probably regrettable, but just set `blocked` on any icon
+ // that is in our blocked list, then we'll never see it
+ if (mBlockList.contains(slot)) {
+ blocked = true;
+ }
+ return switch (holder.getType()) {
+ case TYPE_ICON -> addIcon(index, slot, blocked, holder.getIcon());
+ case TYPE_WIFI_NEW -> addNewWifiIcon(index, slot);
+ case TYPE_MOBILE_NEW -> addNewMobileIcon(index, slot, holder.getTag());
+ case TYPE_BINDABLE ->
+ // Safe cast, since only BindableIconHolders can set this tag on themselves
+ addBindableIcon((StatusBarIconHolder.BindableIconHolder) holder, index);
+ default -> null;
+ };
+ }
+
+ @VisibleForTesting
+ protected StatusBarIconView addIcon(int index, String slot, boolean blocked,
+ StatusBarIcon icon) {
+ StatusBarIconView view = onCreateStatusBarIconView(slot, blocked);
+ view.set(icon);
+ mGroup.addView(view, index, onCreateLayoutParams());
+ return view;
+ }
+
+ /**
+ * ModernStatusBarViews can be created and bound, and thus do not need to update their
+ * drawable by sending multiple calls to setIcon. Instead, by using a bindable
+ * icon view, we can simply create the icon when requested and allow the
+ * ViewBinder to control its visual state.
+ */
+ protected StatusIconDisplayable addBindableIcon(StatusBarIconHolder.BindableIconHolder holder,
+ int index) {
+ ModernStatusBarView view = holder.getInitializer().createAndBind(mContext);
+ mGroup.addView(view, index, onCreateLayoutParams());
+ return view;
+ }
+
+ protected StatusIconDisplayable addNewWifiIcon(int index, String slot) {
+ ModernStatusBarWifiView view = onCreateModernStatusBarWifiView(slot);
+ mGroup.addView(view, index, onCreateLayoutParams());
+
+ if (mIsInDemoMode) {
+ mDemoStatusIcons.addModernWifiView(mWifiViewModel);
+ }
+
+ return view;
+ }
+
+
+ protected StatusIconDisplayable addNewMobileIcon(
+ int index,
+ String slot,
+ int subId
+ ) {
+ BaseStatusBarFrameLayout view = onCreateModernStatusBarMobileView(slot, subId);
+ mGroup.addView(view, index, onCreateLayoutParams());
+
+ if (mIsInDemoMode) {
+ Context mobileContext = mMobileContextProvider
+ .getMobileContextForSub(subId, mContext);
+ mDemoStatusIcons.addModernMobileView(
+ mobileContext,
+ mMobileIconsViewModel.getLogger(),
+ subId);
+ }
+
+ return view;
+ }
+
+ private StatusBarIconView onCreateStatusBarIconView(String slot, boolean blocked) {
+ return new StatusBarIconView(mContext, slot, null, blocked);
+ }
+
+ private ModernStatusBarWifiView onCreateModernStatusBarWifiView(String slot) {
+ return ModernStatusBarWifiView.constructAndBind(mContext, slot, mWifiViewModel);
+ }
+
+ private ModernStatusBarMobileView onCreateModernStatusBarMobileView(
+ String slot, int subId) {
+ Context mobileContext = mMobileContextProvider.getMobileContextForSub(subId, mContext);
+ return ModernStatusBarMobileView
+ .constructAndBind(
+ mobileContext,
+ mMobileIconsViewModel.getLogger(),
+ slot,
+ mMobileIconsViewModel.viewModelForSub(subId, mLocation)
+ );
+ }
+
+ protected LinearLayout.LayoutParams onCreateLayoutParams() {
+ return new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize);
+ }
+
+ protected void destroy() {
+ mGroup.removeAllViews();
+ }
+
+ protected void reloadDimens() {
+ mIconSize = mContext.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.status_bar_icon_size_sp);
+ }
+
+ protected void onRemoveIcon(int viewIndex) {
+ if (mIsInDemoMode) {
+ mDemoStatusIcons.onRemoveIcon((StatusIconDisplayable) mGroup.getChildAt(viewIndex));
+ }
+ mGroup.removeViewAt(viewIndex);
+ }
+
+ /** Called once an icon has been set. */
+ public void onSetIcon(int viewIndex, StatusBarIcon icon) {
+ StatusBarIconView view = (StatusBarIconView) mGroup.getChildAt(viewIndex);
+ view.set(icon);
+ }
+
+ /** Called once an icon holder has been set. */
+ public void onSetIconHolder(int viewIndex, StatusBarIconHolder holder) {
+ switch (holder.getType()) {
+ case TYPE_ICON:
+ onSetIcon(viewIndex, holder.getIcon());
+ return;
+ case TYPE_MOBILE_NEW:
+ case TYPE_WIFI_NEW:
+ case TYPE_BINDABLE:
+ // Nothing, the new icons update themselves
+ return;
+ default:
+ break;
+ }
+ }
+
+ @Override
+ public void dispatchDemoCommand(String command, Bundle args) {
+ if (!mDemoable) {
+ return;
+ }
+
+ mDemoStatusIcons.dispatchDemoCommand(command, args);
+ }
+
+ @Override
+ public void onDemoModeStarted() {
+ mIsInDemoMode = true;
+ if (mDemoStatusIcons == null) {
+ mDemoStatusIcons = createDemoStatusIcons();
+ mDemoStatusIcons.addModernWifiView(mWifiViewModel);
+ }
+ mDemoStatusIcons.onDemoModeStarted();
+ }
+
+ @Override
+ public void onDemoModeFinished() {
+ if (mDemoStatusIcons != null) {
+ mDemoStatusIcons.onDemoModeFinished();
+ exitDemoMode();
+ mIsInDemoMode = false;
+ }
+ }
+
+ protected void exitDemoMode() {
+ mDemoStatusIcons.remove();
+ mDemoStatusIcons = null;
+ }
+
+ protected DemoStatusIcons createDemoStatusIcons() {
+ return new DemoStatusIcons(
+ (LinearLayout) mGroup,
+ mMobileIconsViewModel,
+ mLocation,
+ mIconSize
+ );
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/StatusBarIconController.java
new file mode 100644
index 000000000000..1ada30e3518a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/StatusBarIconController.java
@@ -0,0 +1,117 @@
+/*
+ * 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.phone.ui;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.ArraySet;
+
+import com.android.internal.statusbar.StatusBarIcon;
+import com.android.systemui.res.R;
+import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.CallIndicatorIconState;
+
+import java.util.List;
+
+/** Interface controlling the icons shown in the status bar. */
+public interface StatusBarIconController {
+
+ /**
+ * When an icon is added with TAG_PRIMARY, it will be treated as the primary icon
+ * in that slot and not added as a sub slot.
+ */
+ int TAG_PRIMARY = 0;
+
+ /** */
+ void addIconGroup(IconManager iconManager);
+ /** */
+ void removeIconGroup(IconManager iconManager);
+
+ /** Refresh the state of an IconManager by recreating the views */
+ void refreshIconGroup(IconManager iconManager);
+
+ /**
+ * Adds or updates an icon that comes from an active tile service.
+ *
+ * If the icon is null, the icon will be removed.
+ */
+ void setIconFromTile(String slot, @Nullable StatusBarIcon icon);
+
+ /** Removes an icon that had come from an active tile service. */
+ void removeIconForTile(String slot);
+
+ /** Adds or updates an icon for the given slot for **internal system icons**. */
+ void setIcon(String slot, int resourceId, CharSequence contentDescription);
+
+ /**
+ * Sets up a wifi icon using the new data pipeline. No effect if the wifi icon has already been
+ * set up (inflated and added to the view hierarchy).
+ */
+ void setNewWifiIcon();
+
+ /**
+ * Notify this class that there is a new set of mobile icons to display, keyed off of this list
+ * of subIds. The icons will be added and bound to the mobile data pipeline via
+ * {@link com.android.systemui.statusbar.pipeline.mobile.ui.binder.MobileIconBinder}.
+ */
+ void setNewMobileIconSubIds(List<Integer> subIds);
+ /**
+ * Display the no calling & SMS icons.
+ */
+ void setCallStrengthIcons(String slot, List<CallIndicatorIconState> states);
+
+ /**
+ * Display the no calling & SMS icons.
+ */
+ void setNoCallingIcons(String slot, List<CallIndicatorIconState> states);
+
+ /** Sets whether the icon in the given slot should be visible or not. */
+ void setIconVisibility(String slot, boolean b);
+
+ /**
+ * Sets the live region mode for the icon
+ *
+ * @param slot Icon slot to set region for
+ * @param accessibilityLiveRegion live region mode for the icon
+ * @see android.view.View#setAccessibilityLiveRegion(int)
+ */
+ void setIconAccessibilityLiveRegion(String slot, int accessibilityLiveRegion);
+
+ /**
+ * If you don't know what to pass for `tag`, either remove all icons for slot, or use
+ * TAG_PRIMARY to refer to the first icon at a given slot.
+ */
+ void removeIcon(String slot, int tag);
+
+ // TODO: See if we can rename this tunable name.
+ String ICON_HIDE_LIST = "icon_blacklist";
+
+ /** Reads the default hide list from config value unless hideListStr is provided. */
+ static ArraySet<String> getIconHideList(Context context, String hideListStr) {
+ ArraySet<String> ret = new ArraySet<>();
+ String[] hideList = hideListStr == null
+ ? context.getResources().getStringArray(R.array.config_statusBarIconsToExclude)
+ : hideListStr.split(",");
+ for (String slot : hideList) {
+ if (!TextUtils.isEmpty(slot)) {
+ ret.add(slot);
+ }
+ }
+ return ret;
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/StatusBarIconControllerImpl.java
index 4f148f112c52..92d90af6f921 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/StatusBarIconControllerImpl.java
@@ -11,12 +11,12 @@
* 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
+ * limitations under the License.
*/
-package com.android.systemui.statusbar.phone;
+package com.android.systemui.statusbar.phone.ui;
-import static com.android.systemui.statusbar.phone.StatusBarIconList.Slot;
+import static com.android.systemui.statusbar.phone.ui.StatusBarIconList.Slot;
import android.annotation.NonNull;
import android.content.Context;
@@ -38,6 +38,7 @@ import com.android.systemui.demomode.DemoModeController;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.StatusIconDisplayable;
+import com.android.systemui.statusbar.phone.StatusBarIconHolder;
import com.android.systemui.statusbar.phone.StatusBarIconHolder.BindableIconHolder;
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.CallIndicatorIconState;
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags;
@@ -459,9 +460,9 @@ public class StatusBarIconControllerImpl implements Tunable,
for (IconManager manager : mIconGroups) {
if (manager.shouldLog()) {
ViewGroup group = manager.mGroup;
- int N = group.getChildCount();
- pw.println(" icon views: " + N);
- for (int i = 0; i < N; i++) {
+ int n = group.getChildCount();
+ pw.println(" icon views: " + n);
+ for (int i = 0; i < n; i++) {
StatusIconDisplayable ic = (StatusIconDisplayable) group.getChildAt(i);
pw.println(" [" + i + "] icon=" + ic);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/StatusBarIconList.java
index 565481a20d95..724251ccb20a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/StatusBarIconList.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2015 The Android Open Source Project
+ * 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.
@@ -14,14 +14,15 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar.phone;
+package com.android.systemui.statusbar.phone.ui;
-import static com.android.systemui.statusbar.phone.StatusBarIconController.TAG_PRIMARY;
+import static com.android.systemui.statusbar.phone.ui.StatusBarIconController.TAG_PRIMARY;
import android.annotation.NonNull;
import android.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.statusbar.phone.StatusBarIconHolder;
import java.io.PrintWriter;
import java.util.ArrayList;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/TintedIconManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/TintedIconManager.java
new file mode 100644
index 000000000000..e520148e925a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ui/TintedIconManager.java
@@ -0,0 +1,124 @@
+/*
+ * 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.phone.ui;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.statusbar.StatusIconDisplayable;
+import com.android.systemui.statusbar.connectivity.ui.MobileContextProvider;
+import com.android.systemui.statusbar.phone.DemoStatusIcons;
+import com.android.systemui.statusbar.phone.StatusBarIconHolder;
+import com.android.systemui.statusbar.phone.StatusBarLocation;
+import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter;
+import com.android.systemui.statusbar.pipeline.wifi.ui.WifiUiAdapter;
+
+import javax.inject.Inject;
+
+/**
+ * Version of {@link IconManager} that can tint the icons to a particular color.
+ */
+public class TintedIconManager extends IconManager {
+ // The main tint, used as the foreground in non layer drawables
+ private int mColor;
+ // To be used as the main tint in drawables that wish to have a layer
+ private int mForegroundColor;
+
+ public TintedIconManager(
+ ViewGroup group,
+ StatusBarLocation location,
+ WifiUiAdapter wifiUiAdapter,
+ MobileUiAdapter mobileUiAdapter,
+ MobileContextProvider mobileContextProvider
+ ) {
+ super(group,
+ location,
+ wifiUiAdapter,
+ mobileUiAdapter,
+ mobileContextProvider);
+ }
+
+ @Override
+ protected void onIconAdded(int index, String slot, boolean blocked,
+ StatusBarIconHolder holder) {
+ StatusIconDisplayable view = addHolder(index, slot, blocked, holder);
+ view.setStaticDrawableColor(mColor, mForegroundColor);
+ view.setDecorColor(mColor);
+ }
+
+ /**
+ * Most icons are a single layer, and tintColor will be used as the tint in those cases.
+ * For icons that have a background, foregroundColor becomes the contrasting tint used
+ * for the foreground.
+ *
+ * @param tintColor the main tint to use for the icons in the group
+ * @param foregroundColor used as the main tint for layer-ish drawables where tintColor is
+ * being used as the background
+ */
+ public void setTint(int tintColor, int foregroundColor) {
+ mColor = tintColor;
+ mForegroundColor = foregroundColor;
+
+ for (int i = 0; i < mGroup.getChildCount(); i++) {
+ View child = mGroup.getChildAt(i);
+ if (child instanceof StatusIconDisplayable icon) {
+ icon.setStaticDrawableColor(mColor, mForegroundColor);
+ icon.setDecorColor(mColor);
+ }
+ }
+
+ if (mDemoStatusIcons != null) {
+ mDemoStatusIcons.setColor(tintColor, foregroundColor);
+ }
+ }
+
+ @Override
+ protected DemoStatusIcons createDemoStatusIcons() {
+ DemoStatusIcons icons = super.createDemoStatusIcons();
+ icons.setColor(mColor, mForegroundColor);
+ return icons;
+ }
+
+ @SysUISingleton
+ public static class Factory {
+ private final WifiUiAdapter mWifiUiAdapter;
+ private final MobileContextProvider mMobileContextProvider;
+ private final MobileUiAdapter mMobileUiAdapter;
+
+ @Inject
+ public Factory(
+ WifiUiAdapter wifiUiAdapter,
+ MobileUiAdapter mobileUiAdapter,
+ MobileContextProvider mobileContextProvider
+ ) {
+ mWifiUiAdapter = wifiUiAdapter;
+ mMobileUiAdapter = mobileUiAdapter;
+ mMobileContextProvider = mobileContextProvider;
+ }
+
+ /** Creates a new {@link TintedIconManager} for the given view group and location. */
+ public TintedIconManager create(ViewGroup group, StatusBarLocation location) {
+ return new TintedIconManager(
+ group,
+ location,
+ mWifiUiAdapter,
+ mMobileUiAdapter,
+ mMobileContextProvider);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt
index 02e50a007f50..5a49f8eb8f3b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt
@@ -20,7 +20,7 @@ import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.shade.carrier.ShadeCarrierGroupController
-import com.android.systemui.statusbar.phone.StatusBarIconController
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel
import java.io.PrintWriter
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconsBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconsBinder.kt
index e7d5ee264efe..fc0ba131c457 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconsBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconsBinder.kt
@@ -20,10 +20,9 @@ import android.view.View
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.systemui.lifecycle.repeatWhenAttached
-import com.android.systemui.statusbar.phone.StatusBarIconController.IconManager
+import com.android.systemui.statusbar.phone.ui.IconManager
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel
-import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
object MobileIconsBinder {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/repository/ConnectivityRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/repository/ConnectivityRepository.kt
index 4227f9eb8f10..1a55f7d90e97 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/repository/ConnectivityRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/repository/ConnectivityRepository.kt
@@ -31,12 +31,12 @@ import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
import androidx.annotation.ArrayRes
import androidx.annotation.VisibleForTesting
import com.android.systemui.Dumpable
-import com.android.systemui.res.R
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dump.DumpManager
-import com.android.systemui.statusbar.phone.StatusBarIconController
+import com.android.systemui.res.R
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.pipeline.shared.ConnectivityInputLogger
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlots
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/WifiUiAdapter.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/WifiUiAdapter.kt
index 7a60d96d1661..2800c9404c4b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/WifiUiAdapter.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/WifiUiAdapter.kt
@@ -21,14 +21,13 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.lifecycle.repeatWhenAttached
-import com.android.systemui.statusbar.phone.StatusBarIconController
import com.android.systemui.statusbar.phone.StatusBarLocation
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel.Companion.viewModelForLocation
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel
import javax.inject.Inject
-import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
index a25f8e96f59f..ccd75602aa13 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
@@ -55,7 +55,7 @@ import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.res.R;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java b/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java
index b71aafdf6b96..77fcd259461b 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java
@@ -27,7 +27,7 @@ import androidx.preference.DropDownPreference;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Dependency;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
public class BatteryPreference extends DropDownPreference implements TunerService.Tunable {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/ClockPreference.java b/packages/SystemUI/src/com/android/systemui/tuner/ClockPreference.java
index c92d7bbfe0b7..e94d8ea2dd07 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/ClockPreference.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/ClockPreference.java
@@ -21,7 +21,7 @@ import android.util.AttributeSet;
import androidx.preference.DropDownPreference;
import com.android.systemui.Dependency;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.statusbar.policy.Clock;
public class ClockPreference extends DropDownPreference implements TunerService.Tunable {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java b/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java
index cc0050b64d60..2f6fa5130b6e 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java
@@ -27,7 +27,7 @@ import androidx.preference.SwitchPreference;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Dependency;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.tuner.TunerService.Tunable;
import java.util.Set;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
index fd0f7cb04807..05ee35b36c7f 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
@@ -44,8 +44,8 @@ import com.android.systemui.demomode.DemoModeController;
import com.android.systemui.qs.QSHost;
import com.android.systemui.res.R;
import com.android.systemui.settings.UserTracker;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.SystemUIDialog;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.util.leak.LeakDetector;
import dagger.Lazy;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
index 248af1e859f1..b62d59d3a2f2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
@@ -47,7 +47,7 @@ import com.android.systemui.qs.pipeline.data.repository.CustomTileAddedRepositor
import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.concurrency.FakeExecutor;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
index 9fa173ab040a..0846ced1826c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
@@ -22,6 +22,7 @@ import android.app.StatusBarManager
import android.content.Context
import android.content.res.Resources
import android.content.res.XmlResourceParser
+import android.graphics.Insets
import android.graphics.Rect
import android.testing.AndroidTestingRunner
import android.view.Display
@@ -35,7 +36,6 @@ import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.test.filters.SmallTest
import com.android.app.animation.Interpolators
-import com.android.systemui.res.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.ShadeInterpolation
import com.android.systemui.battery.BatteryMeterView
@@ -46,6 +46,7 @@ import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.qs.ChipVisibilityListener
import com.android.systemui.qs.HeaderPrivacyIconsController
+import com.android.systemui.res.R
import com.android.systemui.shade.ShadeHeaderController.Companion.DEFAULT_CLOCK_INTENT
import com.android.systemui.shade.ShadeHeaderController.Companion.LARGE_SCREEN_HEADER_CONSTRAINT
import com.android.systemui.shade.ShadeHeaderController.Companion.QQS_HEADER_CONSTRAINT
@@ -53,9 +54,10 @@ import com.android.systemui.shade.ShadeHeaderController.Companion.QS_HEADER_CONS
import com.android.systemui.shade.carrier.ShadeCarrierGroup
import com.android.systemui.shade.carrier.ShadeCarrierGroupController
import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
-import com.android.systemui.statusbar.phone.StatusBarIconController
import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.phone.StatusOverlayHoverListenerFactory
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController
+import com.android.systemui.statusbar.phone.ui.TintedIconManager
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.policy.FakeConfigurationController
import com.android.systemui.statusbar.policy.NextAlarmController
@@ -83,7 +85,6 @@ import org.mockito.Mockito.reset
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when` as whenever
-import android.graphics.Insets
import org.mockito.junit.MockitoJUnit
private val EMPTY_CHANGES = ConstraintsChanges()
@@ -95,8 +96,8 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
@Mock(answer = Answers.RETURNS_MOCKS) private lateinit var view: MotionLayout
@Mock private lateinit var statusIcons: StatusIconContainer
@Mock private lateinit var statusBarIconController: StatusBarIconController
- @Mock private lateinit var iconManagerFactory: StatusBarIconController.TintedIconManager.Factory
- @Mock private lateinit var iconManager: StatusBarIconController.TintedIconManager
+ @Mock private lateinit var iconManagerFactory: TintedIconManager.Factory
+ @Mock private lateinit var iconManager: TintedIconManager
@Mock private lateinit var mShadeCarrierGroupController: ShadeCarrierGroupController
@Mock
private lateinit var mShadeCarrierGroupControllerBuilder: ShadeCarrierGroupController.Builder
@@ -145,12 +146,14 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
whenever<TextView>(view.requireViewById(R.id.date)).thenReturn(date)
whenever(date.context).thenReturn(mockedContext)
- whenever<ShadeCarrierGroup>(view.requireViewById(R.id.carrier_group)).thenReturn(carrierGroup)
+ whenever<ShadeCarrierGroup>(view.requireViewById(R.id.carrier_group))
+ .thenReturn(carrierGroup)
whenever<BatteryMeterView>(view.requireViewById(R.id.batteryRemainingIcon))
.thenReturn(batteryMeterView)
- whenever<StatusIconContainer>(view.requireViewById(R.id.statusIcons)).thenReturn(statusIcons)
+ whenever<StatusIconContainer>(view.requireViewById(R.id.statusIcons))
+ .thenReturn(statusIcons)
whenever<View>(view.requireViewById(R.id.hover_system_icons_container))
.thenReturn(systemIconsHoverContainer)
@@ -933,14 +936,14 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
private fun mockInsetsProvider(insets: Pair<Int, Int> = 0 to 0, cornerCutout: Boolean = false) {
whenever(insetsProvider.getStatusBarContentInsetsForCurrentRotation())
- .thenReturn(
- Insets.of(
- /* left= */ insets.first,
- /* top= */ 0,
- /* right= */ insets.second,
- /* bottom= */ 0
- )
+ .thenReturn(
+ Insets.of(
+ /* left= */ insets.first,
+ /* top= */ 0,
+ /* right= */ insets.second,
+ /* bottom= */ 0
)
+ )
whenever(insetsProvider.currentRotationHasCornerCutout()).thenReturn(cornerCutout)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java
index 141c938efece..8e9840acc414 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java
@@ -76,6 +76,8 @@ import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.data.repository.FakeKeyguardStatusBarRepository;
import com.android.systemui.statusbar.domain.interactor.KeyguardStatusBarInteractor;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
+import com.android.systemui.statusbar.phone.ui.TintedIconManager;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
@@ -114,9 +116,9 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase {
@Mock
private StatusBarIconController mStatusBarIconController;
@Mock
- private StatusBarIconController.TintedIconManager.Factory mIconManagerFactory;
+ private TintedIconManager.Factory mIconManagerFactory;
@Mock
- private StatusBarIconController.TintedIconManager mIconManager;
+ private TintedIconManager mIconManager;
@Mock
private BatteryMeterViewController mBatteryMeterViewController;
@Mock
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt
index 7deee5a70809..8d2c1588fb62 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt
@@ -36,6 +36,7 @@ import com.android.systemui.privacy.logging.PrivacyLogger
import com.android.systemui.screenrecord.RecordingController
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.CommandQueue
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.policy.BluetoothController
import com.android.systemui.statusbar.policy.CastController
import com.android.systemui.statusbar.policy.DataSaverController
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java
index 9c3d9c669adc..66211c922abb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java
@@ -61,10 +61,11 @@ import com.android.systemui.statusbar.notification.icon.ui.viewbinder.Notificati
import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.StatusBarHideIconsForBouncerManager;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarLocationPublisher;
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
+import com.android.systemui.statusbar.phone.ui.DarkIconManager;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.FakeCollapsedStatusBarViewBinder;
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.FakeCollapsedStatusBarViewModel;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -117,9 +118,9 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
@Mock
private PanelExpansionInteractor mPanelExpansionInteractor;
@Mock
- private StatusBarIconController.DarkIconManager.Factory mIconManagerFactory;
+ private DarkIconManager.Factory mIconManagerFactory;
@Mock
- private StatusBarIconController.DarkIconManager mIconManager;
+ private DarkIconManager mIconManager;
private FakeCollapsedStatusBarViewModel mCollapsedStatusBarViewModel;
private FakeCollapsedStatusBarViewBinder mCollapsedStatusBarViewBinder;
@Mock
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ui/StatusBarIconControllerImplTest.kt
index f6a8243c7a46..617c553d773d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ui/StatusBarIconControllerImplTest.kt
@@ -14,15 +14,16 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar.phone
+package com.android.systemui.statusbar.phone.ui
import android.os.UserHandle
import androidx.test.filters.SmallTest
import com.android.internal.statusbar.StatusBarIcon
import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.CommandQueue
-import com.android.systemui.statusbar.phone.StatusBarIconController.TAG_PRIMARY
-import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl.EXTERNAL_SLOT_SUFFIX
+import com.android.systemui.statusbar.phone.StatusBarIconHolder
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController.TAG_PRIMARY
+import com.android.systemui.statusbar.phone.ui.StatusBarIconControllerImpl.EXTERNAL_SLOT_SUFFIX
import com.android.systemui.statusbar.pipeline.icons.shared.BindableIconsRegistry
import com.android.systemui.statusbar.pipeline.icons.shared.model.BindableIcon
import com.android.systemui.statusbar.pipeline.icons.shared.model.ModernStatusBarViewCreator
@@ -42,7 +43,7 @@ class StatusBarIconControllerImplTest : SysuiTestCase() {
private lateinit var iconList: StatusBarIconList
private lateinit var commandQueueCallbacks: CommandQueue.Callbacks
- private val iconGroup: StatusBarIconController.IconManager = mock()
+ private val iconGroup: IconManager = mock()
@Mock private lateinit var commandQueue: CommandQueue
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ui/StatusBarIconControllerTest.java
index ca316230fb01..14bce9c54a20 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ui/StatusBarIconControllerTest.java
@@ -1,20 +1,20 @@
/*
* Copyright (C) 2017 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
+ * 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.
+ * 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.phone;
-
-import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_ICON;
+package com.android.systemui.statusbar.phone.ui;
import static junit.framework.Assert.assertTrue;
@@ -40,8 +40,8 @@ import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.StatusIconDisplayable;
import com.android.systemui.statusbar.connectivity.ui.MobileContextProvider;
-import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager;
-import com.android.systemui.statusbar.phone.StatusBarIconController.IconManager;
+import com.android.systemui.statusbar.phone.StatusBarIconHolder;
+import com.android.systemui.statusbar.phone.StatusBarLocation;
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags;
import com.android.systemui.statusbar.pipeline.icons.shared.BindableIconsRegistry;
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter;
@@ -60,9 +60,9 @@ import org.junit.runner.RunWith;
@SmallTest
public class StatusBarIconControllerTest extends LeakCheckedTest {
- private MobileContextProvider mMobileContextProvider = mock(MobileContextProvider.class);
- private MobileUiAdapter mMobileUiAdapter = mock(MobileUiAdapter.class);
- private MobileIconsViewModel mMobileIconsViewModel = mock(MobileIconsViewModel.class);
+ private final MobileContextProvider mMobileContextProvider = mock(MobileContextProvider.class);
+ private final MobileUiAdapter mMobileUiAdapter = mock(MobileUiAdapter.class);
+ private final MobileIconsViewModel mMobileIconsViewModel = mock(MobileIconsViewModel.class);
@Before
public void setup() {
@@ -123,22 +123,13 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
}
private <T extends IconManager & TestableIconManager> void testCallOnAdd_forManager(T manager) {
- StatusBarIconHolder holder = holderForType(TYPE_ICON);
+ StatusBarIconHolder holder = StatusBarIconHolder.fromIcon(mock(StatusBarIcon.class));
manager.onIconAdded(0, "test_slot", false, holder);
assertTrue("Expected StatusBarIconView",
(manager.getViewAt(0) instanceof StatusBarIconView));
}
- private StatusBarIconHolder holderForType(int type) {
- switch (type) {
-
- case TYPE_ICON:
- default:
- return StatusBarIconHolder.fromIcon(mock(StatusBarIcon.class));
- }
- }
-
private static class TestDarkIconManager extends DarkIconManager
implements TestableIconManager {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconListTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ui/StatusBarIconListTest.java
index f0a4f3f2bf7a..02a6301a14e5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconListTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ui/StatusBarIconListTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 The Android Open Source Project
+ * 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.
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar.phone;
+package com.android.systemui.statusbar.phone.ui;
-import static com.android.systemui.statusbar.phone.StatusBarIconController.TAG_PRIMARY;
+import static com.android.systemui.statusbar.phone.ui.StatusBarIconController.TAG_PRIMARY;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNull;
@@ -29,7 +29,9 @@ import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.statusbar.phone.StatusBarIconList.Slot;
+import com.android.systemui.statusbar.phone.StatusBarIconHolder;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconList;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconList.Slot;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java b/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
index 3774d1d16e4e..a8328e4ab991 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java
@@ -17,9 +17,9 @@ package com.android.systemui.utils.leaks;
import android.testing.LeakCheck;
import com.android.internal.statusbar.StatusBarIcon;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
-import com.android.systemui.statusbar.phone.StatusBarIconController.IconManager;
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.CallIndicatorIconState;
+import com.android.systemui.statusbar.phone.ui.IconManager;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import java.util.List;
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/LeakCheckedTest.java b/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/LeakCheckedTest.java
index ec1f352e1439..5d21ddd9c9bc 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/LeakCheckedTest.java
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/LeakCheckedTest.java
@@ -21,7 +21,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.PluginManager;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.phone.ManagedProfileController;
-import com.android.systemui.statusbar.phone.StatusBarIconController;
+import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BluetoothController;
import com.android.systemui.statusbar.policy.CastController;