Merge "Update Bluetooth api"
diff --git a/src/com/android/settings/CryptKeeper.java b/src/com/android/settings/CryptKeeper.java
index 05054b4..df912db 100644
--- a/src/com/android/settings/CryptKeeper.java
+++ b/src/com/android/settings/CryptKeeper.java
@@ -964,7 +964,7 @@
     }
 
     private boolean isEmergencyCallCapable() {
-        return getResources().getBoolean(com.android.internal.R.bool.config_voice_capable);
+        return getTelephonyManager().isVoiceCapable();
     }
 
     private void takeEmergencyCallAction() {
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingController.java b/src/com/android/settings/bluetooth/BluetoothPairingController.java
index 94bdfe8..a1d86be 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingController.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingController.java
@@ -294,8 +294,7 @@
         if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
             mDevice.setPairingConfirmation(true);
         } else if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN) {
-            byte[] pinBytes = BluetoothDevice.convertPinToBytes(mPasskeyFormatted);
-            mDevice.setPin(pinBytes);
+            mDevice.setPin(mPasskeyFormatted);
         }
     }
 
@@ -391,17 +390,9 @@
         switch (mType) {
             case BluetoothDevice.PAIRING_VARIANT_PIN:
             case BluetoothDevice.PAIRING_VARIANT_PIN_16_DIGITS:
-                byte[] pinBytes = BluetoothDevice.convertPinToBytes(passkey);
-                if (pinBytes == null) {
-                    return;
-                }
-                mDevice.setPin(pinBytes);
+                mDevice.setPin(passkey);
                 break;
 
-            case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
-                int pass = Integer.parseInt(passkey);
-                mDevice.setPasskey(pass);
-                break;
 
             case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION:
             case BluetoothDevice.PAIRING_VARIANT_CONSENT:
@@ -410,11 +401,9 @@
 
             case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
             case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
-                // Do nothing.
-                break;
-
             case BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT:
-                mDevice.setRemoteOutOfBandData();
+            case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
+                // Do nothing.
                 break;
 
             default:
@@ -428,7 +417,7 @@
      */
     public void onCancel() {
         Log.d(TAG, "Pairing dialog canceled");
-        mDevice.cancelPairingUserInput();
+        mDevice.cancelPairing();
     }
 
     /**
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingService.java b/src/com/android/settings/bluetooth/BluetoothPairingService.java
index d93e57d..53e93d9 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingService.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingService.java
@@ -85,7 +85,7 @@
             } else if (action.equals(ACTION_DISMISS_PAIRING)) {
                 Log.d(TAG, "Notification cancel " + mDevice.getAddress() + " (" +
                         mDevice.getName() + ")");
-                mDevice.cancelPairingUserInput();
+                mDevice.cancelPairing();
             } else {
                 int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
                         BluetoothDevice.ERROR);
diff --git a/src/com/android/settings/datetime/timezone/TimeZoneSettings.java b/src/com/android/settings/datetime/timezone/TimeZoneSettings.java
index d557bf9..ab4c176 100644
--- a/src/com/android/settings/datetime/timezone/TimeZoneSettings.java
+++ b/src/com/android/settings/datetime/timezone/TimeZoneSettings.java
@@ -17,8 +17,9 @@
 package com.android.settings.datetime.timezone;
 
 import android.app.Activity;
-import android.app.AlarmManager;
 import android.app.settings.SettingsEnums;
+import android.app.timezonedetector.ManualTimeZoneSuggestion;
+import android.app.timezonedetector.TimeZoneDetector;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
@@ -270,7 +271,10 @@
             editor.putString(PREF_KEY_REGION, regionId);
         }
         editor.apply();
-        getActivity().getSystemService(AlarmManager.class).setTimeZone(tzId);
+        ManualTimeZoneSuggestion manualTimeZoneSuggestion =
+                TimeZoneDetector.createManualTimeZoneSuggestion(tzId, "Settings: Set time zone");
+        TimeZoneDetector timeZoneDetector = getActivity().getSystemService(TimeZoneDetector.class);
+        timeZoneDetector.suggestManualTimeZone(manualTimeZoneSuggestion);
     }
 
     @Override
diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
index 857f535..0751141 100644
--- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
+++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
@@ -26,6 +26,7 @@
 import android.os.PersistableBundle;
 import android.os.UserHandle;
 import android.telephony.CarrierConfigManager;
+import android.telephony.CellSignalStrength;
 import android.telephony.PhoneStateListener;
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
@@ -48,6 +49,8 @@
 import com.android.settingslib.core.lifecycle.events.OnPause;
 import com.android.settingslib.core.lifecycle.events.OnResume;
 
+import java.util.List;
+
 public class SimStatusDialogController implements LifecycleObserver, OnResume, OnPause {
 
     private final static String TAG = "SimStatusDialogCtrl";
@@ -430,11 +433,37 @@
     }
 
     private int getDbm(SignalStrength signalStrength) {
-        return signalStrength.getDbm();
+        List<CellSignalStrength> cellSignalStrengthList = signalStrength.getCellSignalStrengths();
+        int dbm = -1;
+        if (cellSignalStrengthList == null) {
+            return dbm;
+        }
+
+        for (CellSignalStrength cell : cellSignalStrengthList) {
+            if (cell.getDbm() != -1) {
+                dbm = cell.getDbm();
+                break;
+            }
+        }
+
+        return dbm;
     }
 
     private int getAsuLevel(SignalStrength signalStrength) {
-        return signalStrength.getAsuLevel();
+        List<CellSignalStrength> cellSignalStrengthList = signalStrength.getCellSignalStrengths();
+        int asu = -1;
+        if (cellSignalStrengthList == null) {
+            return asu;
+        }
+
+        for (CellSignalStrength cell : cellSignalStrengthList) {
+            if (cell.getAsuLevel() != -1) {
+                asu = cell.getAsuLevel();
+                break;
+            }
+        }
+
+        return asu;
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/network/telephony/NetworkScanHelper.java b/src/com/android/settings/network/telephony/NetworkScanHelper.java
index c4839b6..a46bde1 100644
--- a/src/com/android/settings/network/telephony/NetworkScanHelper.java
+++ b/src/com/android/settings/network/telephony/NetworkScanHelper.java
@@ -132,7 +132,12 @@
                             new RadioAccessSpecifier(
                                     AccessNetworkType.UTRAN,
                                     null /* bands */,
-                                    null /* channels */)
+                                    null /* channels */),
+                            // NR
+                            new RadioAccessSpecifier(
+                                    AccessNetworkType.NGRAN,
+                                    null /* bands */,
+                                    null /* channels */),
                     },
                     SEARCH_PERIODICITY_SEC,
                     MAX_SEARCH_TIME_SEC,
diff --git a/tests/robotests/src/com/android/settings/development/compat/PlatformCompatDashboardTest.java b/tests/robotests/src/com/android/settings/development/compat/PlatformCompatDashboardTest.java
index d13b927..693ed45 100644
--- a/tests/robotests/src/com/android/settings/development/compat/PlatformCompatDashboardTest.java
+++ b/tests/robotests/src/com/android/settings/development/compat/PlatformCompatDashboardTest.java
@@ -75,11 +75,11 @@
     public void setUp() throws RemoteException, NameNotFoundException {
         MockitoAnnotations.initMocks(this);
         mChanges = new CompatibilityChangeInfo[5];
-        mChanges[0] = new CompatibilityChangeInfo(1L, "Default_Enabled", 0, false);
-        mChanges[1] = new CompatibilityChangeInfo(2L, "Default_Disabled", 0, true);
-        mChanges[2] = new CompatibilityChangeInfo(3L, "Enabled_After_SDK_1_1", 1, false);
-        mChanges[3] = new CompatibilityChangeInfo(4L, "Enabled_After_SDK_1_2", 1, false);
-        mChanges[4] = new CompatibilityChangeInfo(5L, "Enabled_After_SDK_2", 2, false);
+        mChanges[0] = new CompatibilityChangeInfo(1L, "Default_Enabled", 0, false, "");
+        mChanges[1] = new CompatibilityChangeInfo(2L, "Default_Disabled", 0, true, "");
+        mChanges[2] = new CompatibilityChangeInfo(3L, "Enabled_After_SDK_1_1", 1, false, "");
+        mChanges[3] = new CompatibilityChangeInfo(4L, "Enabled_After_SDK_1_2", 1, false, "");
+        mChanges[4] = new CompatibilityChangeInfo(5L, "Enabled_After_SDK_2", 2, false, "");
         when(mPlatformCompat.listAllChanges()).thenReturn(mChanges);
         mContext = RuntimeEnvironment.application;
         mPreferenceManager = new PreferenceManager(mContext);
@@ -158,9 +158,9 @@
                 new ChangeConfig(enabledChanges, disabledChanges));
         List<CompatibilityChangeInfo> changesToAdd = new ArrayList<>();
         for (int i = 0; i < mChanges.length; ++i) {
-            changesToAdd.add(new CompatibilityChangeInfo(mChanges[i].getId(), mChanges[i]
-            .getName(),
-                    mChanges[i].getEnableAfterTargetSdk(), mChanges[i].getDisabled()));
+            changesToAdd.add(new CompatibilityChangeInfo(mChanges[i].getId(), mChanges[i].getName(),
+                    mChanges[i].getEnableAfterTargetSdk(), mChanges[i].getDisabled(),
+                    mChanges[i].getDescription()));
         }
 
         PreferenceCategory category = mDashboard.createChangeCategoryPreference(changesToAdd,
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
index 3ecdcff..5a74804 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
@@ -45,6 +45,10 @@
 import android.content.pm.PackageInfo;
 import android.os.PersistableBundle;
 import android.telephony.CarrierConfigManager;
+import android.telephony.CellSignalStrength;
+import android.telephony.CellSignalStrengthCdma;
+import android.telephony.CellSignalStrengthLte;
+import android.telephony.CellSignalStrengthWcdma;
 import android.telephony.PhoneStateListener;
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
@@ -73,6 +77,9 @@
 import org.robolectric.shadows.ShadowPackageManager;
 import org.robolectric.util.ReflectionHelpers;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowDeviceInfoUtils.class})
 public class SimStatusDialogControllerTest {
@@ -90,6 +97,12 @@
     @Mock
     private SignalStrength mSignalStrength;
     @Mock
+    private CellSignalStrengthCdma mCellSignalStrengthCdma;
+    @Mock
+    private CellSignalStrengthLte mCellSignalStrengthLte;
+    @Mock
+    private CellSignalStrengthWcdma mCellSignalStrengthWcdma;
+    @Mock
     private CarrierConfigManager mCarrierConfigManager;
     @Mock
     private PersistableBundle mPersistableBundle;
@@ -113,8 +126,15 @@
         mController = spy(new SimStatusDialogController(mDialog, mLifecycle, 0 /* phone id */));
         ShadowDeviceInfoUtils.setPhoneNumber("");
         doReturn(mServiceState).when(mController).getCurrentServiceState();
-        doReturn(0).when(mSignalStrength).getDbm();
-        doReturn(0).when(mSignalStrength).getAsuLevel();
+        //CellSignalStrength setup
+        doReturn(0).when(mCellSignalStrengthCdma).getDbm();
+        doReturn(0).when(mCellSignalStrengthCdma).getAsuLevel();
+        doReturn(0).when(mCellSignalStrengthLte).getDbm();
+        doReturn(0).when(mCellSignalStrengthLte).getAsuLevel();
+        doReturn(0).when(mCellSignalStrengthWcdma).getDbm();
+        doReturn(0).when(mCellSignalStrengthWcdma).getAsuLevel();
+
+        doReturn(null).when(mSignalStrength).getCellSignalStrengths();
         doReturn(mPhoneStateListener).when(mController).getPhoneStateListener();
         doReturn(mSignalStrength).when(mController).getSignalStrength();
         doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(anyInt());
@@ -226,18 +246,36 @@
     }
 
     @Test
-    public void initialize_updateSignalStrengthWith50_shouldUpdateSignalStrengthTo50() {
-        final int signalDbm = 50;
-        final int signalAsu = 50;
-        doReturn(signalDbm).when(mSignalStrength).getDbm();
-        doReturn(signalAsu).when(mSignalStrength).getAsuLevel();
+    public void initialize_updateSignalStrengthWithLte50Wcdma40_shouldUpdateSignalStrengthTo50() {
+        final int lteDbm = 50;
+        final int lteAsu = 50;
+        final int wcdmaDbm = 40;
+        final int wcdmaAsu = 40;
+        setupCellSignalStrength_lteWcdma(lteDbm, lteAsu, wcdmaDbm, wcdmaAsu);
         when(mPersistableBundle.getBoolean(
                 CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
 
         mController.initialize();
 
         final String signalStrengthString =
-                mContext.getString(R.string.sim_signal_strength, signalDbm, signalAsu);
+                mContext.getString(R.string.sim_signal_strength, lteDbm, lteAsu);
+        verify(mDialog).setText(SIGNAL_STRENGTH_VALUE_ID, signalStrengthString);
+    }
+
+    @Test
+    public void initialize_updateSignalStrengthWithLte50Cdma30_shouldUpdateSignalStrengthTo50() {
+        final int lteDbm = 50;
+        final int lteAsu = 50;
+        final int cdmaDbm = 30;
+        final int cdmaAsu = 30;
+        setupCellSignalStrength_lteCdma(lteDbm, lteAsu, cdmaDbm, cdmaAsu);
+        when(mPersistableBundle.getBoolean(
+                CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
+
+        mController.initialize();
+
+        final String signalStrengthString =
+                mContext.getString(R.string.sim_signal_strength, lteDbm, lteAsu);
         verify(mDialog).setText(SIGNAL_STRENGTH_VALUE_ID, signalStrengthString);
     }
 
@@ -248,17 +286,16 @@
         when(mPersistableBundle.getBoolean(
                 CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
 
-        final int signalDbm = 50;
-        final int signalAsu = 50;
-        doReturn(signalDbm).when(mSignalStrength).getDbm();
-        doReturn(signalAsu).when(mSignalStrength).getAsuLevel();
+        final int lteDbm = 50;
+        final int lteAsu = 50;
+        setupCellSignalStrength_lteOnly(lteDbm, lteAsu);
         when(mPersistableBundle.getBoolean(
                 CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
 
         mController.initialize();
 
         final String signalStrengthString =
-                mContext.getString(R.string.sim_signal_strength, signalDbm, signalAsu);
+                mContext.getString(R.string.sim_signal_strength, lteDbm, lteAsu);
         verify(mDialog).setText(SIGNAL_STRENGTH_VALUE_ID, signalStrengthString);
     }
 
@@ -423,4 +460,41 @@
         // we should not crash when running the following line
         mController.initialize();
     }
+
+    private void setupCellSignalStrength_lteWcdma(int lteDbm, int lteAsu, int wcdmaDbm,
+            int wcdmaAsu) {
+        doReturn(lteDbm).when(mCellSignalStrengthLte).getDbm();
+        doReturn(lteAsu).when(mCellSignalStrengthLte).getAsuLevel();
+        doReturn(wcdmaDbm).when(mCellSignalStrengthWcdma).getDbm();
+        doReturn(wcdmaAsu).when(mCellSignalStrengthWcdma).getAsuLevel();
+
+        List<CellSignalStrength> cellSignalStrengthList = new ArrayList<>(2);
+        cellSignalStrengthList.add(mCellSignalStrengthLte);
+        cellSignalStrengthList.add(mCellSignalStrengthWcdma);
+
+        doReturn(cellSignalStrengthList).when(mSignalStrength).getCellSignalStrengths();
+    }
+
+    private void setupCellSignalStrength_lteCdma(int lteDbm, int lteAsu, int cdmaDbm, int cdmaAsu) {
+        doReturn(lteDbm).when(mCellSignalStrengthLte).getDbm();
+        doReturn(lteAsu).when(mCellSignalStrengthLte).getAsuLevel();
+        doReturn(cdmaDbm).when(mCellSignalStrengthCdma).getDbm();
+        doReturn(cdmaAsu).when(mCellSignalStrengthCdma).getAsuLevel();
+
+        List<CellSignalStrength> cellSignalStrengthList = new ArrayList<>(2);
+        cellSignalStrengthList.add(mCellSignalStrengthLte);
+        cellSignalStrengthList.add(mCellSignalStrengthCdma);
+
+        doReturn(cellSignalStrengthList).when(mSignalStrength).getCellSignalStrengths();
+    }
+
+    private void setupCellSignalStrength_lteOnly(int lteDbm, int lteAsu) {
+        doReturn(lteDbm).when(mCellSignalStrengthLte).getDbm();
+        doReturn(lteAsu).when(mCellSignalStrengthLte).getAsuLevel();
+
+        List<CellSignalStrength> cellSignalStrengthList = new ArrayList<>(2);
+        cellSignalStrengthList.add(mCellSignalStrengthLte);
+
+        doReturn(cellSignalStrengthList).when(mSignalStrength).getCellSignalStrengths();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java
index 5b7c863..9c91602 100644
--- a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.sound;
 
-import static android.media.AudioSystem.DEVICE_OUT_ALL_SCO;
 import static android.media.AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET;
 import static android.media.AudioSystem.STREAM_MUSIC;
 
@@ -45,7 +44,6 @@
 import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
 
-import com.android.settings.R;
 import com.android.settings.bluetooth.Utils;
 import com.android.settings.core.FeatureFlags;
 import com.android.settings.testutils.shadow.ShadowAudioManager;
@@ -66,7 +64,6 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowBluetoothDevice;
@@ -246,7 +243,8 @@
     public void isStreamFromOutputDevice_outputDeviceIsBtScoHeadset_shouldReturnTrue() {
         mShadowAudioManager.setOutputDevice(DEVICE_OUT_BLUETOOTH_SCO_HEADSET);
 
-        assertThat(mController.isStreamFromOutputDevice(STREAM_MUSIC, DEVICE_OUT_ALL_SCO)).isTrue();
+        assertThat(mController.isStreamFromOutputDevice(
+                STREAM_MUSIC, DEVICE_OUT_BLUETOOTH_SCO_HEADSET)).isTrue();
     }
 
     /**
@@ -407,4 +405,4 @@
             return TEST_KEY;
         }
     }
-}
\ No newline at end of file
+}