Add a listener for subscription changes to SimDialogFragment
For some kinds of telephony changes that might happen while we're
already showing one of these dialogs, we already get sent a new intent
for the dialog which we internally convert into a refresh of the dialog
contents instead of stacking a new copy on top of the old one.
But it turns out there are some other cases where the telephony stack
doesn't send a new intent for the dialog but *does* send a change event
through the SubscriptionManager, and we want to respond to those as
well. This CL adds a listener for those events.
Fixes: 135276696
Test: make RunSettingsRoboTests
Change-Id: Ifb93ae95f45fda5831e112306dd9361ccaa5119c
(cherry picked from commit 6a1d7e60ac3593ce46c12dab0066a10149ca4aac)
diff --git a/src/com/android/settings/sim/SimDialogFragment.java b/src/com/android/settings/sim/SimDialogFragment.java
index de991ec..362fccc 100644
--- a/src/com/android/settings/sim/SimDialogFragment.java
+++ b/src/com/android/settings/sim/SimDialogFragment.java
@@ -16,20 +16,25 @@
package com.android.settings.sim;
+import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import androidx.annotation.NonNull;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.network.SubscriptionsChangeListener;
/** Common functionality for showing a dialog in SimDialogActivity. */
-public abstract class SimDialogFragment extends InstrumentedDialogFragment {
+public abstract class SimDialogFragment extends InstrumentedDialogFragment implements
+ SubscriptionsChangeListener.SubscriptionsChangeListenerClient {
private static final String TAG = "SimDialogFragment";
private static final String KEY_TITLE_ID = "title_id";
private static final String KEY_DIALOG_TYPE = "dialog_type";
+ private SubscriptionsChangeListener mChangeListener;
+
protected static Bundle initArguments(int dialogType, int titleResId) {
final Bundle args = new Bundle();
args.putInt(KEY_DIALOG_TYPE, dialogType);
@@ -46,6 +51,24 @@
}
@Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ mChangeListener = new SubscriptionsChangeListener(context, this);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mChangeListener.stop();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mChangeListener.start();
+ }
+
+ @Override
public void onDismiss(@NonNull DialogInterface dialog) {
super.onDismiss(dialog);
final SimDialogActivity activity = (SimDialogActivity) getActivity();
@@ -55,4 +78,13 @@
}
public abstract void updateDialog();
+
+ @Override
+ public void onAirplaneModeChanged(boolean airplaneModeEnabled) {
+ }
+
+ @Override
+ public void onSubscriptionsChanged() {
+ updateDialog();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/sim/SimListDialogFragmentTest.java b/tests/robotests/src/com/android/settings/sim/SimListDialogFragmentTest.java
index 2b33ebe..6a9590b 100644
--- a/tests/robotests/src/com/android/settings/sim/SimListDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/sim/SimListDialogFragmentTest.java
@@ -26,6 +26,7 @@
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.telephony.SubscriptionManager;
@@ -78,6 +79,22 @@
}
@Test
+ public void onSubscriptionsChanged_dialogUpdates() {
+ final int dialogType = DATA_PICK;
+ setDialogType(dialogType);
+ mFragment = spy(SimListDialogFragment.newInstance(dialogType, R.string.select_sim_for_data,
+ false /* includeAskEveryTime */));
+ doReturn(Arrays.asList(mSim1, mSim2)).when(mFragment).getCurrentSubscriptions();
+ // Avoid problems robolectric has with our real adapter.
+ doNothing().when(mFragment).setAdapter(any());
+ startDialog();
+ verify(mFragment).updateDialog();
+
+ mFragment.onSubscriptionsChanged();
+ verify(mFragment, times(2)).updateDialog();
+ }
+
+ @Test
public void onCreateDialog_twoSubscriptionsAskEveryTime_threeSubsForDisplay() {
final int dialogType = SMS_PICK;
setDialogType(dialogType);