Loading src/com/android/settings/network/ActiveSubsciptionsListener.java 0 → 100644 +205 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.network; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.text.TextUtils; import androidx.annotation.VisibleForTesting; import com.android.internal.telephony.TelephonyIntents; import java.util.List; /** * A listener for active subscription change */ public abstract class ActiveSubsciptionsListener extends SubscriptionManager.OnSubscriptionsChangedListener { /** * Constructor * * @param context of this listener */ public ActiveSubsciptionsListener(Context context) { mContext = context; mSubscriptionChangeIntentFilter = new IntentFilter(); mSubscriptionChangeIntentFilter.addAction( CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); mSubscriptionChangeIntentFilter.addAction( TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED); mSubscriptionChangeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (isInitialStickyBroadcast()) { return; } final String action = intent.getAction(); if (TextUtils.isEmpty(action)) { return; } if (CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED.equals(action)) { final int subId = intent.getIntExtra( CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX, SubscriptionManager.INVALID_SUBSCRIPTION_ID); if (!clearCachedSubId(subId)) { return; } } onSubscriptionsChanged(); } }; } private Context mContext; private boolean mIsMonitoringDataChange; private boolean mIsCachedDataAvailable; private SubscriptionManager mSubscriptionManager; private IntentFilter mSubscriptionChangeIntentFilter; @VisibleForTesting BroadcastReceiver mSubscriptionChangeReceiver; private List<SubscriptionInfo> mCachedActiveSubscriptionInfo; /** * Active subscriptions got changed */ public abstract void onChanged(); @Override public void onSubscriptionsChanged() { // clear value in cache clearCache(); listenerNotify(); } /** * Start listening subscriptions change */ public void start() { monitorSubscriptionsChange(true); } /** * Stop listening subscriptions change */ public void stop() { monitorSubscriptionsChange(false); } /** * Get SubscriptionManager * * @return a SubscriptionManager */ public SubscriptionManager getSubscriptionManager() { if (mSubscriptionManager == null) { mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class); } return mSubscriptionManager; } /** * Get a list of active subscription info * * @return A list of active subscription info */ public List<SubscriptionInfo> getActiveSubscriptionsInfo() { if (mIsCachedDataAvailable) { return mCachedActiveSubscriptionInfo; } mIsCachedDataAvailable = true; mCachedActiveSubscriptionInfo = getSubscriptionManager().getActiveSubscriptionInfoList(); return mCachedActiveSubscriptionInfo; } /** * Get an active subscription info with given subscription ID * * @param subId target subscription ID * @return A subscription info which is active list */ public SubscriptionInfo getActiveSubscriptionInfo(int subId) { final List<SubscriptionInfo> subInfoList = getActiveSubscriptionsInfo(); if (subInfoList == null) { return null; } for (SubscriptionInfo subInfo : subInfoList) { if (subInfo.getSubscriptionId() == subId) { return subInfo; } } return null; } /** * Clear data cached within listener */ public void clearCache() { mIsCachedDataAvailable = false; mCachedActiveSubscriptionInfo = null; } private void monitorSubscriptionsChange(boolean on) { if (mIsMonitoringDataChange == on) { return; } mIsMonitoringDataChange = on; if (on) { mContext.registerReceiver(mSubscriptionChangeReceiver, mSubscriptionChangeIntentFilter); getSubscriptionManager().addOnSubscriptionsChangedListener(this); listenerNotify(); } else { mContext.unregisterReceiver(mSubscriptionChangeReceiver); getSubscriptionManager().removeOnSubscriptionsChangedListener(this); clearCache(); } } private void listenerNotify() { if (!mIsMonitoringDataChange) { return; } onChanged(); } private boolean clearCachedSubId(int subId) { if ((!mIsCachedDataAvailable) || (mCachedActiveSubscriptionInfo == null)) { return false; } for (SubscriptionInfo subInfo : mCachedActiveSubscriptionInfo) { if (subInfo.getSubscriptionId() == subId) { clearCache(); return true; } } return false; } } src/com/android/settings/network/telephony/MobileNetworkActivity.java +71 −140 Original line number Diff line number Diff line Loading @@ -17,16 +17,11 @@ package com.android.settings.network.telephony; import android.app.ActionBar; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.os.UserManager; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.view.Menu; import android.view.View; Loading @@ -36,20 +31,20 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.util.CollectionUtils; import com.android.settings.R; import com.android.settings.core.FeatureFlags; import com.android.settings.core.SettingsBaseActivity; import com.android.settings.development.featureflags.FeatureFlagPersistent; import com.android.settings.network.SubscriptionUtil; import com.android.settings.network.ActiveSubsciptionsListener; import com.google.android.material.bottomnavigation.BottomNavigationView; import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * Activity for displaying MobileNetworkSettings */ public class MobileNetworkActivity extends SettingsBaseActivity { private static final String TAG = "MobileNetworkActivity"; Loading @@ -58,31 +53,21 @@ public class MobileNetworkActivity extends SettingsBaseActivity { @VisibleForTesting static final int SUB_ID_NULL = Integer.MIN_VALUE; @VisibleForTesting SubscriptionManager mSubscriptionManager; @VisibleForTesting int mCurSubscriptionId; @VisibleForTesting List<SubscriptionInfo> mSubscriptionInfos = new ArrayList<>(); private PhoneChangeReceiver mPhoneChangeReceiver; private final SubscriptionManager.OnSubscriptionsChangedListener mOnSubscriptionsChangeListener = new SubscriptionManager.OnSubscriptionsChangedListener() { @Override public void onSubscriptionsChanged() { if (!Objects.equals(mSubscriptionInfos, mSubscriptionManager.getActiveSubscriptionInfoList(true))) { updateSubscriptions(null); } } }; private ActiveSubsciptionsListener mSubscriptionAccess; private int mCurSubscriptionId; @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); updateSubscriptions(null); int updateSubscriptionIndex = SUB_ID_NULL; if (intent != null) { updateSubscriptionIndex = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL); } mCurSubscriptionId = updateSubscriptionIndex; updateSubscriptions(getSubscription()); } @Override Loading @@ -91,6 +76,7 @@ public class MobileNetworkActivity extends SettingsBaseActivity { final UserManager userManager = this.getSystemService(UserManager.class); if (!userManager.isAdminUser()) { this.finish(); return; } if (FeatureFlagPersistent.isEnabled(this, FeatureFlags.NETWORK_INTERNET_V2)) { Loading @@ -99,21 +85,13 @@ public class MobileNetworkActivity extends SettingsBaseActivity { setContentView(R.layout.mobile_network_settings_container); } setActionBar(findViewById(R.id.mobile_action_bar)); mPhoneChangeReceiver = new PhoneChangeReceiver(this, new PhoneChangeReceiver.Client() { @Override public void onPhoneChange() { // When the radio or carrier config changes (ex: CDMA->GSM), refresh the fragment. switchFragment(new MobileNetworkSettings(), mCurSubscriptionId, true /* forceUpdate */); } @Override public int getSubscriptionId() { return mCurSubscriptionId; mSubscriptionAccess = new ActiveSubsciptionsListener(this) { public void onChanged() { updateSubscriptions(getSubscription()); } }); mSubscriptionManager = getSystemService(SubscriptionManager.class); mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList(true); }; mCurSubscriptionId = savedInstanceState != null ? savedInstanceState.getInt(Settings.EXTRA_SUB_ID, SUB_ID_NULL) : SUB_ID_NULL; Loading @@ -123,21 +101,21 @@ public class MobileNetworkActivity extends SettingsBaseActivity { actionBar.setDisplayHomeAsUpEnabled(true); } updateSubscriptions(savedInstanceState); final SubscriptionInfo subscription = getSubscription(); updateTitleAndNavigation(subscription); } @Override protected void onStart() { super.onStart(); mPhoneChangeReceiver.register(); mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); mSubscriptionAccess.start(); updateSubscriptions(getSubscription()); } @Override protected void onStop() { super.onStop(); mPhoneChangeReceiver.unregister(); mSubscriptionManager.removeOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); mSubscriptionAccess.stop(); } @Override Loading @@ -151,25 +129,30 @@ public class MobileNetworkActivity extends SettingsBaseActivity { outState.putInt(Settings.EXTRA_SUB_ID, mCurSubscriptionId); } @VisibleForTesting void updateSubscriptions(Bundle savedInstanceState) { private void updateTitleAndNavigation(SubscriptionInfo subscription) { // Set the title to the name of the subscription. If we don't have subscription info, the // title will just default to the label for this activity that's already specified in // AndroidManifest.xml. final SubscriptionInfo subscription = getSubscription(); if (subscription != null) { setTitle(subscription.getDisplayName()); } mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList(true); if (!FeatureFlagPersistent.isEnabled(this, FeatureFlags.NETWORK_INTERNET_V2)) { updateBottomNavigationView(); } } if (savedInstanceState == null) { switchFragment(new MobileNetworkSettings(), getSubscriptionId()); @VisibleForTesting void updateSubscriptions(SubscriptionInfo subscription) { if (subscription == null) { return; } final int subscriptionIndex = subscription.getSubscriptionId(); updateTitleAndNavigation(subscription); switchFragment(subscription); mCurSubscriptionId = subscriptionIndex; } /** Loading @@ -179,125 +162,73 @@ public class MobileNetworkActivity extends SettingsBaseActivity { */ @VisibleForTesting SubscriptionInfo getSubscription() { final Intent intent = getIntent(); if (intent != null) { final int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL); if (subId != SUB_ID_NULL) { for (SubscriptionInfo subscription : SubscriptionUtil.getAvailableSubscriptions(this)) { if (subscription.getSubscriptionId() == subId) { return subscription; } if (mCurSubscriptionId != SUB_ID_NULL) { final SubscriptionInfo subInfo = mSubscriptionAccess.getActiveSubscriptionInfo(mCurSubscriptionId); if (subInfo != null) { return subInfo; } } } if (CollectionUtils.isEmpty(mSubscriptionInfos)) { final List<SubscriptionInfo> subInfos = mSubscriptionAccess.getActiveSubscriptionsInfo(); if (CollectionUtils.isEmpty(subInfos)) { return null; } return mSubscriptionInfos.get(0); return subInfos.get(0); } /** * Get the current subId to display. */ @VisibleForTesting int getSubscriptionId() { final SubscriptionInfo subscription = getSubscription(); if (subscription != null) { return subscription.getSubscriptionId(); } return SubscriptionManager.INVALID_SUBSCRIPTION_ID; } @VisibleForTesting void updateBottomNavigationView() { private void updateBottomNavigationView() { final BottomNavigationView navigation = findViewById(R.id.bottom_nav); if (CollectionUtils.size(mSubscriptionInfos) <= 1) { final List<SubscriptionInfo> subInfos = mSubscriptionAccess.getActiveSubscriptionsInfo(); if (CollectionUtils.size(subInfos) <= 1) { navigation.setVisibility(View.GONE); } else { final Menu menu = navigation.getMenu(); menu.clear(); for (int i = 0, size = mSubscriptionInfos.size(); i < size; i++) { final SubscriptionInfo subscriptionInfo = mSubscriptionInfos.get(i); for (int i = 0, size = subInfos.size(); i < size; i++) { final SubscriptionInfo subscriptionInfo = subInfos.get(i); menu.add(0, subscriptionInfo.getSubscriptionId(), i, subscriptionInfo.getDisplayName()) .setIcon(R.drawable.ic_settings_sim); } navigation.setOnNavigationItemSelectedListener(item -> { switchFragment(new MobileNetworkSettings(), item.getItemId()); final int subId = item.getItemId(); if (!isSubscriptionChanged(subId)) { return true; } final SubscriptionInfo subscriptionInfo = mSubscriptionAccess .getActiveSubscriptionInfo(subId); if (subscriptionInfo == null) { return true; }); } updateSubscriptions(subscriptionInfo); return true; }); navigation.setVisibility(View.VISIBLE); } @VisibleForTesting void switchFragment(Fragment fragment, int subscriptionId) { switchFragment(fragment, subscriptionId, false /* forceUpdate */); } @VisibleForTesting void switchFragment(Fragment fragment, int subscriptionId, boolean forceUpdate) { if (mCurSubscriptionId != SUB_ID_NULL && subscriptionId == mCurSubscriptionId && !forceUpdate) { return; } void switchFragment(SubscriptionInfo subInfo) { final FragmentManager fragmentManager = getSupportFragmentManager(); final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); final int subId = subInfo.getSubscriptionId(); final Bundle bundle = new Bundle(); bundle.putInt(Settings.EXTRA_SUB_ID, subscriptionId); bundle.putInt(Settings.EXTRA_SUB_ID, subId); final Fragment fragment = new MobileNetworkSettings(); fragment.setArguments(bundle); fragmentTransaction.replace(R.id.main_content, fragment, buildFragmentTag(subscriptionId)); fragmentTransaction.replace(R.id.main_content, fragment, buildFragmentTag(subId)); fragmentTransaction.commit(); mCurSubscriptionId = subscriptionId; } private String buildFragmentTag(int subscriptionId) { return MOBILE_SETTINGS_TAG + subscriptionId; } @VisibleForTesting static class PhoneChangeReceiver extends BroadcastReceiver { private Context mContext; private Client mClient; interface Client { void onPhoneChange(); int getSubscriptionId(); } public PhoneChangeReceiver(Context context, Client client) { mContext = context; mClient = client; } public void register() { final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED); intentFilter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); mContext.registerReceiver(this, intentFilter); } public void unregister() { mContext.unregisterReceiver(this); String buildFragmentTag(int subscriptionId) { return MOBILE_SETTINGS_TAG + subscriptionId; } @Override public void onReceive(Context context, Intent intent) { if (isInitialStickyBroadcast()) { return; } if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { if (!intent.hasExtra(CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX) || intent.getIntExtra(CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX, -1) != mClient.getSubscriptionId()) { return; } } mClient.onPhoneChange(); } private boolean isSubscriptionChanged(int subscriptionId) { return (subscriptionId == SUB_ID_NULL) || (subscriptionId != mCurSubscriptionId); } } tests/robotests/Android.bp +4 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,9 @@ android_app { "androidx-constraintlayout_constraintlayout-solver", "androidx.lifecycle_lifecycle-runtime", "androidx.lifecycle_lifecycle-extensions", "androidx.test.core", "androidx.test.runner", "androidx.test.ext.junit", "guava", "jsr305", "settings-contextual-card-protos-lite", Loading Loading @@ -61,7 +64,7 @@ android_robolectric_test { "SettingsLib-robo-testutils", ], java_resource_dirs: ["config"], java_resource_dirs: ["config", "resources"], instrumentation_for: "SettingsRoboTestStub", Loading tests/robotests/resources/META-INF/services/androidx.test.internal.platform.ThreadChecker 0 → 100644 +1 −0 Original line number Diff line number Diff line org.robolectric.android.internal.NoOpThreadChecker tests/robotests/resources/META-INF/services/androidx.test.internal.platform.app.ActivityInvoker 0 → 100644 +1 −0 Original line number Diff line number Diff line org.robolectric.android.internal.LocalActivityInvoker Loading
src/com/android/settings/network/ActiveSubsciptionsListener.java 0 → 100644 +205 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.network; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.text.TextUtils; import androidx.annotation.VisibleForTesting; import com.android.internal.telephony.TelephonyIntents; import java.util.List; /** * A listener for active subscription change */ public abstract class ActiveSubsciptionsListener extends SubscriptionManager.OnSubscriptionsChangedListener { /** * Constructor * * @param context of this listener */ public ActiveSubsciptionsListener(Context context) { mContext = context; mSubscriptionChangeIntentFilter = new IntentFilter(); mSubscriptionChangeIntentFilter.addAction( CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); mSubscriptionChangeIntentFilter.addAction( TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED); mSubscriptionChangeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (isInitialStickyBroadcast()) { return; } final String action = intent.getAction(); if (TextUtils.isEmpty(action)) { return; } if (CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED.equals(action)) { final int subId = intent.getIntExtra( CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX, SubscriptionManager.INVALID_SUBSCRIPTION_ID); if (!clearCachedSubId(subId)) { return; } } onSubscriptionsChanged(); } }; } private Context mContext; private boolean mIsMonitoringDataChange; private boolean mIsCachedDataAvailable; private SubscriptionManager mSubscriptionManager; private IntentFilter mSubscriptionChangeIntentFilter; @VisibleForTesting BroadcastReceiver mSubscriptionChangeReceiver; private List<SubscriptionInfo> mCachedActiveSubscriptionInfo; /** * Active subscriptions got changed */ public abstract void onChanged(); @Override public void onSubscriptionsChanged() { // clear value in cache clearCache(); listenerNotify(); } /** * Start listening subscriptions change */ public void start() { monitorSubscriptionsChange(true); } /** * Stop listening subscriptions change */ public void stop() { monitorSubscriptionsChange(false); } /** * Get SubscriptionManager * * @return a SubscriptionManager */ public SubscriptionManager getSubscriptionManager() { if (mSubscriptionManager == null) { mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class); } return mSubscriptionManager; } /** * Get a list of active subscription info * * @return A list of active subscription info */ public List<SubscriptionInfo> getActiveSubscriptionsInfo() { if (mIsCachedDataAvailable) { return mCachedActiveSubscriptionInfo; } mIsCachedDataAvailable = true; mCachedActiveSubscriptionInfo = getSubscriptionManager().getActiveSubscriptionInfoList(); return mCachedActiveSubscriptionInfo; } /** * Get an active subscription info with given subscription ID * * @param subId target subscription ID * @return A subscription info which is active list */ public SubscriptionInfo getActiveSubscriptionInfo(int subId) { final List<SubscriptionInfo> subInfoList = getActiveSubscriptionsInfo(); if (subInfoList == null) { return null; } for (SubscriptionInfo subInfo : subInfoList) { if (subInfo.getSubscriptionId() == subId) { return subInfo; } } return null; } /** * Clear data cached within listener */ public void clearCache() { mIsCachedDataAvailable = false; mCachedActiveSubscriptionInfo = null; } private void monitorSubscriptionsChange(boolean on) { if (mIsMonitoringDataChange == on) { return; } mIsMonitoringDataChange = on; if (on) { mContext.registerReceiver(mSubscriptionChangeReceiver, mSubscriptionChangeIntentFilter); getSubscriptionManager().addOnSubscriptionsChangedListener(this); listenerNotify(); } else { mContext.unregisterReceiver(mSubscriptionChangeReceiver); getSubscriptionManager().removeOnSubscriptionsChangedListener(this); clearCache(); } } private void listenerNotify() { if (!mIsMonitoringDataChange) { return; } onChanged(); } private boolean clearCachedSubId(int subId) { if ((!mIsCachedDataAvailable) || (mCachedActiveSubscriptionInfo == null)) { return false; } for (SubscriptionInfo subInfo : mCachedActiveSubscriptionInfo) { if (subInfo.getSubscriptionId() == subId) { clearCache(); return true; } } return false; } }
src/com/android/settings/network/telephony/MobileNetworkActivity.java +71 −140 Original line number Diff line number Diff line Loading @@ -17,16 +17,11 @@ package com.android.settings.network.telephony; import android.app.ActionBar; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.os.UserManager; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.view.Menu; import android.view.View; Loading @@ -36,20 +31,20 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.util.CollectionUtils; import com.android.settings.R; import com.android.settings.core.FeatureFlags; import com.android.settings.core.SettingsBaseActivity; import com.android.settings.development.featureflags.FeatureFlagPersistent; import com.android.settings.network.SubscriptionUtil; import com.android.settings.network.ActiveSubsciptionsListener; import com.google.android.material.bottomnavigation.BottomNavigationView; import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * Activity for displaying MobileNetworkSettings */ public class MobileNetworkActivity extends SettingsBaseActivity { private static final String TAG = "MobileNetworkActivity"; Loading @@ -58,31 +53,21 @@ public class MobileNetworkActivity extends SettingsBaseActivity { @VisibleForTesting static final int SUB_ID_NULL = Integer.MIN_VALUE; @VisibleForTesting SubscriptionManager mSubscriptionManager; @VisibleForTesting int mCurSubscriptionId; @VisibleForTesting List<SubscriptionInfo> mSubscriptionInfos = new ArrayList<>(); private PhoneChangeReceiver mPhoneChangeReceiver; private final SubscriptionManager.OnSubscriptionsChangedListener mOnSubscriptionsChangeListener = new SubscriptionManager.OnSubscriptionsChangedListener() { @Override public void onSubscriptionsChanged() { if (!Objects.equals(mSubscriptionInfos, mSubscriptionManager.getActiveSubscriptionInfoList(true))) { updateSubscriptions(null); } } }; private ActiveSubsciptionsListener mSubscriptionAccess; private int mCurSubscriptionId; @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); updateSubscriptions(null); int updateSubscriptionIndex = SUB_ID_NULL; if (intent != null) { updateSubscriptionIndex = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL); } mCurSubscriptionId = updateSubscriptionIndex; updateSubscriptions(getSubscription()); } @Override Loading @@ -91,6 +76,7 @@ public class MobileNetworkActivity extends SettingsBaseActivity { final UserManager userManager = this.getSystemService(UserManager.class); if (!userManager.isAdminUser()) { this.finish(); return; } if (FeatureFlagPersistent.isEnabled(this, FeatureFlags.NETWORK_INTERNET_V2)) { Loading @@ -99,21 +85,13 @@ public class MobileNetworkActivity extends SettingsBaseActivity { setContentView(R.layout.mobile_network_settings_container); } setActionBar(findViewById(R.id.mobile_action_bar)); mPhoneChangeReceiver = new PhoneChangeReceiver(this, new PhoneChangeReceiver.Client() { @Override public void onPhoneChange() { // When the radio or carrier config changes (ex: CDMA->GSM), refresh the fragment. switchFragment(new MobileNetworkSettings(), mCurSubscriptionId, true /* forceUpdate */); } @Override public int getSubscriptionId() { return mCurSubscriptionId; mSubscriptionAccess = new ActiveSubsciptionsListener(this) { public void onChanged() { updateSubscriptions(getSubscription()); } }); mSubscriptionManager = getSystemService(SubscriptionManager.class); mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList(true); }; mCurSubscriptionId = savedInstanceState != null ? savedInstanceState.getInt(Settings.EXTRA_SUB_ID, SUB_ID_NULL) : SUB_ID_NULL; Loading @@ -123,21 +101,21 @@ public class MobileNetworkActivity extends SettingsBaseActivity { actionBar.setDisplayHomeAsUpEnabled(true); } updateSubscriptions(savedInstanceState); final SubscriptionInfo subscription = getSubscription(); updateTitleAndNavigation(subscription); } @Override protected void onStart() { super.onStart(); mPhoneChangeReceiver.register(); mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); mSubscriptionAccess.start(); updateSubscriptions(getSubscription()); } @Override protected void onStop() { super.onStop(); mPhoneChangeReceiver.unregister(); mSubscriptionManager.removeOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); mSubscriptionAccess.stop(); } @Override Loading @@ -151,25 +129,30 @@ public class MobileNetworkActivity extends SettingsBaseActivity { outState.putInt(Settings.EXTRA_SUB_ID, mCurSubscriptionId); } @VisibleForTesting void updateSubscriptions(Bundle savedInstanceState) { private void updateTitleAndNavigation(SubscriptionInfo subscription) { // Set the title to the name of the subscription. If we don't have subscription info, the // title will just default to the label for this activity that's already specified in // AndroidManifest.xml. final SubscriptionInfo subscription = getSubscription(); if (subscription != null) { setTitle(subscription.getDisplayName()); } mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList(true); if (!FeatureFlagPersistent.isEnabled(this, FeatureFlags.NETWORK_INTERNET_V2)) { updateBottomNavigationView(); } } if (savedInstanceState == null) { switchFragment(new MobileNetworkSettings(), getSubscriptionId()); @VisibleForTesting void updateSubscriptions(SubscriptionInfo subscription) { if (subscription == null) { return; } final int subscriptionIndex = subscription.getSubscriptionId(); updateTitleAndNavigation(subscription); switchFragment(subscription); mCurSubscriptionId = subscriptionIndex; } /** Loading @@ -179,125 +162,73 @@ public class MobileNetworkActivity extends SettingsBaseActivity { */ @VisibleForTesting SubscriptionInfo getSubscription() { final Intent intent = getIntent(); if (intent != null) { final int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL); if (subId != SUB_ID_NULL) { for (SubscriptionInfo subscription : SubscriptionUtil.getAvailableSubscriptions(this)) { if (subscription.getSubscriptionId() == subId) { return subscription; } if (mCurSubscriptionId != SUB_ID_NULL) { final SubscriptionInfo subInfo = mSubscriptionAccess.getActiveSubscriptionInfo(mCurSubscriptionId); if (subInfo != null) { return subInfo; } } } if (CollectionUtils.isEmpty(mSubscriptionInfos)) { final List<SubscriptionInfo> subInfos = mSubscriptionAccess.getActiveSubscriptionsInfo(); if (CollectionUtils.isEmpty(subInfos)) { return null; } return mSubscriptionInfos.get(0); return subInfos.get(0); } /** * Get the current subId to display. */ @VisibleForTesting int getSubscriptionId() { final SubscriptionInfo subscription = getSubscription(); if (subscription != null) { return subscription.getSubscriptionId(); } return SubscriptionManager.INVALID_SUBSCRIPTION_ID; } @VisibleForTesting void updateBottomNavigationView() { private void updateBottomNavigationView() { final BottomNavigationView navigation = findViewById(R.id.bottom_nav); if (CollectionUtils.size(mSubscriptionInfos) <= 1) { final List<SubscriptionInfo> subInfos = mSubscriptionAccess.getActiveSubscriptionsInfo(); if (CollectionUtils.size(subInfos) <= 1) { navigation.setVisibility(View.GONE); } else { final Menu menu = navigation.getMenu(); menu.clear(); for (int i = 0, size = mSubscriptionInfos.size(); i < size; i++) { final SubscriptionInfo subscriptionInfo = mSubscriptionInfos.get(i); for (int i = 0, size = subInfos.size(); i < size; i++) { final SubscriptionInfo subscriptionInfo = subInfos.get(i); menu.add(0, subscriptionInfo.getSubscriptionId(), i, subscriptionInfo.getDisplayName()) .setIcon(R.drawable.ic_settings_sim); } navigation.setOnNavigationItemSelectedListener(item -> { switchFragment(new MobileNetworkSettings(), item.getItemId()); final int subId = item.getItemId(); if (!isSubscriptionChanged(subId)) { return true; } final SubscriptionInfo subscriptionInfo = mSubscriptionAccess .getActiveSubscriptionInfo(subId); if (subscriptionInfo == null) { return true; }); } updateSubscriptions(subscriptionInfo); return true; }); navigation.setVisibility(View.VISIBLE); } @VisibleForTesting void switchFragment(Fragment fragment, int subscriptionId) { switchFragment(fragment, subscriptionId, false /* forceUpdate */); } @VisibleForTesting void switchFragment(Fragment fragment, int subscriptionId, boolean forceUpdate) { if (mCurSubscriptionId != SUB_ID_NULL && subscriptionId == mCurSubscriptionId && !forceUpdate) { return; } void switchFragment(SubscriptionInfo subInfo) { final FragmentManager fragmentManager = getSupportFragmentManager(); final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); final int subId = subInfo.getSubscriptionId(); final Bundle bundle = new Bundle(); bundle.putInt(Settings.EXTRA_SUB_ID, subscriptionId); bundle.putInt(Settings.EXTRA_SUB_ID, subId); final Fragment fragment = new MobileNetworkSettings(); fragment.setArguments(bundle); fragmentTransaction.replace(R.id.main_content, fragment, buildFragmentTag(subscriptionId)); fragmentTransaction.replace(R.id.main_content, fragment, buildFragmentTag(subId)); fragmentTransaction.commit(); mCurSubscriptionId = subscriptionId; } private String buildFragmentTag(int subscriptionId) { return MOBILE_SETTINGS_TAG + subscriptionId; } @VisibleForTesting static class PhoneChangeReceiver extends BroadcastReceiver { private Context mContext; private Client mClient; interface Client { void onPhoneChange(); int getSubscriptionId(); } public PhoneChangeReceiver(Context context, Client client) { mContext = context; mClient = client; } public void register() { final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED); intentFilter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); mContext.registerReceiver(this, intentFilter); } public void unregister() { mContext.unregisterReceiver(this); String buildFragmentTag(int subscriptionId) { return MOBILE_SETTINGS_TAG + subscriptionId; } @Override public void onReceive(Context context, Intent intent) { if (isInitialStickyBroadcast()) { return; } if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { if (!intent.hasExtra(CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX) || intent.getIntExtra(CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX, -1) != mClient.getSubscriptionId()) { return; } } mClient.onPhoneChange(); } private boolean isSubscriptionChanged(int subscriptionId) { return (subscriptionId == SUB_ID_NULL) || (subscriptionId != mCurSubscriptionId); } }
tests/robotests/Android.bp +4 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,9 @@ android_app { "androidx-constraintlayout_constraintlayout-solver", "androidx.lifecycle_lifecycle-runtime", "androidx.lifecycle_lifecycle-extensions", "androidx.test.core", "androidx.test.runner", "androidx.test.ext.junit", "guava", "jsr305", "settings-contextual-card-protos-lite", Loading Loading @@ -61,7 +64,7 @@ android_robolectric_test { "SettingsLib-robo-testutils", ], java_resource_dirs: ["config"], java_resource_dirs: ["config", "resources"], instrumentation_for: "SettingsRoboTestStub", Loading
tests/robotests/resources/META-INF/services/androidx.test.internal.platform.ThreadChecker 0 → 100644 +1 −0 Original line number Diff line number Diff line org.robolectric.android.internal.NoOpThreadChecker
tests/robotests/resources/META-INF/services/androidx.test.internal.platform.app.ActivityInvoker 0 → 100644 +1 −0 Original line number Diff line number Diff line org.robolectric.android.internal.LocalActivityInvoker