Merge "Wake up/unlock device before running tests"
diff --git a/src/com/android/settings/network/SubscriptionsChangeListener.java b/src/com/android/settings/network/SubscriptionsChangeListener.java
index c3bb22b..1ecd770 100644
--- a/src/com/android/settings/network/SubscriptionsChangeListener.java
+++ b/src/com/android/settings/network/SubscriptionsChangeListener.java
@@ -59,7 +59,9 @@
         mBroadcastReceiver = new BroadcastReceiver() {
             @Override
             public void onReceive(Context context, Intent intent) {
-                subscriptionsChangedCallback();
+                if (!isInitialStickyBroadcast()) {
+                    subscriptionsChangedCallback();
+                }
             }
         };
     }
diff --git a/src/com/android/settings/network/telephony/MobileNetworkActivity.java b/src/com/android/settings/network/telephony/MobileNetworkActivity.java
index 3c0940d..47eb66b 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkActivity.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkActivity.java
@@ -85,7 +85,14 @@
             setContentView(R.layout.mobile_network_settings_container);
         }
         setActionBar(findViewById(R.id.mobile_action_bar));
-        mPhoneChangeReceiver = new PhoneChangeReceiver();
+        mPhoneChangeReceiver = new PhoneChangeReceiver(this, () -> {
+            if (mCurSubscriptionId != SUB_ID_NULL) {
+                // When the radio changes (ex: CDMA->GSM), refresh the fragment.
+                // This is very rare.
+                switchFragment(new MobileNetworkSettings(), mCurSubscriptionId,
+                        true /* forceUpdate */);
+            }
+        });
         mSubscriptionManager = getSystemService(SubscriptionManager.class);
         mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList(true);
         mCurSubscriptionId = savedInstanceState != null
@@ -103,16 +110,14 @@
     @Override
     protected void onStart() {
         super.onStart();
-        final IntentFilter intentFilter = new IntentFilter(
-                TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
-        registerReceiver(mPhoneChangeReceiver, intentFilter);
+        mPhoneChangeReceiver.register();
         mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
     }
 
     @Override
     protected void onStop() {
         super.onStop();
-        unregisterReceiver(mPhoneChangeReceiver);
+        mPhoneChangeReceiver.unregister();
         mSubscriptionManager.removeOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
     }
 
@@ -235,14 +240,35 @@
         return MOBILE_SETTINGS_TAG + subscriptionId;
     }
 
-    private class PhoneChangeReceiver extends BroadcastReceiver {
+    @VisibleForTesting
+    static class PhoneChangeReceiver extends BroadcastReceiver {
+        private static final IntentFilter RADIO_TECHNOLOGY_CHANGED_FILTER = new IntentFilter(
+                TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
+
+        private Context mContext;
+        private Client mClient;
+
+        interface Client {
+            void onPhoneChange();
+        }
+
+        public PhoneChangeReceiver(Context context, Client client) {
+            mContext = context;
+            mClient = client;
+        }
+
+        public void register() {
+            mContext.registerReceiver(this, RADIO_TECHNOLOGY_CHANGED_FILTER);
+        }
+
+        public void unregister() {
+            mContext.unregisterReceiver(this);
+        }
+
         @Override
         public void onReceive(Context context, Intent intent) {
-            // When the radio changes (ex: CDMA->GSM), refresh the fragment.
-            // This is very rare to happen.
-            if (mCurSubscriptionId != SUB_ID_NULL) {
-                switchFragment(new MobileNetworkSettings(), mCurSubscriptionId,
-                        true /* forceUpdate */);
+            if (!isInitialStickyBroadcast()) {
+                mClient.onPhoneChange();
             }
         }
     }
diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
index 2495ca5..088bfbf 100644
--- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java
+++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
@@ -132,7 +132,8 @@
     @Override
     public void onStart() {
         super.onStart();
-        mForbiddenPlmns = Arrays.asList(mTelephonyManager.getForbiddenPlmns());
+
+        updateForbiddenPlmns();
         setProgressBarVisible(true);
 
         mNetworkScanHelper.startNetworkScan(
@@ -141,6 +142,17 @@
                         : NetworkScanHelper.NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS);
     }
 
+    /**
+     * Update forbidden PLMNs from the USIM App
+     */
+    @VisibleForTesting
+    void updateForbiddenPlmns() {
+        final String[] forbiddenPlmns = mTelephonyManager.getForbiddenPlmns();
+        mForbiddenPlmns = forbiddenPlmns != null
+                ? Arrays.asList(forbiddenPlmns)
+                : new ArrayList<>();
+    }
+
     @Override
     public void onStop() {
         super.onStop();
diff --git a/src/com/android/settings/password/BiometricFragment.java b/src/com/android/settings/password/BiometricFragment.java
index 7a685ab..baefa09 100644
--- a/src/com/android/settings/password/BiometricFragment.java
+++ b/src/com/android/settings/password/BiometricFragment.java
@@ -125,7 +125,7 @@
             .setUseDefaultTitle() // use default title if title is null/empty
             .setSubtitle(mBundle.getString(BiometricPrompt.KEY_SUBTITLE))
             .setDescription(mBundle.getString(BiometricPrompt.KEY_DESCRIPTION))
-            .setRequireConfirmation(
+            .setConfirmationRequired(
                     mBundle.getBoolean(BiometricPrompt.KEY_REQUIRE_CONFIRMATION, true))
             .setNegativeButton(getResources().getString(
                     R.string.confirm_device_credential_use_alternate_method),
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index bc33f4f..01673e3 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -635,7 +635,7 @@
                     .setDescription(description);
 
             if (keyguardManager.isDeviceSecure()) {
-                builder.setAllowDeviceCredential(true);
+                builder.setDeviceCredentialAllowed(true);
             }
 
             final BiometricPrompt bp = builder.build();
diff --git a/tests/robotests/src/com/android/settings/network/SubscriptionsChangeListenerTest.java b/tests/robotests/src/com/android/settings/network/SubscriptionsChangeListenerTest.java
index 79d3fdc..9f302df 100644
--- a/tests/robotests/src/com/android/settings/network/SubscriptionsChangeListenerTest.java
+++ b/tests/robotests/src/com/android/settings/network/SubscriptionsChangeListenerTest.java
@@ -23,17 +23,20 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.Intent;
 import android.database.ContentObserver;
 import android.net.Uri;
 import android.provider.Settings;
 import android.telephony.SubscriptionManager;
 
+import com.android.internal.telephony.TelephonyIntents;
 import com.android.settings.network.SubscriptionsChangeListener.SubscriptionsChangeListenerClient;
 
 import org.junit.Before;
@@ -95,6 +98,19 @@
     }
 
     @Test
+    public void
+    onSubscriptionsChangedEvent_ignoresStickyBroadcastFromBeforeRegistering() {
+        final Intent intent = new Intent(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
+        mContext.sendStickyBroadcast(intent);
+
+        initListener(true);
+        verify(mClient, never()).onSubscriptionsChanged();
+
+        mContext.sendStickyBroadcast(intent);
+        verify(mClient, times(1)).onSubscriptionsChanged();
+    }
+
+    @Test
     public void onSubscriptionsChangedEvent_radioTechnologyChangedBroadcast_eventDeliveredToUs() {
         initListener(true);
         final ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor =
diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java
index 3b5cdf9..68f8c91 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkActivityTest.java
@@ -26,6 +26,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
@@ -35,10 +36,7 @@
 import android.view.Menu;
 import android.view.View;
 
-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.view.menu.ContextMenuBuilder;
 import com.android.settings.R;
 
@@ -56,6 +54,10 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
 @RunWith(RobolectricTestRunner.class)
 public class MobileNetworkActivityTest {
 
@@ -142,6 +144,25 @@
     }
 
     @Test
+    public void phoneChangeReceiver_ignoresStickyBroadcastFromBeforeRegistering() {
+        Activity activity = Robolectric.setupActivity(Activity.class);
+        final int[] onChangeCallbackCount = {0};
+        MobileNetworkActivity.PhoneChangeReceiver receiver =
+                new MobileNetworkActivity.PhoneChangeReceiver(activity, () -> {
+                    onChangeCallbackCount[0]++;
+                });
+        Intent intent = new Intent(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
+        activity.sendStickyBroadcast(intent);
+
+        receiver.register();
+        assertThat(onChangeCallbackCount[0]).isEqualTo(0);
+
+        activity.sendStickyBroadcast(intent);
+        assertThat(onChangeCallbackCount[0]).isEqualTo(1);
+    }
+
+
+    @Test
     public void getSubscriptionId_hasIntent_getIdFromIntent() {
         final Intent intent = new Intent();
         intent.putExtra(Settings.EXTRA_SUB_ID, CURRENT_SUB_ID);
diff --git a/tests/robotests/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java b/tests/robotests/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java
index 2aa68f7..7dfc8a3 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java
@@ -102,4 +102,12 @@
                 (NetworkOperatorPreference) mPreferenceCategory.getPreference(0);
         assertThat(preference.getCellInfo()).isEqualTo(mCellInfo2);
     }
+
+    @Test
+    public void updateForbiddenPlmns_forbiddenPlmnsNull_shouldNotCrash() {
+        when(mTelephonyManager.getForbiddenPlmns()).thenReturn(null);
+
+        // Should not Crash
+        mNetworkSelectSettings.updateForbiddenPlmns();
+    }
 }