diff --git a/packages/SettingsLib/res/drawable/ic_mobile_call_strength_1.xml b/packages/SettingsLib/res/drawable/ic_mobile_call_strength_1.xml new file mode 100644 index 0000000000000..46e2d4554d463 --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_mobile_call_strength_1.xml @@ -0,0 +1,35 @@ + + + + + + + diff --git a/packages/SettingsLib/res/drawable/ic_mobile_call_strength_2.xml b/packages/SettingsLib/res/drawable/ic_mobile_call_strength_2.xml new file mode 100644 index 0000000000000..d9cd590e650a2 --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_mobile_call_strength_2.xml @@ -0,0 +1,34 @@ + + + + + + + diff --git a/packages/SettingsLib/res/drawable/ic_mobile_call_strength_3.xml b/packages/SettingsLib/res/drawable/ic_mobile_call_strength_3.xml new file mode 100644 index 0000000000000..e80fd08a8c0a3 --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_mobile_call_strength_3.xml @@ -0,0 +1,33 @@ + + + + + + + diff --git a/packages/SettingsLib/res/drawable/ic_wifi_call_strength_1.xml b/packages/SettingsLib/res/drawable/ic_wifi_call_strength_1.xml new file mode 100644 index 0000000000000..493912b0ddcdc --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_wifi_call_strength_1.xml @@ -0,0 +1,35 @@ + + + + + + + diff --git a/packages/SettingsLib/res/drawable/ic_wifi_call_strength_2.xml b/packages/SettingsLib/res/drawable/ic_wifi_call_strength_2.xml new file mode 100644 index 0000000000000..af677fb604ae7 --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_wifi_call_strength_2.xml @@ -0,0 +1,34 @@ + + + + + + + diff --git a/packages/SettingsLib/res/drawable/ic_wifi_call_strength_3.xml b/packages/SettingsLib/res/drawable/ic_wifi_call_strength_3.xml new file mode 100644 index 0000000000000..68b39da82ae5d --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_wifi_call_strength_3.xml @@ -0,0 +1,33 @@ + + + + + + + diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 7556ace466f26..8ff6d07397d4c 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -1485,4 +1485,7 @@ Ethernet disconnected. Ethernet. + + + No calling. diff --git a/packages/SettingsLib/src/com/android/settingslib/AccessibilityContentDescriptions.java b/packages/SettingsLib/src/com/android/settingslib/AccessibilityContentDescriptions.java index 45028ff8f4f91..eff9e74e0e708 100644 --- a/packages/SettingsLib/src/com/android/settingslib/AccessibilityContentDescriptions.java +++ b/packages/SettingsLib/src/com/android/settingslib/AccessibilityContentDescriptions.java @@ -48,6 +48,8 @@ public class AccessibilityContentDescriptions { public static final int WIFI_NO_CONNECTION = R.string.accessibility_no_wifi; + public static final int NO_CALLING = R.string.accessibility_no_calling; + public static final int[] ETHERNET_CONNECTION_VALUES = { R.string.accessibility_ethernet_disconnected, R.string.accessibility_ethernet_connected, diff --git a/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java index 4c7b898a4fb55..0cd5e4ded168d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/mobile/MobileStatusTracker.java @@ -266,7 +266,7 @@ public class MobileStatusTracker { serviceState.getDataRegState()) + ")") .append(',') .append("signalStrength=").append(signalStrength == null ? "" - : signalStrength.toString()).append(',') + : signalStrength.getLevel()).append(',') .append("telephonyDisplayInfo=").append(telephonyDisplayInfo == null ? "" : telephonyDisplayInfo.toString()).append(']').toString(); } diff --git a/packages/SettingsLib/src/com/android/settingslib/mobile/TelephonyIcons.java b/packages/SettingsLib/src/com/android/settingslib/mobile/TelephonyIcons.java index 0cb9906b9a829..e3413aac08ad1 100644 --- a/packages/SettingsLib/src/com/android/settingslib/mobile/TelephonyIcons.java +++ b/packages/SettingsLib/src/com/android/settingslib/mobile/TelephonyIcons.java @@ -317,5 +317,21 @@ public class TelephonyIcons { ICON_NAME_TO_ICON.put("datadisable", DATA_DISABLED); ICON_NAME_TO_ICON.put("notdefaultdata", NOT_DEFAULT_DATA); } + + public static final int[] WIFI_CALL_STRENGTH_ICONS = { + R.drawable.ic_wifi_call_strength_1, + R.drawable.ic_wifi_call_strength_1, + R.drawable.ic_wifi_call_strength_2, + R.drawable.ic_wifi_call_strength_3, + R.drawable.ic_wifi_call_strength_3 + }; + + public static final int[] MOBILE_CALL_STRENGTH_ICONS = { + R.drawable.ic_mobile_call_strength_1, + R.drawable.ic_mobile_call_strength_1, + R.drawable.ic_mobile_call_strength_2, + R.drawable.ic_mobile_call_strength_3, + R.drawable.ic_mobile_call_strength_3 + }; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java index eddcf8c1e9aec..ae0b5d11db136 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java +++ b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java @@ -39,6 +39,7 @@ public class QSCarrier extends LinearLayout { private ImageView mMobileSignal; private ImageView mMobileRoaming; private CellSignalState mLastSignalState; + private boolean mProviderModel; public QSCarrier(Context context) { super(context); @@ -59,15 +60,20 @@ public class QSCarrier extends LinearLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mMobileGroup = findViewById(R.id.mobile_combo); if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL)) { - mMobileRoaming = findViewById(R.id.mobile_roaming_large); + mProviderModel = true; } else { - mMobileRoaming = findViewById(R.id.mobile_roaming); + mProviderModel = false; } + mMobileGroup = findViewById(R.id.mobile_combo); + mMobileRoaming = findViewById(R.id.mobile_roaming); mMobileSignal = findViewById(R.id.mobile_signal); mCarrierText = findViewById(R.id.qs_carrier_text); - mMobileSignal.setImageDrawable(new SignalDrawable(mContext)); + if (mProviderModel) { + mMobileSignal.setImageDrawable(mContext.getDrawable(R.drawable.ic_qs_no_calling_sms)); + } else { + mMobileSignal.setImageDrawable(new SignalDrawable(mContext)); + } } /** @@ -85,22 +91,27 @@ public class QSCarrier extends LinearLayout { android.R.attr.textColorPrimary); mMobileRoaming.setImageTintList(colorStateList); mMobileSignal.setImageTintList(colorStateList); - mMobileSignal.setImageLevel(state.mobileSignalIconId); - StringBuilder contentDescription = new StringBuilder(); - if (state.contentDescription != null) { - contentDescription.append(state.contentDescription).append(", "); + if (mProviderModel) { + mMobileSignal.setImageDrawable(mContext.getDrawable(state.mobileSignalIconId)); + mMobileSignal.setContentDescription(state.contentDescription); + } else { + mMobileSignal.setImageLevel(state.mobileSignalIconId); + StringBuilder contentDescription = new StringBuilder(); + if (state.contentDescription != null) { + contentDescription.append(state.contentDescription).append(", "); + } + if (state.roaming) { + contentDescription + .append(mContext.getString(R.string.data_connection_roaming)) + .append(", "); + } + // TODO: show mobile data off/no internet text for 5 seconds before carrier text + if (hasValidTypeContentDescription(state.typeContentDescription)) { + contentDescription.append(state.typeContentDescription); + } + mMobileSignal.setContentDescription(contentDescription); } - if (state.roaming) { - contentDescription - .append(mContext.getString(R.string.data_connection_roaming)) - .append(", "); - } - // TODO: show mobile data off/no internet text for 5 seconds before carrier text - if (hasValidTypeContentDescription(state.typeContentDescription)) { - contentDescription.append(state.typeContentDescription); - } - mMobileSignal.setContentDescription(contentDescription); } return true; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java index 77200ccaf5cb2..a567f512b204b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java @@ -19,6 +19,7 @@ package com.android.systemui.qs.carrier; import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES; import android.annotation.MainThread; +import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.Looper; @@ -26,6 +27,7 @@ import android.os.Message; import android.provider.Settings; import android.telephony.SubscriptionManager; import android.text.TextUtils; +import android.util.FeatureFlagUtils; import android.util.Log; import android.view.View; import android.widget.TextView; @@ -33,6 +35,9 @@ import android.widget.TextView; import androidx.annotation.VisibleForTesting; import com.android.keyguard.CarrierTextController; +import com.android.settingslib.AccessibilityContentDescriptions; +import com.android.settingslib.mobile.TelephonyIcons; +import com.android.systemui.R; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -62,6 +67,9 @@ public class QSCarrierGroupController { new CellSignalState[SIM_SLOTS]; private View[] mCarrierDividers = new View[SIM_SLOTS - 1]; private QSCarrier[] mCarrierGroups = new QSCarrier[SIM_SLOTS]; + private int[] mLastSignalLevel = new int[SIM_SLOTS]; + private String[] mLastSignalLevelDescription = new String[SIM_SLOTS]; + private final boolean mProviderModel; private final NetworkController.SignalCallback mSignalCallback = new NetworkController.SignalCallback() { @@ -72,6 +80,9 @@ public class QSCarrierGroupController { CharSequence typeContentDescription, CharSequence typeContentDescriptionHtml, CharSequence description, boolean isWide, int subId, boolean roaming, boolean showTriangle) { + if (mProviderModel) { + return; + } int slotIndex = getSlotIndex(subId); if (slotIndex >= SIM_SLOTS) { Log.w(TAG, "setMobileDataIndicators - slot: " + slotIndex); @@ -91,6 +102,46 @@ public class QSCarrierGroupController { mMainHandler.obtainMessage(H.MSG_UPDATE_STATE).sendToTarget(); } + @Override + public void setCallIndicator(NetworkController.IconState statusIcon, int subId) { + if (!mProviderModel) { + return; + } + int slotIndex = getSlotIndex(subId); + if (slotIndex >= SIM_SLOTS) { + Log.w(TAG, "setMobileDataIndicators - slot: " + slotIndex); + return; + } + if (slotIndex == SubscriptionManager.INVALID_SIM_SLOT_INDEX) { + Log.e(TAG, "Invalid SIM slot index for subscription: " + subId); + return; + } + if (statusIcon.icon == R.drawable.ic_qs_no_calling_sms) { + if (statusIcon.visible) { + mInfos[slotIndex] = new CellSignalState(true, + statusIcon.icon, statusIcon.contentDescription, "", false); + } else { + // Whenever the no Calling & SMS state is cleared, switched to the last + // known call strength icon. + mInfos[slotIndex] = new CellSignalState( + true, mLastSignalLevel[slotIndex], + mLastSignalLevelDescription[slotIndex], "", false); + } + mMainHandler.obtainMessage(H.MSG_UPDATE_STATE).sendToTarget(); + } else { + mLastSignalLevel[slotIndex] = statusIcon.icon; + mLastSignalLevelDescription[slotIndex] = statusIcon.contentDescription; + // Only Shows the call strength icon when the no Calling & SMS icon is not + // shown. + if (mInfos[slotIndex].mobileSignalIconId + != R.drawable.ic_qs_no_calling_sms) { + mInfos[slotIndex] = new CellSignalState(true, statusIcon.icon, + statusIcon.contentDescription, "", false); + mMainHandler.obtainMessage(H.MSG_UPDATE_STATE).sendToTarget(); + } + } + } + @Override public void setNoSims(boolean hasNoSims, boolean simDetected) { if (hasNoSims) { @@ -118,7 +169,12 @@ public class QSCarrierGroupController { private QSCarrierGroupController(QSCarrierGroup view, ActivityStarter activityStarter, @Background Handler bgHandler, @Main Looper mainLooper, NetworkController networkController, - CarrierTextController.Builder carrierTextControllerBuilder) { + CarrierTextController.Builder carrierTextControllerBuilder, Context context) { + if (FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL)) { + mProviderModel = true; + } else { + mProviderModel = false; + } mActivityStarter = activityStarter; mBgHandler = bgHandler; mNetworkController = networkController; @@ -149,7 +205,13 @@ public class QSCarrierGroupController { mCarrierDividers[1] = view.getCarrierDivider2(); for (int i = 0; i < SIM_SLOTS; i++) { - mInfos[i] = new CellSignalState(); + mInfos[i] = new CellSignalState(true, R.drawable.ic_qs_no_calling_sms, + context.getText(AccessibilityContentDescriptions.NO_CALLING).toString(), + "", false); + mLastSignalLevel[i] = TelephonyIcons.MOBILE_CALL_STRENGTH_ICONS[0]; + mLastSignalLevelDescription[i] = + context.getText(AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0]) + .toString(); mCarrierGroups[i].setOnClickListener(onClickListener); } view.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); @@ -305,16 +367,18 @@ public class QSCarrierGroupController { private final Looper mLooper; private final NetworkController mNetworkController; private final CarrierTextController.Builder mCarrierTextControllerBuilder; + private final Context mContext; @Inject public Builder(ActivityStarter activityStarter, @Background Handler handler, @Main Looper looper, NetworkController networkController, - CarrierTextController.Builder carrierTextControllerBuilder) { + CarrierTextController.Builder carrierTextControllerBuilder, Context context) { mActivityStarter = activityStarter; mHandler = handler; mLooper = looper; mNetworkController = networkController; mCarrierTextControllerBuilder = carrierTextControllerBuilder; + mContext = context; } public Builder setQSCarrierGroup(QSCarrierGroup view) { @@ -324,7 +388,7 @@ public class QSCarrierGroupController { public QSCarrierGroupController build() { return new QSCarrierGroupController(mView, mActivityStarter, mHandler, mLooper, - mNetworkController, mCarrierTextControllerBuilder); + mNetworkController, mCarrierTextControllerBuilder, mContext); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java index 00acd7bb67071..8620376173747 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java @@ -42,8 +42,8 @@ import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.StatusBarMobileView; import com.android.systemui.statusbar.StatusBarWifiView; import com.android.systemui.statusbar.StatusIconDisplayable; +import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.CallIndicatorIconState; import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState; -import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.NoCallingIconState; import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState; import java.util.List; @@ -66,7 +66,7 @@ public interface StatusBarIconController { /** * Display the no calling & SMS icons. */ - void setNoCallingIcons(String slot, List states); + void setCallIndicatorIcons(String slot, List states); public void setIconVisibility(String slot, boolean b); /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java index 5e8d59041faba..f0c8527bcb7f1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java @@ -34,8 +34,8 @@ import com.android.systemui.demomode.DemoMode; import com.android.systemui.demomode.DemoModeController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.StatusIconDisplayable; +import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.CallIndicatorIconState; import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState; -import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.NoCallingIconState; import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; @@ -206,6 +206,7 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu Collections.reverse(iconStates); for (MobileIconState state : iconStates) { + StatusBarIconHolder holder = mobileSlot.getHolderForTag(state.subId); if (holder == null) { holder = StatusBarIconHolder.fromMobileIconState(state); @@ -218,23 +219,25 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu } /** - * Accept a list of NoCallingIconStates, and show them in the same slot + * Accept a list of CallIndicatorIconStates, and show them in the same slot * @param slot StatusBar slot * @param states All of the no Calling & SMS icon states */ @Override - public void setNoCallingIcons(String slot, List states) { + public void setCallIndicatorIcons(String slot, List states) { Slot noCallingSlot = getSlot(slot); int slotIndex = getSlotIndex(slot); - - for (NoCallingIconState state : states) { + for (CallIndicatorIconState state : states) { StatusBarIconHolder holder = noCallingSlot.getHolderForTag(state.subId); if (holder == null) { - holder = StatusBarIconHolder.fromNoCallingState(mContext, state); - holder.setVisible(state.visible); + holder = StatusBarIconHolder.fromCallIndicatorState(mContext, state); setIcon(slotIndex, holder); } else { - holder.setVisible(state.visible); + int resId = state.isNoCalling ? state.noCallingResId : state.callStrengthResId; + String contentDescription = state.isNoCalling + ? state.noCallingDescription : state.callStrengthDescription; + holder.setIcon(new StatusBarIcon(UserHandle.SYSTEM, mContext.getPackageName(), + Icon.createWithResource(mContext, resId), 0, 0, contentDescription)); setIcon(slotIndex, holder); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java index 36a0e63db19fa..a1a2d30e9b004 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconHolder.java @@ -22,8 +22,8 @@ import android.graphics.drawable.Icon; import android.os.UserHandle; import com.android.internal.statusbar.StatusBarIcon; +import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.CallIndicatorIconState; import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState; -import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.NoCallingIconState; import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState; /** @@ -72,14 +72,18 @@ public class StatusBarIconHolder { } /** - * Creates a new StatusBarIconHolder from a NoCallingIconState. + * Creates a new StatusBarIconHolder from a CallIndicatorIconState. */ - public static StatusBarIconHolder fromNoCallingState( - Context context, NoCallingIconState state) { + public static StatusBarIconHolder fromCallIndicatorState( + Context context, CallIndicatorIconState state) { StatusBarIconHolder holder = new StatusBarIconHolder(); + int resId = state.isNoCalling ? state.noCallingResId : state.callStrengthResId; + String contentDescription = state.isNoCalling + ? state.noCallingDescription : state.callStrengthDescription; holder.mIcon = new StatusBarIcon(UserHandle.SYSTEM, context.getPackageName(), - Icon.createWithResource(context, state.resId), 0, 0, null); + Icon.createWithResource(context, resId), 0, 0, contentDescription); holder.mTag = state.subId; + holder.setVisible(true); return holder; } @@ -92,6 +96,10 @@ public class StatusBarIconHolder { return mIcon; } + public void setIcon(StatusBarIcon icon) { + mIcon = icon; + } + @Nullable public WifiIconState getWifiState() { return mWifiState; 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 f6165f666c89d..7bc1bb39642b0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java @@ -22,6 +22,7 @@ import android.telephony.SubscriptionInfo; import android.util.ArraySet; import android.util.Log; +import com.android.settingslib.mobile.TelephonyIcons; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.policy.NetworkController; @@ -39,7 +40,7 @@ import java.util.Objects; public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallback, SecurityController.SecurityControllerCallback, Tunable { private static final String TAG = "StatusBarSignalPolicy"; - private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + private static final boolean DEBUG = Log.isLoggable(TAG, Log.INFO); private final String mSlotAirplane; private final String mSlotMobile; @@ -67,7 +68,8 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba private boolean mWifiVisible = false; private ArrayList mMobileStates = new ArrayList(); - private ArrayList mNoCallingStates = new ArrayList(); + private ArrayList mCallIndicatorStates = + new ArrayList(); private WifiIconState mWifiIconState = new WifiIconState(); public StatusBarSignalPolicy(Context context, StatusBarIconController iconController) { @@ -201,19 +203,25 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba } @Override - public void setNoCallingStatus(boolean noCalling, int subId) { + public void setCallIndicator(IconState statusIcon, int subId) { if (DEBUG) { - Log.d(TAG, "setNoCallingStatus: " - + "noCalling = " + noCalling + "," + Log.d(TAG, "setCallIndicator: " + + "statusIcon = " + statusIcon + "," + "subId = " + subId); } - NoCallingIconState state = getNoCallingState(subId); + CallIndicatorIconState state = getNoCallingState(subId); if (state == null) { return; } - state.visible = noCalling; - mIconController.setNoCallingIcons( - mSlotNoCalling, NoCallingIconState.copyStates(mNoCallingStates)); + if (statusIcon.icon == R.drawable.ic_qs_no_calling_sms) { + state.isNoCalling = statusIcon.visible; + state.noCallingDescription = statusIcon.contentDescription; + } else { + state.callStrengthResId = statusIcon.icon; + state.callStrengthDescription = statusIcon.contentDescription; + } + mIconController.setCallIndicatorIcons( + mSlotNoCalling, CallIndicatorIconState.copyStates(mCallIndicatorStates)); } @Override @@ -273,8 +281,8 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba } } - private NoCallingIconState getNoCallingState(int subId) { - for (NoCallingIconState state : mNoCallingStates) { + private CallIndicatorIconState getNoCallingState(int subId) { + for (CallIndicatorIconState state : mCallIndicatorStates) { if (state.subId == subId) { return state; } @@ -315,23 +323,25 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba } mIconController.removeAllIconsForSlot(mSlotMobile); + mIconController.removeAllIconsForSlot(mSlotNoCalling); mMobileStates.clear(); - List noCallingStates = new ArrayList(); - noCallingStates.addAll(mNoCallingStates); - mNoCallingStates.clear(); + List noCallingStates = new ArrayList(); + noCallingStates.addAll(mCallIndicatorStates); + mCallIndicatorStates.clear(); final int n = subs.size(); for (int i = 0; i < n; i++) { mMobileStates.add(new MobileIconState(subs.get(i).getSubscriptionId())); boolean isNewSub = true; - for (NoCallingIconState state : noCallingStates) { + for (CallIndicatorIconState state : noCallingStates) { if (state.subId == subs.get(i).getSubscriptionId()) { - mNoCallingStates.add(state); + mCallIndicatorStates.add(state); isNewSub = false; break; } } if (isNewSub) { - mNoCallingStates.add(new NoCallingIconState(subs.get(i).getSubscriptionId())); + mCallIndicatorStates.add( + new CallIndicatorIconState(subs.get(i).getSubscriptionId())); } } } @@ -425,14 +435,18 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba /** * Stores the StatusBar state for no Calling & SMS. */ - public static class NoCallingIconState { - public boolean visible; - public int resId; + public static class CallIndicatorIconState { + public boolean isNoCalling; + public int noCallingResId; + public int callStrengthResId; public int subId; + public String noCallingDescription; + public String callStrengthDescription; - private NoCallingIconState(int subId) { + private CallIndicatorIconState(int subId) { this.subId = subId; - this.resId = R.drawable.ic_qs_no_calling_sms; + this.noCallingResId = R.drawable.ic_qs_no_calling_sms; + this.callStrengthResId = TelephonyIcons.MOBILE_CALL_STRENGTH_ICONS[0]; } @Override @@ -441,27 +455,36 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba if (o == null || getClass() != o.getClass()) { return false; } - NoCallingIconState that = (NoCallingIconState) o; - return visible == that.visible - && resId == that.resId - && subId == that.subId; + CallIndicatorIconState that = (CallIndicatorIconState) o; + return isNoCalling == that.isNoCalling + && noCallingResId == that.noCallingResId + && callStrengthResId == that.callStrengthResId + && subId == that.subId + && noCallingDescription == that.noCallingDescription + && callStrengthDescription == that.callStrengthDescription; + } @Override public int hashCode() { - return Objects.hash(visible, resId, subId); + return Objects.hash(isNoCalling, noCallingResId, + callStrengthResId, subId, noCallingDescription, callStrengthDescription); } - private void copyTo(NoCallingIconState other) { - other.visible = visible; - other.resId = resId; + private void copyTo(CallIndicatorIconState other) { + other.isNoCalling = isNoCalling; + other.noCallingResId = noCallingResId; + other.callStrengthResId = callStrengthResId; other.subId = subId; + other.noCallingDescription = noCallingDescription; + other.callStrengthDescription = callStrengthDescription; } - private static List copyStates(List inStates) { - ArrayList outStates = new ArrayList<>(); - for (NoCallingIconState state : inStates) { - NoCallingIconState copy = new NoCallingIconState(state.subId); + private static List copyStates( + List inStates) { + ArrayList outStates = new ArrayList<>(); + for (CallIndicatorIconState state : inStates) { + CallIndicatorIconState copy = new CallIndicatorIconState(state.subId); state.copyTo(copy); outStates.add(copy); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java index ccaa1f4806834..5ff897029543f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java @@ -36,6 +36,7 @@ import java.util.List; * the current or specified Looper. */ public class CallbackHandler extends Handler implements EmergencyListener, SignalCallback { + private static final String TAG = "CallbackHandler"; private static final int MSG_EMERGENCE_CHANGED = 0; private static final int MSG_SUBS_CHANGED = 1; private static final int MSG_NO_SIM_VISIBLE_CHANGED = 2; @@ -198,17 +199,17 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa } @Override - public void setNoCallingStatus(boolean noCalling, int subId) { + public void setCallIndicator(IconState statusIcon, int subId) { String log = new StringBuilder() .append(SSDF.format(System.currentTimeMillis())).append(",") - .append("setNoCallingStatus: ") - .append("noCalling=").append(noCalling).append(",") + .append("setCallIndicator: ") + .append("statusIcon=").append(statusIcon).append(",") .append("subId=").append(subId) .toString(); recordLastCallback(log); post(() -> { for (SignalCallback signalCluster : mSignalCallbacks) { - signalCluster.setNoCallingStatus(noCalling, subId); + signalCluster.setCallIndicator(statusIcon, subId); } }); } @@ -226,24 +227,11 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa @Override public void setNoSims(boolean show, boolean simDetected) { - String log = new StringBuilder() - .append(SSDF.format(System.currentTimeMillis())).append(",") - .append("setNoSims: ") - .append("show=").append(show).append(",") - .append("simDetected=").append(simDetected) - .toString(); - recordLastCallback(log); obtainMessage(MSG_NO_SIM_VISIBLE_CHANGED, show ? 1 : 0, simDetected ? 1 : 0).sendToTarget(); } @Override public void setMobileDataEnabled(boolean enabled) { - String log = new StringBuilder() - .append(SSDF.format(System.currentTimeMillis())).append(",") - .append("setMobileDataEnabled: ") - .append("enabled=").append(enabled) - .toString(); - recordLastCallback(log); obtainMessage(MSG_MOBILE_DATA_ENABLED_CHANGED, enabled ? 1 : 0, 0).sendToTarget(); } @@ -283,7 +271,8 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa } protected void recordLastCallback(String callback) { - mHistory[mHistoryIndex++ & (HISTORY_SIZE - 1)] = callback; + mHistory[mHistoryIndex] = callback; + mHistoryIndex = (mHistoryIndex + 1) % HISTORY_SIZE; } /** @@ -293,7 +282,9 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa pw.println(" - CallbackHandler -----"); int size = 0; for (int i = 0; i < HISTORY_SIZE; i++) { - if (mHistory[i] != null) size++; + if (mHistory[i] != null) { + size++; + } } // Print out the previous states in ordered number. for (int i = mHistoryIndex + HISTORY_SIZE - 1; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 0fe338ea118dc..1ab7652d4280e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -26,6 +26,7 @@ import android.net.NetworkCapabilities; import android.os.Handler; import android.os.Looper; import android.provider.Settings.Global; +import android.telephony.AccessNetworkConstants; import android.telephony.CellSignalStrength; import android.telephony.CellSignalStrengthCdma; import android.telephony.ServiceState; @@ -34,12 +35,18 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyManager; +import android.telephony.ims.ImsException; +import android.telephony.ims.ImsMmTelManager; +import android.telephony.ims.ImsReasonInfo; +import android.telephony.ims.ImsRegistrationAttributes; +import android.telephony.ims.RegistrationManager.RegistrationCallback; import android.text.Html; import android.text.TextUtils; import android.util.FeatureFlagUtils; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; +import com.android.settingslib.AccessibilityContentDescriptions; import com.android.settingslib.SignalIcon.MobileIconGroup; import com.android.settingslib.SignalIcon.MobileState; import com.android.settingslib.Utils; @@ -65,13 +72,19 @@ import java.util.Map; */ public class MobileSignalController extends SignalController { private static final SimpleDateFormat SSDF = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); - + private static final int STATUS_HISTORY_SIZE = 64; + private static final int IMS_TYPE_WWAN = 1; + private static final int IMS_TYPE_WLAN = 2; + private static final int IMS_TYPE_WLAN_CROSS_SIM = 3; private final TelephonyManager mPhone; + private final ImsMmTelManager mImsMmTelManager; private final SubscriptionDefaults mDefaults; private final String mNetworkNameDefault; private final String mNetworkNameSeparator; private final ContentObserver mObserver; private final boolean mProviderModel; + private final Handler mReceiverHandler; + private int mImsType = IMS_TYPE_WWAN; // Save entire info for logging, we only use the id. final SubscriptionInfo mSubscriptionInfo; // @VisibleForDemoMode @@ -86,16 +99,21 @@ public class MobileSignalController extends SignalController signalStrengthCdma = - mSignalStrength.getCellSignalStrengths(CellSignalStrengthCdma.class); + signalStrength.getCellSignalStrengths(CellSignalStrengthCdma.class); if (!signalStrengthCdma.isEmpty()) { return signalStrengthCdma.get(0).getLevel(); } @@ -467,6 +566,7 @@ public class MobileSignalController extends SignalController= mMobileStatusHistoryIndex + HISTORY_SIZE - size; i--) { + for (int i = mMobileStatusHistoryIndex + STATUS_HISTORY_SIZE - 1; + i >= mMobileStatusHistoryIndex + STATUS_HISTORY_SIZE - size; i--) { pw.println(" Previous MobileStatus(" - + (mMobileStatusHistoryIndex + HISTORY_SIZE - i) + "): " - + mMobileStatusHistory[i & (HISTORY_SIZE - 1)]); + + (mMobileStatusHistoryIndex + STATUS_HISTORY_SIZE - i) + "): " + + mMobileStatusHistory[i & (STATUS_HISTORY_SIZE - 1)]); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index e60d5c5f2fa86..0a9fead9cb641 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -53,7 +53,7 @@ public interface NetworkController extends CallbackController, D /** * Callback for listeners to be able to update the state of any UI tracking connectivity - * @param statusIcon the icon that should be shown in the status bar + * @param statusIcon the icon that should be shown in the status bar * @param qsIcon the icon to show in Quick Settings * @param statusType the resId of the data type icon (e.g. LTE) to show in the status bar * @param qsType similar to above, the resId of the data type icon to show in Quick Settings @@ -95,11 +95,11 @@ public interface NetworkController extends CallbackController, D boolean noNetworksAvailable) {} /** - * Callback for listeners to be able to update the no calling & SMS status - * @param noCalling whether the calling and SMS is not working. + * Callback for listeners to be able to update the call indicator + * @param statusIcon the icon for the call indicator * @param subId subscription ID for which to update the UI */ - default void setNoCallingStatus(boolean noCalling, int subId) {} + default void setCallIndicator(IconState statusIcon, int subId) {} } public interface EmergencyListener { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index 80c78115f7bdc..9f921429f7b8a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -554,6 +554,20 @@ public class NetworkControllerImpl extends BroadcastReceiver return controller != null ? controller.getNetworkNameForCarrierWiFi() : ""; } + void notifyWifiLevelChange(int level) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); + mobileSignalController.notifyWifiLevelChange(level); + } + } + + void notifyDefaultMobileLevelChange(int level) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); + mobileSignalController.notifyDefaultMobileLevelChange(level); + } + } + private void notifyControllersMobileDataChanged() { for (int i = 0; i < mMobileSignalControllers.size(); i++) { MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); @@ -623,6 +637,9 @@ public class NetworkControllerImpl extends BroadcastReceiver for (int i = 0; i < mMobileSignalControllers.size(); i++) { MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); mobileSignalController.notifyListeners(cb); + if (mProviderModel) { + mobileSignalController.refreshCallIndicator(cb); + } } mCallbackHandler.setListening(cb, true); } @@ -1272,7 +1289,8 @@ public class NetworkControllerImpl extends BroadcastReceiver } private void recordLastNetworkCallback(String callback) { - mHistory[mHistoryIndex++ & (HISTORY_SIZE - 1)] = callback; + mHistory[mHistoryIndex] = callback; + mHistoryIndex = (mHistoryIndex + 1) % HISTORY_SIZE; } private SubscriptionInfo addSignalController(int id, int simSlotIndex) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java index 554145e9773e5..4b6722c17b859 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java @@ -23,6 +23,7 @@ import android.util.Log; import com.android.settingslib.SignalIcon.IconGroup; import com.android.settingslib.SignalIcon.State; +import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; import java.io.PrintWriter; @@ -167,8 +168,8 @@ public abstract class SignalController { } } - protected final void notifyNoCallingStatusChange(boolean noCalling, int subId) { - mCallbackHandler.setNoCallingStatus(noCalling, subId); + protected final void notifyCallStateChange(IconState statusIcon, int subId) { + mCallbackHandler.setCallIndicator(statusIcon, subId); } /** @@ -187,7 +188,8 @@ public abstract class SignalController { * and last value of any state data. */ protected void recordLastState() { - mHistory[mHistoryIndex++ & (HISTORY_SIZE - 1)].copyFrom(mLastState); + mHistory[mHistoryIndex].copyFrom(mLastState); + mHistoryIndex = (mHistoryIndex + 1) % HISTORY_SIZE; } public void dump(PrintWriter pw) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java index 1fd2ccbf85006..47207d8be78e7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java @@ -202,6 +202,7 @@ public class WifiSignalController extends mCurrentState.connected = mWifiTracker.connected; mCurrentState.ssid = mWifiTracker.ssid; mCurrentState.rssi = mWifiTracker.rssi; + notifyWifiLevelChangeIfNecessary(mWifiTracker.level); mCurrentState.level = mWifiTracker.level; mCurrentState.statusLabel = mWifiTracker.statusLabel; mCurrentState.isCarrierMerged = mWifiTracker.isCarrierMerged; @@ -211,6 +212,12 @@ public class WifiSignalController extends : mUnmergedWifiIconGroup; } + void notifyWifiLevelChangeIfNecessary(int level) { + if (level != mCurrentState.level) { + mNetworkController.notifyWifiLevelChange(level); + } + } + boolean isCarrierMergedWifi(int subId) { return mCurrentState.isDefault && mCurrentState.isCarrierMerged && (mCurrentState.subId == subId); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java index b452d3a79814b..1ec1da44c0b54 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java @@ -98,7 +98,7 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest { mQSCarrierGroupController = new QSCarrierGroupController.Builder( mActivityStarter, handler, TestableLooper.get(this).getLooper(), - mNetworkController, mCarrierTextControllerBuilder) + mNetworkController, mCarrierTextControllerBuilder, mContext) .setQSCarrierGroup(mQSCarrierGroup) .build(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index f8b63835551f0..89cc2b5743984 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -430,6 +430,10 @@ public class NetworkControllerBaseTest extends SysuiTestCase { updateSignalStrength(); } + public void setImsType(int imsType) { + mMobileSignalController.setImsType(imsType); + } + public void setIsGsm(boolean gsm) { when(mSignalStrength.isGsm()).thenReturn(gsm); updateSignalStrength(); @@ -632,6 +636,14 @@ public class NetworkControllerBaseTest extends SysuiTestCase { } } + protected void verifyLastCallStrength(int icon) { + ArgumentCaptor iconArg = ArgumentCaptor.forClass(IconState.class); + verify(mCallbackHandler, Mockito.atLeastOnce()).setCallIndicator( + iconArg.capture(), + anyInt()); + assertEquals("Call strength, in status bar", icon, (int) iconArg.getValue().icon); + } + protected void assertNetworkNameEquals(String expected) { assertEquals("Network name", expected, mMobileSignalController.getState().networkName); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java index 10166cb0c43f2..fc1a08ac3874f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java @@ -15,6 +15,7 @@ import android.net.NetworkInfo; import android.net.vcn.VcnTransportInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; +import android.telephony.CellSignalStrength; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; @@ -243,6 +244,28 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { } } + @Test + public void testCallStrengh() { + String testSsid = "Test SSID"; + setWifiEnabled(true); + setWifiState(true, testSsid); + // Set the ImsType to be IMS_TYPE_WLAN + setImsType(2); + setWifiLevel(1); + for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) { + setWifiLevel(testLevel); + verifyLastCallStrength(TelephonyIcons.WIFI_CALL_STRENGTH_ICONS[testLevel]); + } + // Set the ImsType to be IMS_TYPE_WWAN + setImsType(1); + for (int testStrength = 0; + testStrength < CellSignalStrength.getNumSignalStrengthLevels(); testStrength++) { + setupDefaultSignal(); + setLevel(testStrength); + verifyLastCallStrength(TelephonyIcons.MOBILE_CALL_STRENGTH_ICONS[testStrength]); + } + } + protected void setWifiActivity(int activity) { // TODO: Not this, because this variable probably isn't sticking around. mNetworkController.mWifiSignalController.setActivity(activity); diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java index c0af15b1f96dd..203ece9532ef0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeStatusBarIconController.java @@ -19,8 +19,8 @@ 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.StatusBarSignalPolicy.MobileIconState; -import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.NoCallingIconState; import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState; import java.util.List; @@ -66,7 +66,7 @@ public class FakeStatusBarIconController extends BaseLeakChecker } @Override - public void setNoCallingIcons(String slot, List states) { + public void setCallIndicatorIcons(String slot, List states) { } @Override