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);