Make telephonycallback specific to subId
This change is to keep track of telephony display info for different subId on quick settings dialog. For each subId, use a map to keep track of telephonyCallBack and displayInfo. Test: manual voice call + data browsing + toggle QS settings Bug: 258510998 Change-Id: I0676b40af1cdc68eb0860126a8c1ef18e39bf720
This commit is contained in:
@@ -142,21 +142,28 @@ public class InternetDialogController implements AccessPointController.AccessPoi
|
||||
private static final int SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE =
|
||||
R.string.all_network_unavailable;
|
||||
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
|
||||
private static final TelephonyDisplayInfo DEFAULT_TELEPHONY_DISPLAY_INFO =
|
||||
new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_UNKNOWN,
|
||||
TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE);
|
||||
|
||||
static final int MAX_WIFI_ENTRY_COUNT = 3;
|
||||
|
||||
private final FeatureFlags mFeatureFlags;
|
||||
|
||||
@VisibleForTesting
|
||||
/** Should be accessible only to the main thread. */
|
||||
final Map<Integer, TelephonyDisplayInfo> mSubIdTelephonyDisplayInfoMap = new HashMap<>();
|
||||
|
||||
private WifiManager mWifiManager;
|
||||
private Context mContext;
|
||||
private SubscriptionManager mSubscriptionManager;
|
||||
/** Should be accessible only to the main thread. */
|
||||
private Map<Integer, TelephonyManager> mSubIdTelephonyManagerMap = new HashMap<>();
|
||||
/** Should be accessible only to the main thread. */
|
||||
private Map<Integer, TelephonyCallback> mSubIdTelephonyCallbackMap = new HashMap<>();
|
||||
private TelephonyManager mTelephonyManager;
|
||||
private ConnectivityManager mConnectivityManager;
|
||||
private CarrierConfigTracker mCarrierConfigTracker;
|
||||
private TelephonyDisplayInfo mTelephonyDisplayInfo =
|
||||
new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_UNKNOWN,
|
||||
TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE);
|
||||
private Handler mHandler;
|
||||
private Handler mWorkerHandler;
|
||||
private MobileMappings.Config mConfig = null;
|
||||
@@ -190,8 +197,6 @@ public class InternetDialogController implements AccessPointController.AccessPoi
|
||||
@VisibleForTesting
|
||||
protected SubscriptionManager.OnSubscriptionsChangedListener mOnSubscriptionsChangedListener;
|
||||
@VisibleForTesting
|
||||
protected InternetTelephonyCallback mInternetTelephonyCallback;
|
||||
@VisibleForTesting
|
||||
protected WifiUtils.InternetIconInjector mWifiIconInjector;
|
||||
@VisibleForTesting
|
||||
protected boolean mCanConfigWifi;
|
||||
@@ -290,8 +295,10 @@ public class InternetDialogController implements AccessPointController.AccessPoi
|
||||
mConfig = MobileMappings.Config.readConfig(mContext);
|
||||
mTelephonyManager = mTelephonyManager.createForSubscriptionId(mDefaultDataSubId);
|
||||
mSubIdTelephonyManagerMap.put(mDefaultDataSubId, mTelephonyManager);
|
||||
mInternetTelephonyCallback = new InternetTelephonyCallback();
|
||||
mTelephonyManager.registerTelephonyCallback(mExecutor, mInternetTelephonyCallback);
|
||||
InternetTelephonyCallback telephonyCallback =
|
||||
new InternetTelephonyCallback(mDefaultDataSubId);
|
||||
mSubIdTelephonyCallbackMap.put(mDefaultDataSubId, telephonyCallback);
|
||||
mTelephonyManager.registerTelephonyCallback(mExecutor, telephonyCallback);
|
||||
// Listen the connectivity changes
|
||||
mConnectivityManager.registerDefaultNetworkCallback(mConnectivityManagerNetworkCallback);
|
||||
mCanConfigWifi = canConfigWifi;
|
||||
@@ -304,7 +311,12 @@ public class InternetDialogController implements AccessPointController.AccessPoi
|
||||
}
|
||||
mBroadcastDispatcher.unregisterReceiver(mConnectionStateReceiver);
|
||||
for (TelephonyManager tm : mSubIdTelephonyManagerMap.values()) {
|
||||
tm.unregisterTelephonyCallback(mInternetTelephonyCallback);
|
||||
TelephonyCallback callback = mSubIdTelephonyCallbackMap.get(tm.getSubscriptionId());
|
||||
if (callback != null) {
|
||||
tm.unregisterTelephonyCallback(callback);
|
||||
} else if (DEBUG) {
|
||||
Log.e(TAG, "Unexpected null telephony call back for Sub " + tm.getSubscriptionId());
|
||||
}
|
||||
}
|
||||
mSubscriptionManager.removeOnSubscriptionsChangedListener(
|
||||
mOnSubscriptionsChangedListener);
|
||||
@@ -623,7 +635,9 @@ public class InternetDialogController implements AccessPointController.AccessPoi
|
||||
int subId = subInfo.getSubscriptionId();
|
||||
if (mSubIdTelephonyManagerMap.get(subId) == null) {
|
||||
TelephonyManager secondaryTm = mTelephonyManager.createForSubscriptionId(subId);
|
||||
secondaryTm.registerTelephonyCallback(mExecutor, mInternetTelephonyCallback);
|
||||
InternetTelephonyCallback telephonyCallback = new InternetTelephonyCallback(subId);
|
||||
secondaryTm.registerTelephonyCallback(mExecutor, telephonyCallback);
|
||||
mSubIdTelephonyCallbackMap.put(subId, telephonyCallback);
|
||||
mSubIdTelephonyManagerMap.put(subId, secondaryTm);
|
||||
}
|
||||
return subId;
|
||||
@@ -637,8 +651,7 @@ public class InternetDialogController implements AccessPointController.AccessPoi
|
||||
}
|
||||
|
||||
String getMobileNetworkSummary(int subId) {
|
||||
String description = getNetworkTypeDescription(mContext, mConfig,
|
||||
mTelephonyDisplayInfo, subId);
|
||||
String description = getNetworkTypeDescription(mContext, mConfig, subId);
|
||||
return getMobileSummary(mContext, description, subId);
|
||||
}
|
||||
|
||||
@@ -646,7 +659,9 @@ public class InternetDialogController implements AccessPointController.AccessPoi
|
||||
* Get currently description of mobile network type.
|
||||
*/
|
||||
private String getNetworkTypeDescription(Context context, MobileMappings.Config config,
|
||||
TelephonyDisplayInfo telephonyDisplayInfo, int subId) {
|
||||
int subId) {
|
||||
TelephonyDisplayInfo telephonyDisplayInfo =
|
||||
mSubIdTelephonyDisplayInfoMap.getOrDefault(subId, DEFAULT_TELEPHONY_DISPLAY_INFO);
|
||||
String iconKey = getIconKey(telephonyDisplayInfo);
|
||||
|
||||
if (mapIconSets(config) == null || mapIconSets(config).get(iconKey) == null) {
|
||||
@@ -725,11 +740,10 @@ public class InternetDialogController implements AccessPointController.AccessPoi
|
||||
|
||||
Intent getSubSettingIntent(int subId) {
|
||||
final Intent intent = new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS);
|
||||
|
||||
final Bundle fragmentArgs = new Bundle();
|
||||
// Special contract for Settings to highlight permission row
|
||||
fragmentArgs.putString(SETTINGS_EXTRA_FRAGMENT_ARG_KEY, AUTO_DATA_SWITCH_SETTING_R_ID);
|
||||
fragmentArgs.putInt(Settings.EXTRA_SUB_ID, subId);
|
||||
intent.putExtra(Settings.EXTRA_SUB_ID, subId);
|
||||
intent.putExtra(SETTINGS_EXTRA_SHOW_FRAGMENT_ARGUMENTS, fragmentArgs);
|
||||
return intent;
|
||||
}
|
||||
@@ -1054,6 +1068,11 @@ public class InternetDialogController implements AccessPointController.AccessPoi
|
||||
TelephonyCallback.SignalStrengthsListener,
|
||||
TelephonyCallback.UserMobileDataStateListener {
|
||||
|
||||
private final int mSubId;
|
||||
private InternetTelephonyCallback(int subId) {
|
||||
mSubId = subId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceStateChanged(@NonNull ServiceState serviceState) {
|
||||
mCallback.onServiceStateChanged(serviceState);
|
||||
@@ -1071,7 +1090,7 @@ public class InternetDialogController implements AccessPointController.AccessPoi
|
||||
|
||||
@Override
|
||||
public void onDisplayInfoChanged(@NonNull TelephonyDisplayInfo telephonyDisplayInfo) {
|
||||
mTelephonyDisplayInfo = telephonyDisplayInfo;
|
||||
mSubIdTelephonyDisplayInfoMap.put(mSubId, telephonyDisplayInfo);
|
||||
mCallback.onDisplayInfoChanged(telephonyDisplayInfo);
|
||||
}
|
||||
|
||||
@@ -1196,19 +1215,30 @@ public class InternetDialogController implements AccessPointController.AccessPoi
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
mDefaultDataSubId = defaultDataSubId;
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "DDS: defaultDataSubId:" + mDefaultDataSubId);
|
||||
Log.d(TAG, "DDS: defaultDataSubId:" + defaultDataSubId);
|
||||
}
|
||||
if (SubscriptionManager.isUsableSubscriptionId(mDefaultDataSubId)) {
|
||||
mTelephonyManager.unregisterTelephonyCallback(mInternetTelephonyCallback);
|
||||
mTelephonyManager = mTelephonyManager.createForSubscriptionId(mDefaultDataSubId);
|
||||
mSubIdTelephonyManagerMap.put(mDefaultDataSubId, mTelephonyManager);
|
||||
mTelephonyManager.registerTelephonyCallback(mHandler::post,
|
||||
mInternetTelephonyCallback);
|
||||
mCallback.onSubscriptionsChanged(mDefaultDataSubId);
|
||||
if (SubscriptionManager.isUsableSubscriptionId(defaultDataSubId)) {
|
||||
// clean up old defaultDataSubId
|
||||
TelephonyCallback oldCallback = mSubIdTelephonyCallbackMap.get(mDefaultDataSubId);
|
||||
if (oldCallback != null) {
|
||||
mTelephonyManager.unregisterTelephonyCallback(oldCallback);
|
||||
} else if (DEBUG) {
|
||||
Log.e(TAG, "Unexpected null telephony call back for Sub " + mDefaultDataSubId);
|
||||
}
|
||||
mSubIdTelephonyCallbackMap.remove(mDefaultDataSubId);
|
||||
mSubIdTelephonyDisplayInfoMap.remove(mDefaultDataSubId);
|
||||
mSubIdTelephonyManagerMap.remove(mDefaultDataSubId);
|
||||
|
||||
// create for new defaultDataSubId
|
||||
mTelephonyManager = mTelephonyManager.createForSubscriptionId(defaultDataSubId);
|
||||
mSubIdTelephonyManagerMap.put(defaultDataSubId, mTelephonyManager);
|
||||
InternetTelephonyCallback newCallback = new InternetTelephonyCallback(defaultDataSubId);
|
||||
mSubIdTelephonyCallbackMap.put(defaultDataSubId, newCallback);
|
||||
mTelephonyManager.registerTelephonyCallback(mHandler::post, newCallback);
|
||||
mCallback.onSubscriptionsChanged(defaultDataSubId);
|
||||
}
|
||||
mDefaultDataSubId = defaultDataSubId;
|
||||
}
|
||||
|
||||
public WifiUtils.InternetIconInjector getWifiIconInjector() {
|
||||
|
||||
@@ -31,6 +31,7 @@ import static org.mockito.Mockito.when;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.ConnectivityManager;
|
||||
@@ -40,6 +41,7 @@ import android.telephony.ServiceState;
|
||||
import android.telephony.SignalStrength;
|
||||
import android.telephony.SubscriptionInfo;
|
||||
import android.telephony.SubscriptionManager;
|
||||
import android.telephony.TelephonyDisplayInfo;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.testing.AndroidTestingRunner;
|
||||
import android.testing.TestableLooper;
|
||||
@@ -85,6 +87,7 @@ import org.mockito.quality.Strictness;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@SmallTest
|
||||
@RunWith(AndroidTestingRunner.class)
|
||||
@@ -753,15 +756,34 @@ public class InternetDialogControllerTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void getMobileNetworkSummary() {
|
||||
mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true);
|
||||
Resources res1 = mock(Resources.class);
|
||||
doReturn("EDGE").when(res1).getString(anyInt());
|
||||
Resources res2 = mock(Resources.class);
|
||||
doReturn("LTE").when(res2).getString(anyInt());
|
||||
when(SubscriptionManager.getResourcesForSubId(any(), eq(SUB_ID))).thenReturn(res1);
|
||||
when(SubscriptionManager.getResourcesForSubId(any(), eq(SUB_ID2))).thenReturn(res2);
|
||||
|
||||
InternetDialogController spyController = spy(mInternetDialogController);
|
||||
Map<Integer, TelephonyDisplayInfo> mSubIdTelephonyDisplayInfoMap =
|
||||
spyController.mSubIdTelephonyDisplayInfoMap;
|
||||
TelephonyDisplayInfo info1 = new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_EDGE,
|
||||
TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE);
|
||||
TelephonyDisplayInfo info2 = new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_LTE,
|
||||
TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE);
|
||||
|
||||
mSubIdTelephonyDisplayInfoMap.put(SUB_ID, info1);
|
||||
mSubIdTelephonyDisplayInfoMap.put(SUB_ID2, info2);
|
||||
|
||||
doReturn(SUB_ID2).when(spyController).getActiveAutoSwitchNonDdsSubId();
|
||||
doReturn(true).when(spyController).isMobileDataEnabled();
|
||||
doReturn(true).when(spyController).activeNetworkIsCellular();
|
||||
String dds = spyController.getMobileNetworkSummary(SUB_ID);
|
||||
String nonDds = spyController.getMobileNetworkSummary(SUB_ID2);
|
||||
|
||||
String ddsNetworkType = dds.split("/")[1];
|
||||
String nonDdsNetworkType = nonDds.split("/")[1];
|
||||
assertThat(dds).contains(mContext.getString(R.string.mobile_data_poor_connection));
|
||||
assertThat(dds).isNotEqualTo(nonDds);
|
||||
assertThat(ddsNetworkType).isNotEqualTo(nonDdsNetworkType);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user