Refesh mobile network details page on carrier config changes

In general the mobile network details page has several preference
controllers that don't listen to carrier config changes, so instead of
having each one add a listener, we instead just have one listener and
refresh the entire page when we see the broadcast.

Fixes: 135587885
Test: make RunSettingsRoboTests
Change-Id: Iff5b28dbfe12d94c901b442b23cece8e68218983
This commit is contained in:
Antony Sargent
2019-07-12 11:04:14 -07:00
parent 7c5bb0ecda
commit efa7716533
2 changed files with 72 additions and 16 deletions

View File

@@ -23,6 +23,7 @@ import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.view.Menu; import android.view.Menu;
@@ -93,13 +94,18 @@ public class MobileNetworkActivity extends SettingsBaseActivity {
setContentView(R.layout.mobile_network_settings_container); setContentView(R.layout.mobile_network_settings_container);
} }
setActionBar(findViewById(R.id.mobile_action_bar)); setActionBar(findViewById(R.id.mobile_action_bar));
mPhoneChangeReceiver = new PhoneChangeReceiver(this, () -> { mPhoneChangeReceiver = new PhoneChangeReceiver(this, new PhoneChangeReceiver.Client() {
if (mCurSubscriptionId != SUB_ID_NULL) { @Override
// When the radio changes (ex: CDMA->GSM), refresh the fragment. public void onPhoneChange() {
// This is very rare. // When the radio or carrier config changes (ex: CDMA->GSM), refresh the fragment.
switchFragment(new MobileNetworkSettings(), mCurSubscriptionId, switchFragment(new MobileNetworkSettings(), mCurSubscriptionId,
true /* forceUpdate */); true /* forceUpdate */);
} }
@Override
public int getSubscriptionId() {
return mCurSubscriptionId;
}
}); });
mSubscriptionManager = getSystemService(SubscriptionManager.class); mSubscriptionManager = getSystemService(SubscriptionManager.class);
mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList(true); mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList(true);
@@ -250,14 +256,12 @@ public class MobileNetworkActivity extends SettingsBaseActivity {
@VisibleForTesting @VisibleForTesting
static class PhoneChangeReceiver extends BroadcastReceiver { static class PhoneChangeReceiver extends BroadcastReceiver {
private static final IntentFilter RADIO_TECHNOLOGY_CHANGED_FILTER = new IntentFilter(
TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
private Context mContext; private Context mContext;
private Client mClient; private Client mClient;
interface Client { interface Client {
void onPhoneChange(); void onPhoneChange();
int getSubscriptionId();
} }
public PhoneChangeReceiver(Context context, Client client) { public PhoneChangeReceiver(Context context, Client client) {
@@ -266,7 +270,10 @@ public class MobileNetworkActivity extends SettingsBaseActivity {
} }
public void register() { public void register() {
mContext.registerReceiver(this, RADIO_TECHNOLOGY_CHANGED_FILTER); 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() { public void unregister() {
@@ -275,9 +282,17 @@ public class MobileNetworkActivity extends SettingsBaseActivity {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (!isInitialStickyBroadcast()) { 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(); mClient.onPhoneChange();
} }
} }
} }
}

View File

@@ -22,7 +22,10 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -31,6 +34,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
@@ -161,19 +165,56 @@ public class MobileNetworkActivityTest {
@Test @Test
public void phoneChangeReceiver_ignoresStickyBroadcastFromBeforeRegistering() { public void phoneChangeReceiver_ignoresStickyBroadcastFromBeforeRegistering() {
Activity activity = Robolectric.setupActivity(Activity.class); Activity activity = Robolectric.setupActivity(Activity.class);
final int[] onChangeCallbackCount = {0}; MobileNetworkActivity.PhoneChangeReceiver.Client client = mock(
MobileNetworkActivity.PhoneChangeReceiver.Client.class);
MobileNetworkActivity.PhoneChangeReceiver receiver = MobileNetworkActivity.PhoneChangeReceiver receiver =
new MobileNetworkActivity.PhoneChangeReceiver(activity, () -> { new MobileNetworkActivity.PhoneChangeReceiver(activity, client);
onChangeCallbackCount[0]++;
});
Intent intent = new Intent(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED); Intent intent = new Intent(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
activity.sendStickyBroadcast(intent); activity.sendStickyBroadcast(intent);
receiver.register(); receiver.register();
assertThat(onChangeCallbackCount[0]).isEqualTo(0); verify(client, never()).onPhoneChange();
activity.sendStickyBroadcast(intent); activity.sendStickyBroadcast(intent);
assertThat(onChangeCallbackCount[0]).isEqualTo(1); verify(client, times(1)).onPhoneChange();
}
@Test
public void phoneChangeReceiver_ignoresCarrierConfigChangeForWrongSubscriptionId() {
Activity activity = Robolectric.setupActivity(Activity.class);
MobileNetworkActivity.PhoneChangeReceiver.Client client = mock(
MobileNetworkActivity.PhoneChangeReceiver.Client.class);
doReturn(2).when(client).getSubscriptionId();
MobileNetworkActivity.PhoneChangeReceiver receiver =
new MobileNetworkActivity.PhoneChangeReceiver(activity, client);
receiver.register();
Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
intent.putExtra(CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX, 3);
activity.sendBroadcast(intent);
verify(client, never()).onPhoneChange();
}
@Test
public void phoneChangeReceiver_dispatchesCarrierConfigChangeForCorrectSubscriptionId() {
Activity activity = Robolectric.setupActivity(Activity.class);
MobileNetworkActivity.PhoneChangeReceiver.Client client = mock(
MobileNetworkActivity.PhoneChangeReceiver.Client.class);
doReturn(2).when(client).getSubscriptionId();
MobileNetworkActivity.PhoneChangeReceiver receiver =
new MobileNetworkActivity.PhoneChangeReceiver(activity, client);
receiver.register();
Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
intent.putExtra(CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX, 2);
activity.sendBroadcast(intent);
verify(client).onPhoneChange();
} }