Loading packages/SystemUI/res/layout/qs_carrier.xml +7 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,13 @@ android:singleLine="true" android:maxEms="7"/> <View android:id="@+id/spacer" android:layout_width="@dimen/qs_carrier_margin_width" android:layout_height="match_parent" android:visibility="gone" /> <include layout="@layout/mobile_signal_group" android:layout_width="wrap_content" Loading packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +26 −31 Original line number Diff line number Diff line Loading @@ -32,6 +32,8 @@ import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.Space; import androidx.annotation.NonNull; import com.android.settingslib.Utils; import com.android.systemui.BatteryMeterView; import com.android.systemui.R; Loading @@ -41,6 +43,8 @@ import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.statusbar.phone.StatusIconContainer; import com.android.systemui.statusbar.policy.Clock; import java.util.List; /** * View that contains the top-most bits of the QS panel (primarily the status bar with date, time, * battery, carrier info and privacy icons) and also contains the {@link QuickQSPanel}. Loading Loading @@ -84,18 +88,13 @@ public class QuickStatusBarHeader extends FrameLayout { private float mKeyguardExpansionFraction; private int mTextColorPrimary = Color.TRANSPARENT; private int mTopViewMeasureHeight; private boolean mProviderModel; private final String mMobileSlotName; private final String mNoCallingSlotName; private final String mCallStrengthSlotName; @NonNull private List<String> mRssiIgnoredSlots; private boolean mIsSingleCarrier; public QuickStatusBarHeader(Context context, AttributeSet attrs) { super(context, attrs); mMobileSlotName = context.getString(com.android.internal.R.string.status_bar_mobile); mNoCallingSlotName = context.getString(com.android.internal.R.string.status_bar_no_calling); mCallStrengthSlotName = context.getString(com.android.internal.R.string.status_bar_call_strength); } /** Loading Loading @@ -145,9 +144,9 @@ public class QuickStatusBarHeader extends FrameLayout { void onAttach(TintedIconManager iconManager, QSExpansionPathInterpolator qsExpansionPathInterpolator, boolean providerModel) { mProviderModel = providerModel; List<String> rssiIgnoredSlots) { mTintedIconManager = iconManager; mRssiIgnoredSlots = rssiIgnoredSlots; int fillColor = Utils.getColorAttrDefaultColor(getContext(), android.R.attr.textColorPrimary); Loading @@ -158,6 +157,15 @@ public class QuickStatusBarHeader extends FrameLayout { updateAnimators(); } void setIsSingleCarrier(boolean isSingleCarrier) { mIsSingleCarrier = isSingleCarrier; updateAlphaAnimator(); } public QuickQSPanel getHeaderQsPanel() { return mHeaderQsPanel; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); Loading Loading @@ -265,39 +273,26 @@ public class QuickStatusBarHeader extends FrameLayout { .setListener(new TouchAnimator.ListenerAdapter() { @Override public void onAnimationAtEnd() { // TODO(b/185580157): Remove the mProviderModel if the mobile slot can be // hidden in Provider model. if (mProviderModel) { mIconContainer.addIgnoredSlot(mNoCallingSlotName); mIconContainer.addIgnoredSlot(mCallStrengthSlotName); } else { mIconContainer.addIgnoredSlot(mMobileSlotName); super.onAnimationAtEnd(); if (!mIsSingleCarrier) { mIconContainer.addIgnoredSlots(mRssiIgnoredSlots); } } @Override public void onAnimationStarted() { if (mProviderModel) { mIconContainer.addIgnoredSlot(mNoCallingSlotName); mIconContainer.addIgnoredSlot(mCallStrengthSlotName); } else { mIconContainer.addIgnoredSlot(mMobileSlotName); } setSeparatorVisibility(false); if (!mIsSingleCarrier) { mIconContainer.addIgnoredSlots(mRssiIgnoredSlots); } } @Override public void onAnimationAtStart() { super.onAnimationAtStart(); if (mProviderModel) { mIconContainer.removeIgnoredSlot(mNoCallingSlotName); mIconContainer.removeIgnoredSlot(mCallStrengthSlotName); } else { mIconContainer.removeIgnoredSlot(mMobileSlotName); } setSeparatorVisibility(mShowClockIconsSeparator); // In QQS we never ignore RSSI. mIconContainer.removeIgnoredSlots(mRssiIgnoredSlots); } }); mAlphaAnimator = builder.build(); Loading packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +42 −16 Original line number Diff line number Diff line Loading @@ -43,7 +43,6 @@ import com.android.systemui.statusbar.phone.StatusIconContainer; import com.android.systemui.statusbar.policy.Clock; import com.android.systemui.util.ViewController; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; Loading Loading @@ -76,6 +75,9 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader private boolean mMicCameraIndicatorsEnabled; private boolean mLocationIndicatorsEnabled; private boolean mPrivacyChipLogged; private final String mCameraSlot; private final String mMicSlot; private final String mLocationSlot; private SysuiColorExtractor mColorExtractor; private ColorExtractor.OnColorsChangedListener mOnColorsChangedListener; Loading Loading @@ -104,8 +106,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader } private void update() { StatusIconContainer iconContainer = mView.requireViewById(R.id.statusIcons); iconContainer.setIgnoredSlots(getIgnoredIconSlots()); updatePrivacyIconSlots(); setChipVisibility(!mPrivacyChip.getPrivacyList().isEmpty()); } }; Loading Loading @@ -154,7 +155,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mClockView = mView.findViewById(R.id.clock); mIconContainer = mView.findViewById(R.id.statusIcons); mIconManager = new StatusBarIconController.TintedIconManager(mIconContainer, mFeatureFlags); mIconManager = new StatusBarIconController.TintedIconManager(mIconContainer, featureFlags); mDemoModeReceiver = new ClockDemoModeReceiver(mClockView); mColorExtractor = colorExtractor; mOnColorsChangedListener = (extractor, which) -> { Loading @@ -162,6 +163,10 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mClockView.onColorsChanged(lightTheme); }; mColorExtractor.addOnColorsChangedListener(mOnColorsChangedListener); mCameraSlot = getResources().getString(com.android.internal.R.string.status_bar_camera); mMicSlot = getResources().getString(com.android.internal.R.string.status_bar_microphone); mLocationSlot = getResources().getString(com.android.internal.R.string.status_bar_location); } @Override Loading @@ -172,14 +177,30 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mLocationIndicatorsEnabled = mPrivacyItemController.getLocationAvailable(); // Ignore privacy icons because they show in the space above QQS mIconContainer.setIgnoredSlots(getIgnoredIconSlots()); updatePrivacyIconSlots(); mIconContainer.setShouldRestrictIcons(false); mStatusBarIconController.addIconGroup(mIconManager); setChipVisibility(mPrivacyChip.getVisibility() == View.VISIBLE); mView.onAttach(mIconManager, mQSExpansionPathInterpolator, mFeatureFlags.isCombinedStatusBarSignalIconsEnabled()); mView.setIsSingleCarrier(mQSCarrierGroupController.isSingleCarrier()); mQSCarrierGroupController .setOnSingleCarrierChangedListener(mView::setIsSingleCarrier); List<String> rssiIgnoredSlots; if (mFeatureFlags.isCombinedStatusBarSignalIconsEnabled()) { rssiIgnoredSlots = List.of( getResources().getString(com.android.internal.R.string.status_bar_no_calling), getResources().getString(com.android.internal.R.string.status_bar_call_strength) ); } else { rssiIgnoredSlots = List.of( getResources().getString(com.android.internal.R.string.status_bar_mobile) ); } mView.onAttach(mIconManager, mQSExpansionPathInterpolator, rssiIgnoredSlots); mDemoModeController.addCallback(mDemoModeReceiver); } Loading @@ -189,6 +210,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mColorExtractor.removeOnColorsChangedListener(mOnColorsChangedListener); mPrivacyChip.setOnClickListener(null); mStatusBarIconController.removeIconGroup(mIconManager); mQSCarrierGroupController.setOnSingleCarrierChangedListener(null); mDemoModeController.removeCallback(mDemoModeReceiver); setListening(false); } Loading Loading @@ -236,21 +258,25 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mView.setChipVisibility(chipVisible); } private List<String> getIgnoredIconSlots() { ArrayList<String> ignored = new ArrayList<>(); private void updatePrivacyIconSlots() { if (getChipEnabled()) { if (mMicCameraIndicatorsEnabled) { ignored.add(mView.getResources().getString( com.android.internal.R.string.status_bar_camera)); ignored.add(mView.getResources().getString( com.android.internal.R.string.status_bar_microphone)); mIconContainer.addIgnoredSlot(mCameraSlot); mIconContainer.addIgnoredSlot(mMicSlot); } else { mIconContainer.removeIgnoredSlot(mCameraSlot); mIconContainer.removeIgnoredSlot(mMicSlot); } if (mLocationIndicatorsEnabled) { ignored.add(mView.getResources().getString( com.android.internal.R.string.status_bar_location)); mIconContainer.addIgnoredSlot(mLocationSlot); } else { mIconContainer.removeIgnoredSlot(mLocationSlot); } } else { mIconContainer.removeIgnoredSlot(mCameraSlot); mIconContainer.removeIgnoredSlot(mMicSlot); mIconContainer.removeIgnoredSlot(mLocationSlot); } return ignored; } private boolean getChipEnabled() { Loading packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java +20 −4 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.VisibleForTesting; import com.android.settingslib.Utils; import com.android.settingslib.graph.SignalDrawable; import com.android.systemui.R; Loading @@ -37,8 +39,10 @@ public class QSCarrier extends LinearLayout { private TextView mCarrierText; private ImageView mMobileSignal; private ImageView mMobileRoaming; private View mSpacer; private CellSignalState mLastSignalState; private boolean mProviderModelInitialized = false; private boolean mIsSingleCarrier; public QSCarrier(Context context) { super(context); Loading @@ -63,18 +67,25 @@ public class QSCarrier extends LinearLayout { mMobileRoaming = findViewById(R.id.mobile_roaming); mMobileSignal = findViewById(R.id.mobile_signal); mCarrierText = findViewById(R.id.qs_carrier_text); mSpacer = findViewById(R.id.spacer); } /** * Update the state of this view * @param state the current state of the signal for this view * @param isSingleCarrier whether there is a single carrier being shown in the container * @return true if the state was actually changed */ public boolean updateState(CellSignalState state) { if (Objects.equals(state, mLastSignalState)) return false; public boolean updateState(CellSignalState state, boolean isSingleCarrier) { if (Objects.equals(state, mLastSignalState) && isSingleCarrier == mIsSingleCarrier) { return false; } mLastSignalState = state; mMobileGroup.setVisibility(state.visible ? View.VISIBLE : View.GONE); if (state.visible) { mIsSingleCarrier = isSingleCarrier; final boolean visible = state.visible && !isSingleCarrier; mMobileGroup.setVisibility(visible ? View.VISIBLE : View.GONE); mSpacer.setVisibility(isSingleCarrier ? View.VISIBLE : View.GONE); if (visible) { mMobileRoaming.setVisibility(state.roaming ? View.VISIBLE : View.GONE); ColorStateList colorStateList = Utils.getColorAttr(mContext, android.R.attr.textColorPrimary); Loading Loading @@ -125,6 +136,11 @@ public class QSCarrier extends LinearLayout { com.android.settingslib.R.string.not_default_data_content_description)); } @VisibleForTesting View getRSSIView() { return mMobileGroup; } public void setCarrierText(CharSequence text) { mCarrierText.setText(text); } Loading packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java +79 −8 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import com.android.keyguard.CarrierTextManager; import com.android.settingslib.AccessibilityContentDescriptions; import com.android.settingslib.mobile.TelephonyIcons; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; Loading @@ -62,7 +63,8 @@ public class QSCarrierGroupController { private final NetworkController mNetworkController; private final CarrierTextManager mCarrierTextManager; private final TextView mNoSimTextView; private final H mMainHandler; // Non final for testing private H mMainHandler; private final Callback mCallback; private boolean mListening; private final CellSignalState[] mInfos = Loading @@ -74,6 +76,11 @@ public class QSCarrierGroupController { private final boolean mProviderModel; private final CarrierConfigTracker mCarrierConfigTracker; private boolean mIsSingleCarrier; private OnSingleCarrierChangedListener mOnSingleCarrierChangedListener; private final SlotIndexResolver mSlotIndexResolver; private final NetworkController.SignalCallback mSignalCallback = new NetworkController.SignalCallback() { @Override Loading Loading @@ -207,7 +214,8 @@ public class QSCarrierGroupController { @Background Handler bgHandler, @Main Looper mainLooper, NetworkController networkController, CarrierTextManager.Builder carrierTextManagerBuilder, Context context, CarrierConfigTracker carrierConfigTracker, FeatureFlags featureFlags) { CarrierConfigTracker carrierConfigTracker, FeatureFlags featureFlags, SlotIndexResolver slotIndexResolver) { if (featureFlags.isCombinedStatusBarSignalIconsEnabled()) { mProviderModel = true; Loading @@ -222,6 +230,7 @@ public class QSCarrierGroupController { .setShowMissingSim(false) .build(); mCarrierConfigTracker = carrierConfigTracker; mSlotIndexResolver = slotIndexResolver; View.OnClickListener onClickListener = v -> { if (!v.isVisibleToUser()) { return; Loading Loading @@ -256,6 +265,7 @@ public class QSCarrierGroupController { .toString(); mCarrierGroups[i].setOnClickListener(onClickListener); } mIsSingleCarrier = computeIsSingleCarrier(); view.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { Loading @@ -272,10 +282,24 @@ public class QSCarrierGroupController { @VisibleForTesting protected int getSlotIndex(int subscriptionId) { return SubscriptionManager.getSlotIndex(subscriptionId); return mSlotIndexResolver.getSlotIndex(subscriptionId); } private boolean isSingleCarrier() { /** * Sets a {@link OnSingleCarrierChangedListener}. * * This will get notified when the number of carriers changes between 1 and "not one". * @param listener */ public void setOnSingleCarrierChangedListener(OnSingleCarrierChangedListener listener) { mOnSingleCarrierChangedListener = listener; } public boolean isSingleCarrier() { return mIsSingleCarrier; } private boolean computeIsSingleCarrier() { int carrierCount = 0; for (int i = 0; i < SIM_SLOTS; i++) { Loading Loading @@ -315,7 +339,9 @@ public class QSCarrierGroupController { return; } if (isSingleCarrier()) { boolean singleCarrier = computeIsSingleCarrier(); if (singleCarrier) { for (int i = 0; i < SIM_SLOTS; i++) { if (mInfos[i].visible && mInfos[i].mobileSignalIconId == R.drawable.ic_qs_sim_card) { Loading @@ -326,7 +352,7 @@ public class QSCarrierGroupController { } for (int i = 0; i < SIM_SLOTS; i++) { mCarrierGroups[i].updateState(mInfos[i]); mCarrierGroups[i].updateState(mInfos[i], singleCarrier); } mCarrierDividers[0].setVisibility( Loading @@ -337,6 +363,12 @@ public class QSCarrierGroupController { mCarrierDividers[1].setVisibility( (mInfos[1].visible && mInfos[2].visible) || (mInfos[0].visible && mInfos[2].visible) ? View.VISIBLE : View.GONE); if (mIsSingleCarrier != singleCarrier) { mIsSingleCarrier = singleCarrier; if (mOnSingleCarrierChangedListener != null) { mOnSingleCarrierChangedListener.onSingleCarrierChanged(singleCarrier); } } } @MainThread Loading Loading @@ -433,12 +465,14 @@ public class QSCarrierGroupController { private final Context mContext; private final CarrierConfigTracker mCarrierConfigTracker; private final FeatureFlags mFeatureFlags; private final SlotIndexResolver mSlotIndexResolver; @Inject public Builder(ActivityStarter activityStarter, @Background Handler handler, @Main Looper looper, NetworkController networkController, CarrierTextManager.Builder carrierTextControllerBuilder, Context context, CarrierConfigTracker carrierConfigTracker, FeatureFlags featureFlags) { CarrierConfigTracker carrierConfigTracker, FeatureFlags featureFlags, SlotIndexResolver slotIndexResolver) { mActivityStarter = activityStarter; mHandler = handler; mLooper = looper; Loading @@ -447,6 +481,7 @@ public class QSCarrierGroupController { mContext = context; mCarrierConfigTracker = carrierConfigTracker; mFeatureFlags = featureFlags; mSlotIndexResolver = slotIndexResolver; } public Builder setQSCarrierGroup(QSCarrierGroup view) { Loading @@ -457,7 +492,43 @@ public class QSCarrierGroupController { public QSCarrierGroupController build() { return new QSCarrierGroupController(mView, mActivityStarter, mHandler, mLooper, mNetworkController, mCarrierTextControllerBuilder, mContext, mCarrierConfigTracker, mFeatureFlags); mCarrierConfigTracker, mFeatureFlags, mSlotIndexResolver); } } /** * Notify when the state changes from 1 carrier to "not one" and viceversa */ @FunctionalInterface public interface OnSingleCarrierChangedListener { void onSingleCarrierChanged(boolean isSingleCarrier); } /** * Interface for resolving slot index from subscription ID. */ @FunctionalInterface public interface SlotIndexResolver { /** * Get slot index for given sub id. */ int getSlotIndex(int subscriptionId); } /** * Default implementation for {@link SlotIndexResolver}. * * It retrieves the slot index using {@link SubscriptionManager#getSlotIndex}. */ @SysUISingleton public static class SubscriptionManagerSlotIndexResolver implements SlotIndexResolver { @Inject public SubscriptionManagerSlotIndexResolver() {} @Override public int getSlotIndex(int subscriptionId) { return SubscriptionManager.getSlotIndex(subscriptionId); } } } Loading
packages/SystemUI/res/layout/qs_carrier.xml +7 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,13 @@ android:singleLine="true" android:maxEms="7"/> <View android:id="@+id/spacer" android:layout_width="@dimen/qs_carrier_margin_width" android:layout_height="match_parent" android:visibility="gone" /> <include layout="@layout/mobile_signal_group" android:layout_width="wrap_content" Loading
packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +26 −31 Original line number Diff line number Diff line Loading @@ -32,6 +32,8 @@ import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.Space; import androidx.annotation.NonNull; import com.android.settingslib.Utils; import com.android.systemui.BatteryMeterView; import com.android.systemui.R; Loading @@ -41,6 +43,8 @@ import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.statusbar.phone.StatusIconContainer; import com.android.systemui.statusbar.policy.Clock; import java.util.List; /** * View that contains the top-most bits of the QS panel (primarily the status bar with date, time, * battery, carrier info and privacy icons) and also contains the {@link QuickQSPanel}. Loading Loading @@ -84,18 +88,13 @@ public class QuickStatusBarHeader extends FrameLayout { private float mKeyguardExpansionFraction; private int mTextColorPrimary = Color.TRANSPARENT; private int mTopViewMeasureHeight; private boolean mProviderModel; private final String mMobileSlotName; private final String mNoCallingSlotName; private final String mCallStrengthSlotName; @NonNull private List<String> mRssiIgnoredSlots; private boolean mIsSingleCarrier; public QuickStatusBarHeader(Context context, AttributeSet attrs) { super(context, attrs); mMobileSlotName = context.getString(com.android.internal.R.string.status_bar_mobile); mNoCallingSlotName = context.getString(com.android.internal.R.string.status_bar_no_calling); mCallStrengthSlotName = context.getString(com.android.internal.R.string.status_bar_call_strength); } /** Loading Loading @@ -145,9 +144,9 @@ public class QuickStatusBarHeader extends FrameLayout { void onAttach(TintedIconManager iconManager, QSExpansionPathInterpolator qsExpansionPathInterpolator, boolean providerModel) { mProviderModel = providerModel; List<String> rssiIgnoredSlots) { mTintedIconManager = iconManager; mRssiIgnoredSlots = rssiIgnoredSlots; int fillColor = Utils.getColorAttrDefaultColor(getContext(), android.R.attr.textColorPrimary); Loading @@ -158,6 +157,15 @@ public class QuickStatusBarHeader extends FrameLayout { updateAnimators(); } void setIsSingleCarrier(boolean isSingleCarrier) { mIsSingleCarrier = isSingleCarrier; updateAlphaAnimator(); } public QuickQSPanel getHeaderQsPanel() { return mHeaderQsPanel; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); Loading Loading @@ -265,39 +273,26 @@ public class QuickStatusBarHeader extends FrameLayout { .setListener(new TouchAnimator.ListenerAdapter() { @Override public void onAnimationAtEnd() { // TODO(b/185580157): Remove the mProviderModel if the mobile slot can be // hidden in Provider model. if (mProviderModel) { mIconContainer.addIgnoredSlot(mNoCallingSlotName); mIconContainer.addIgnoredSlot(mCallStrengthSlotName); } else { mIconContainer.addIgnoredSlot(mMobileSlotName); super.onAnimationAtEnd(); if (!mIsSingleCarrier) { mIconContainer.addIgnoredSlots(mRssiIgnoredSlots); } } @Override public void onAnimationStarted() { if (mProviderModel) { mIconContainer.addIgnoredSlot(mNoCallingSlotName); mIconContainer.addIgnoredSlot(mCallStrengthSlotName); } else { mIconContainer.addIgnoredSlot(mMobileSlotName); } setSeparatorVisibility(false); if (!mIsSingleCarrier) { mIconContainer.addIgnoredSlots(mRssiIgnoredSlots); } } @Override public void onAnimationAtStart() { super.onAnimationAtStart(); if (mProviderModel) { mIconContainer.removeIgnoredSlot(mNoCallingSlotName); mIconContainer.removeIgnoredSlot(mCallStrengthSlotName); } else { mIconContainer.removeIgnoredSlot(mMobileSlotName); } setSeparatorVisibility(mShowClockIconsSeparator); // In QQS we never ignore RSSI. mIconContainer.removeIgnoredSlots(mRssiIgnoredSlots); } }); mAlphaAnimator = builder.build(); Loading
packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +42 −16 Original line number Diff line number Diff line Loading @@ -43,7 +43,6 @@ import com.android.systemui.statusbar.phone.StatusIconContainer; import com.android.systemui.statusbar.policy.Clock; import com.android.systemui.util.ViewController; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; Loading Loading @@ -76,6 +75,9 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader private boolean mMicCameraIndicatorsEnabled; private boolean mLocationIndicatorsEnabled; private boolean mPrivacyChipLogged; private final String mCameraSlot; private final String mMicSlot; private final String mLocationSlot; private SysuiColorExtractor mColorExtractor; private ColorExtractor.OnColorsChangedListener mOnColorsChangedListener; Loading Loading @@ -104,8 +106,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader } private void update() { StatusIconContainer iconContainer = mView.requireViewById(R.id.statusIcons); iconContainer.setIgnoredSlots(getIgnoredIconSlots()); updatePrivacyIconSlots(); setChipVisibility(!mPrivacyChip.getPrivacyList().isEmpty()); } }; Loading Loading @@ -154,7 +155,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mClockView = mView.findViewById(R.id.clock); mIconContainer = mView.findViewById(R.id.statusIcons); mIconManager = new StatusBarIconController.TintedIconManager(mIconContainer, mFeatureFlags); mIconManager = new StatusBarIconController.TintedIconManager(mIconContainer, featureFlags); mDemoModeReceiver = new ClockDemoModeReceiver(mClockView); mColorExtractor = colorExtractor; mOnColorsChangedListener = (extractor, which) -> { Loading @@ -162,6 +163,10 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mClockView.onColorsChanged(lightTheme); }; mColorExtractor.addOnColorsChangedListener(mOnColorsChangedListener); mCameraSlot = getResources().getString(com.android.internal.R.string.status_bar_camera); mMicSlot = getResources().getString(com.android.internal.R.string.status_bar_microphone); mLocationSlot = getResources().getString(com.android.internal.R.string.status_bar_location); } @Override Loading @@ -172,14 +177,30 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mLocationIndicatorsEnabled = mPrivacyItemController.getLocationAvailable(); // Ignore privacy icons because they show in the space above QQS mIconContainer.setIgnoredSlots(getIgnoredIconSlots()); updatePrivacyIconSlots(); mIconContainer.setShouldRestrictIcons(false); mStatusBarIconController.addIconGroup(mIconManager); setChipVisibility(mPrivacyChip.getVisibility() == View.VISIBLE); mView.onAttach(mIconManager, mQSExpansionPathInterpolator, mFeatureFlags.isCombinedStatusBarSignalIconsEnabled()); mView.setIsSingleCarrier(mQSCarrierGroupController.isSingleCarrier()); mQSCarrierGroupController .setOnSingleCarrierChangedListener(mView::setIsSingleCarrier); List<String> rssiIgnoredSlots; if (mFeatureFlags.isCombinedStatusBarSignalIconsEnabled()) { rssiIgnoredSlots = List.of( getResources().getString(com.android.internal.R.string.status_bar_no_calling), getResources().getString(com.android.internal.R.string.status_bar_call_strength) ); } else { rssiIgnoredSlots = List.of( getResources().getString(com.android.internal.R.string.status_bar_mobile) ); } mView.onAttach(mIconManager, mQSExpansionPathInterpolator, rssiIgnoredSlots); mDemoModeController.addCallback(mDemoModeReceiver); } Loading @@ -189,6 +210,7 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mColorExtractor.removeOnColorsChangedListener(mOnColorsChangedListener); mPrivacyChip.setOnClickListener(null); mStatusBarIconController.removeIconGroup(mIconManager); mQSCarrierGroupController.setOnSingleCarrierChangedListener(null); mDemoModeController.removeCallback(mDemoModeReceiver); setListening(false); } Loading Loading @@ -236,21 +258,25 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mView.setChipVisibility(chipVisible); } private List<String> getIgnoredIconSlots() { ArrayList<String> ignored = new ArrayList<>(); private void updatePrivacyIconSlots() { if (getChipEnabled()) { if (mMicCameraIndicatorsEnabled) { ignored.add(mView.getResources().getString( com.android.internal.R.string.status_bar_camera)); ignored.add(mView.getResources().getString( com.android.internal.R.string.status_bar_microphone)); mIconContainer.addIgnoredSlot(mCameraSlot); mIconContainer.addIgnoredSlot(mMicSlot); } else { mIconContainer.removeIgnoredSlot(mCameraSlot); mIconContainer.removeIgnoredSlot(mMicSlot); } if (mLocationIndicatorsEnabled) { ignored.add(mView.getResources().getString( com.android.internal.R.string.status_bar_location)); mIconContainer.addIgnoredSlot(mLocationSlot); } else { mIconContainer.removeIgnoredSlot(mLocationSlot); } } else { mIconContainer.removeIgnoredSlot(mCameraSlot); mIconContainer.removeIgnoredSlot(mMicSlot); mIconContainer.removeIgnoredSlot(mLocationSlot); } return ignored; } private boolean getChipEnabled() { Loading
packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java +20 −4 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.VisibleForTesting; import com.android.settingslib.Utils; import com.android.settingslib.graph.SignalDrawable; import com.android.systemui.R; Loading @@ -37,8 +39,10 @@ public class QSCarrier extends LinearLayout { private TextView mCarrierText; private ImageView mMobileSignal; private ImageView mMobileRoaming; private View mSpacer; private CellSignalState mLastSignalState; private boolean mProviderModelInitialized = false; private boolean mIsSingleCarrier; public QSCarrier(Context context) { super(context); Loading @@ -63,18 +67,25 @@ public class QSCarrier extends LinearLayout { mMobileRoaming = findViewById(R.id.mobile_roaming); mMobileSignal = findViewById(R.id.mobile_signal); mCarrierText = findViewById(R.id.qs_carrier_text); mSpacer = findViewById(R.id.spacer); } /** * Update the state of this view * @param state the current state of the signal for this view * @param isSingleCarrier whether there is a single carrier being shown in the container * @return true if the state was actually changed */ public boolean updateState(CellSignalState state) { if (Objects.equals(state, mLastSignalState)) return false; public boolean updateState(CellSignalState state, boolean isSingleCarrier) { if (Objects.equals(state, mLastSignalState) && isSingleCarrier == mIsSingleCarrier) { return false; } mLastSignalState = state; mMobileGroup.setVisibility(state.visible ? View.VISIBLE : View.GONE); if (state.visible) { mIsSingleCarrier = isSingleCarrier; final boolean visible = state.visible && !isSingleCarrier; mMobileGroup.setVisibility(visible ? View.VISIBLE : View.GONE); mSpacer.setVisibility(isSingleCarrier ? View.VISIBLE : View.GONE); if (visible) { mMobileRoaming.setVisibility(state.roaming ? View.VISIBLE : View.GONE); ColorStateList colorStateList = Utils.getColorAttr(mContext, android.R.attr.textColorPrimary); Loading Loading @@ -125,6 +136,11 @@ public class QSCarrier extends LinearLayout { com.android.settingslib.R.string.not_default_data_content_description)); } @VisibleForTesting View getRSSIView() { return mMobileGroup; } public void setCarrierText(CharSequence text) { mCarrierText.setText(text); } Loading
packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java +79 −8 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import com.android.keyguard.CarrierTextManager; import com.android.settingslib.AccessibilityContentDescriptions; import com.android.settingslib.mobile.TelephonyIcons; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; Loading @@ -62,7 +63,8 @@ public class QSCarrierGroupController { private final NetworkController mNetworkController; private final CarrierTextManager mCarrierTextManager; private final TextView mNoSimTextView; private final H mMainHandler; // Non final for testing private H mMainHandler; private final Callback mCallback; private boolean mListening; private final CellSignalState[] mInfos = Loading @@ -74,6 +76,11 @@ public class QSCarrierGroupController { private final boolean mProviderModel; private final CarrierConfigTracker mCarrierConfigTracker; private boolean mIsSingleCarrier; private OnSingleCarrierChangedListener mOnSingleCarrierChangedListener; private final SlotIndexResolver mSlotIndexResolver; private final NetworkController.SignalCallback mSignalCallback = new NetworkController.SignalCallback() { @Override Loading Loading @@ -207,7 +214,8 @@ public class QSCarrierGroupController { @Background Handler bgHandler, @Main Looper mainLooper, NetworkController networkController, CarrierTextManager.Builder carrierTextManagerBuilder, Context context, CarrierConfigTracker carrierConfigTracker, FeatureFlags featureFlags) { CarrierConfigTracker carrierConfigTracker, FeatureFlags featureFlags, SlotIndexResolver slotIndexResolver) { if (featureFlags.isCombinedStatusBarSignalIconsEnabled()) { mProviderModel = true; Loading @@ -222,6 +230,7 @@ public class QSCarrierGroupController { .setShowMissingSim(false) .build(); mCarrierConfigTracker = carrierConfigTracker; mSlotIndexResolver = slotIndexResolver; View.OnClickListener onClickListener = v -> { if (!v.isVisibleToUser()) { return; Loading Loading @@ -256,6 +265,7 @@ public class QSCarrierGroupController { .toString(); mCarrierGroups[i].setOnClickListener(onClickListener); } mIsSingleCarrier = computeIsSingleCarrier(); view.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { Loading @@ -272,10 +282,24 @@ public class QSCarrierGroupController { @VisibleForTesting protected int getSlotIndex(int subscriptionId) { return SubscriptionManager.getSlotIndex(subscriptionId); return mSlotIndexResolver.getSlotIndex(subscriptionId); } private boolean isSingleCarrier() { /** * Sets a {@link OnSingleCarrierChangedListener}. * * This will get notified when the number of carriers changes between 1 and "not one". * @param listener */ public void setOnSingleCarrierChangedListener(OnSingleCarrierChangedListener listener) { mOnSingleCarrierChangedListener = listener; } public boolean isSingleCarrier() { return mIsSingleCarrier; } private boolean computeIsSingleCarrier() { int carrierCount = 0; for (int i = 0; i < SIM_SLOTS; i++) { Loading Loading @@ -315,7 +339,9 @@ public class QSCarrierGroupController { return; } if (isSingleCarrier()) { boolean singleCarrier = computeIsSingleCarrier(); if (singleCarrier) { for (int i = 0; i < SIM_SLOTS; i++) { if (mInfos[i].visible && mInfos[i].mobileSignalIconId == R.drawable.ic_qs_sim_card) { Loading @@ -326,7 +352,7 @@ public class QSCarrierGroupController { } for (int i = 0; i < SIM_SLOTS; i++) { mCarrierGroups[i].updateState(mInfos[i]); mCarrierGroups[i].updateState(mInfos[i], singleCarrier); } mCarrierDividers[0].setVisibility( Loading @@ -337,6 +363,12 @@ public class QSCarrierGroupController { mCarrierDividers[1].setVisibility( (mInfos[1].visible && mInfos[2].visible) || (mInfos[0].visible && mInfos[2].visible) ? View.VISIBLE : View.GONE); if (mIsSingleCarrier != singleCarrier) { mIsSingleCarrier = singleCarrier; if (mOnSingleCarrierChangedListener != null) { mOnSingleCarrierChangedListener.onSingleCarrierChanged(singleCarrier); } } } @MainThread Loading Loading @@ -433,12 +465,14 @@ public class QSCarrierGroupController { private final Context mContext; private final CarrierConfigTracker mCarrierConfigTracker; private final FeatureFlags mFeatureFlags; private final SlotIndexResolver mSlotIndexResolver; @Inject public Builder(ActivityStarter activityStarter, @Background Handler handler, @Main Looper looper, NetworkController networkController, CarrierTextManager.Builder carrierTextControllerBuilder, Context context, CarrierConfigTracker carrierConfigTracker, FeatureFlags featureFlags) { CarrierConfigTracker carrierConfigTracker, FeatureFlags featureFlags, SlotIndexResolver slotIndexResolver) { mActivityStarter = activityStarter; mHandler = handler; mLooper = looper; Loading @@ -447,6 +481,7 @@ public class QSCarrierGroupController { mContext = context; mCarrierConfigTracker = carrierConfigTracker; mFeatureFlags = featureFlags; mSlotIndexResolver = slotIndexResolver; } public Builder setQSCarrierGroup(QSCarrierGroup view) { Loading @@ -457,7 +492,43 @@ public class QSCarrierGroupController { public QSCarrierGroupController build() { return new QSCarrierGroupController(mView, mActivityStarter, mHandler, mLooper, mNetworkController, mCarrierTextControllerBuilder, mContext, mCarrierConfigTracker, mFeatureFlags); mCarrierConfigTracker, mFeatureFlags, mSlotIndexResolver); } } /** * Notify when the state changes from 1 carrier to "not one" and viceversa */ @FunctionalInterface public interface OnSingleCarrierChangedListener { void onSingleCarrierChanged(boolean isSingleCarrier); } /** * Interface for resolving slot index from subscription ID. */ @FunctionalInterface public interface SlotIndexResolver { /** * Get slot index for given sub id. */ int getSlotIndex(int subscriptionId); } /** * Default implementation for {@link SlotIndexResolver}. * * It retrieves the slot index using {@link SubscriptionManager#getSlotIndex}. */ @SysUISingleton public static class SubscriptionManagerSlotIndexResolver implements SlotIndexResolver { @Inject public SubscriptionManagerSlotIndexResolver() {} @Override public int getSlotIndex(int subscriptionId) { return SubscriptionManager.getSlotIndex(subscriptionId); } } }