Merge "Inaccurate auto dark theme time"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e5e55c6..7e1f46e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2352,7 +2352,7 @@
     <!-- Title for the panel of add Wi-Fi network from APP [CHAR LIMIT=50] -->
     <string name="wifi_add_app_single_network_title">Save this network?</string>
     <!-- Summary for the panel of add Wi-Fi network from APP [CHAR LIMIT=NONE] -->
-    <string name="wifi_add_app_single_network_summary"><xliff:g id="appName" example="ThirdPartyAppName">%1$s</xliff:g> would like to save a network to your phone</string>
+    <string name="wifi_add_app_single_network_summary"><xliff:g id="appName" example="ThirdPartyAppName">%1$s</xliff:g> wants to save a network to your phone</string>
     <!-- Summary for saving status when saving single network [CHAR LIMIT=30] -->
     <string name="wifi_add_app_single_network_saving_summary">Saving\u2026</string>
     <!-- Summary for saved status when saving single network   [CHAR LIMIT=30] -->
@@ -2362,7 +2362,7 @@
     <!--  Title for the panel of add multiple Wi-Fi networks from APP [CHAR LIMIT=50] -->
     <string name="wifi_add_app_networks_title">Save networks?</string>
     <!-- Summary for the panel of add multiple Wi-Fi networks from APP [CHAR LIMIT=NONE] -->
-    <string name="wifi_add_app_networks_summary"><xliff:g id="appName" example="ThirdPartyAppName">%1$s</xliff:g> would like to save these networks to your phone</string>
+    <string name="wifi_add_app_networks_summary"><xliff:g id="appName" example="ThirdPartyAppName">%1$s</xliff:g> wants to save these networks to your phone</string>
     <!-- Summary for the panel of add Wi-Fi networks from APP [CHAR LIMIT=NONE] -->
     <string name="wifi_add_app_networks_saving_summary">Saving <xliff:g id="number" example="3">%d</xliff:g> networks\u2026</string>
     <!-- Summary for saved status when saving multiple networks   [CHAR LIMIT=NONE] -->
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/CellularDataConditionController.java b/src/com/android/settings/homepage/contextualcards/conditional/CellularDataConditionController.java
index 93b937b..4c0ddc9 100644
--- a/src/com/android/settings/homepage/contextualcards/conditional/CellularDataConditionController.java
+++ b/src/com/android/settings/homepage/contextualcards/conditional/CellularDataConditionController.java
@@ -17,17 +17,18 @@
 package com.android.settings.homepage.contextualcards.conditional;
 
 import android.app.settings.SettingsEnums;
-import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
 import android.net.ConnectivityManager;
+import android.telephony.PhoneStateListener;
+import android.telephony.PreciseDataConnectionState;
+import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 
-import com.android.internal.telephony.TelephonyIntents;
 import com.android.settings.R;
 import com.android.settings.Settings;
 import com.android.settings.homepage.contextualcards.ContextualCard;
+import com.android.settings.network.GlobalSettingsChangeListener;
 
 import java.util.Objects;
 
@@ -35,22 +36,35 @@
 
     static final int ID = Objects.hash("CellularDataConditionController");
 
-    private static final IntentFilter DATA_CONNECTION_FILTER =
-            new IntentFilter(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
-
     private final Context mAppContext;
     private final ConditionManager mConditionManager;
-    private final Receiver mReceiver;
-    private final TelephonyManager mTelephonyManager;
+    private final GlobalSettingsChangeListener mDefaultDataSubscriptionIdListener;
     private final ConnectivityManager mConnectivityManager;
 
+    private int mSubId;
+    private TelephonyManager mTelephonyManager;
+    private boolean mIsListeningConnectionChange;
+
     public CellularDataConditionController(Context appContext, ConditionManager conditionManager) {
         mAppContext = appContext;
         mConditionManager = conditionManager;
-        mReceiver = new Receiver();
+        mSubId = getDefaultDataSubscriptionId(appContext);
+        mTelephonyManager = getTelephonyManager(appContext, mSubId);
+        mDefaultDataSubscriptionIdListener = new GlobalSettingsChangeListener(appContext,
+                android.provider.Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION) {
+            public void onChanged(String field) {
+                final int subId = getDefaultDataSubscriptionId(mAppContext);
+                if (subId == mSubId) {
+                    return;
+                }
+                mSubId = subId;
+                if (mIsListeningConnectionChange) {
+                    restartPhoneStateListener(mAppContext, subId);
+                }
+            }
+        };
         mConnectivityManager = appContext.getSystemService(
                 ConnectivityManager.class);
-        mTelephonyManager = appContext.getSystemService(TelephonyManager.class);
     }
 
     @Override
@@ -95,21 +109,50 @@
 
     @Override
     public void startMonitoringStateChange() {
-        mAppContext.registerReceiver(mReceiver, DATA_CONNECTION_FILTER);
+        restartPhoneStateListener(mAppContext, mSubId);
     }
 
     @Override
     public void stopMonitoringStateChange() {
-        mAppContext.unregisterReceiver(mReceiver);
+        stopPhoneStateListener();
     }
 
-    public class Receiver extends BroadcastReceiver {
+    private int getDefaultDataSubscriptionId(Context context) {
+        final SubscriptionManager subscriptionManager =
+                context.getSystemService(SubscriptionManager.class);
+        return subscriptionManager.getDefaultDataSubscriptionId();
+    }
+
+    private TelephonyManager getTelephonyManager(Context context, int subId) {
+        final TelephonyManager telephonyManager =
+                context.getSystemService(TelephonyManager.class);
+        return telephonyManager.createForSubscriptionId(subId);
+    }
+
+    private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
         @Override
-        public void onReceive(Context context, Intent intent) {
-            if (TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED.equals(
-                    intent.getAction())) {
-                mConditionManager.onConditionChanged();
-            }
+        public void onPreciseDataConnectionStateChanged(
+                PreciseDataConnectionState dataConnectionState) {
+            mConditionManager.onConditionChanged();
         }
+    };
+
+    private void stopPhoneStateListener() {
+        mIsListeningConnectionChange = false;
+        mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+    }
+
+    // restart monitoring when subscription has been changed
+    private void restartPhoneStateListener(Context context, int subId) {
+        stopPhoneStateListener();
+        mIsListeningConnectionChange = true;
+
+        // switch mTelephonyManager only when subscription been updated to valid ones
+        if (SubscriptionManager.isValidSubscriptionId(subId)) {
+            mTelephonyManager = getTelephonyManager(context, subId);
+        }
+
+        mTelephonyManager.listen(mPhoneStateListener,
+                PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE);
     }
 }
diff --git a/src/com/android/settings/media/MediaDeviceUpdateWorker.java b/src/com/android/settings/media/MediaDeviceUpdateWorker.java
index e7aab17..2d9a736 100644
--- a/src/com/android/settings/media/MediaDeviceUpdateWorker.java
+++ b/src/com/android/settings/media/MediaDeviceUpdateWorker.java
@@ -146,6 +146,19 @@
         return mTopDevice;
     }
 
+    /**
+     * Request to set volume.
+     *
+     * @param device for the targeted device.
+     * @param volume for the new value.
+     *
+     */
+    public void adjustVolume(MediaDevice device, int volume) {
+        ThreadUtils.postOnBackgroundThread(() -> {
+            device.requestSetVolume(volume);
+        });
+    }
+
     private class DevicesChangedBroadcastReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
diff --git a/src/com/android/settings/media/MediaOutputSlice.java b/src/com/android/settings/media/MediaOutputSlice.java
index 47a5d7a..36dba22 100644
--- a/src/com/android/settings/media/MediaOutputSlice.java
+++ b/src/com/android/settings/media/MediaOutputSlice.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.media;
 
+import static android.app.slice.Slice.EXTRA_RANGE_VALUE;
+
 import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI;
 
 import android.app.PendingIntent;
@@ -49,6 +51,7 @@
 
     private static final String TAG = "MediaOutputSlice";
     private static final String MEDIA_DEVICE_ID = "media_device_id";
+    private static final int NON_SLIDER_VALUE = -1;
 
     public static final String MEDIA_PACKAGE_NAME = "media_package_name";
 
@@ -86,7 +89,7 @@
         final MediaDevice topDevice = isTouched ? worker.getTopDevice() : connectedDevice;
 
         if (topDevice != null) {
-            listBuilder.addRow(getActiveDeviceHeaderRow(topDevice));
+            listBuilder.addInputRange(getActiveDeviceHeaderRow(topDevice));
             worker.setTopDevice(topDevice);
         }
 
@@ -100,7 +103,7 @@
         return listBuilder.build();
     }
 
-    private ListBuilder.RowBuilder getActiveDeviceHeaderRow(MediaDevice device) {
+    private ListBuilder.InputRangeBuilder getActiveDeviceHeaderRow(MediaDevice device) {
         final String title = device.getName();
         final IconCompat icon = getDeviceIconCompat(device);
 
@@ -108,14 +111,23 @@
                 getBroadcastIntent(mContext, device.getId(), device.hashCode());
         final SliceAction primarySliceAction = SliceAction.createDeeplink(broadcastAction, icon,
                 ListBuilder.ICON_IMAGE, title);
-
-        final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder()
+        final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder()
                 .setTitleItem(icon, ListBuilder.ICON_IMAGE)
                 .setTitle(title)
-                .setSubtitle(device.getSummary())
-                .setPrimaryAction(primarySliceAction);
+                .setPrimaryAction(primarySliceAction)
+                .setInputAction(getSliderInputAction(device.hashCode(), device.getId()))
+                .setMax(device.getMaxVolume())
+                .setValue(device.getCurrentVolume());
+        return builder;
+    }
 
-        return rowBuilder;
+    private PendingIntent getSliderInputAction(int requestCode, String id) {
+        final Intent intent = new Intent(getUri().toString())
+                .setData(getUri())
+                .putExtra(MEDIA_DEVICE_ID, id)
+                .setClass(mContext, SliceBroadcastReceiver.class);
+
+        return PendingIntent.getBroadcast(mContext, requestCode, intent, 0);
     }
 
     private IconCompat getDeviceIconCompat(MediaDevice device) {
@@ -152,7 +164,7 @@
                 .setPrimaryAction(SliceAction.create(broadcastAction, deviceIcon,
                         ListBuilder.ICON_IMAGE, title))
                 .setTitle(title)
-                .setSubtitle(device.getSummary());
+                .setSubtitle(device.isConnected() ? null : device.getSummary());
 
         return rowBuilder;
     }
@@ -162,7 +174,7 @@
         intent.setClass(context, SliceBroadcastReceiver.class);
         intent.putExtra(MEDIA_DEVICE_ID, id);
         intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-        return PendingIntent.getBroadcast(context, requestCode /* requestCode */, intent,
+        return PendingIntent.getBroadcast(context, requestCode, intent,
                 PendingIntent.FLAG_UPDATE_CURRENT);
     }
 
@@ -175,11 +187,22 @@
     public void onNotifyChange(Intent intent) {
         final MediaDeviceUpdateWorker worker = getWorker();
         final String id = intent != null ? intent.getStringExtra(MEDIA_DEVICE_ID) : "";
+        if (TextUtils.isEmpty(id)) {
+            return;
+        }
         final MediaDevice device = worker.getMediaDeviceById(id);
-        if (device != null) {
+        if (device == null) {
+            return;
+        }
+        final int newPosition = intent.getIntExtra(EXTRA_RANGE_VALUE, NON_SLIDER_VALUE);
+        if (newPosition == NON_SLIDER_VALUE) {
+            // Intent for device connection
             Log.d(TAG, "onNotifyChange() device name : " + device.getName());
             worker.setIsTouched(true);
             worker.connectDevice(device);
+        } else {
+            // Intent for volume adjustment
+            worker.adjustVolume(device, newPosition);
         }
     }
 
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index a8b3250..626e4f3 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -304,11 +304,12 @@
                 }
                 mPrivacySettingsSpinner.setSelection(prefMacValue);
 
-                if (config.getIpAssignment() == IpAssignment.STATIC) {
+                if (config.getIpConfiguration().getIpAssignment() == IpAssignment.STATIC) {
                     mIpSettingsSpinner.setSelection(STATIC_IP);
                     showAdvancedFields = true;
                     // Display IP address.
-                    StaticIpConfiguration staticConfig = config.getStaticIpConfiguration();
+                    StaticIpConfiguration staticConfig = config.getIpConfiguration()
+                            .getStaticIpConfiguration();
                     if (staticConfig != null && staticConfig.ipAddress != null) {
                         addRow(group, R.string.wifi_ip_address,
                                 staticConfig.ipAddress.getAddress().getHostAddress());
@@ -322,10 +323,11 @@
                     showAdvancedFields = true;
                 }
 
-                if (config.getProxySettings() == ProxySettings.STATIC) {
+                ProxySettings proxySettings = config.getIpConfiguration().getProxySettings();
+                if (proxySettings == ProxySettings.STATIC) {
                     mProxySettingsSpinner.setSelection(PROXY_STATIC);
                     showAdvancedFields = true;
-                } else if (config.getProxySettings() == ProxySettings.PAC) {
+                } else if (proxySettings == ProxySettings.PAC) {
                     mProxySettingsSpinner.setSelection(PROXY_PAC);
                     showAdvancedFields = true;
                 } else {
@@ -1332,7 +1334,8 @@
                 mDns2View.addTextChangedListener(this);
             }
             if (config != null) {
-                StaticIpConfiguration staticConfig = config.getStaticIpConfiguration();
+                StaticIpConfiguration staticConfig = config.getIpConfiguration()
+                        .getStaticIpConfiguration();
                 if (staticConfig != null) {
                     if (staticConfig.ipAddress != null) {
                         mIpAddressView.setText(
diff --git a/src/com/android/settings/wifi/WifiConfigController2.java b/src/com/android/settings/wifi/WifiConfigController2.java
index add37dd..26042f5 100644
--- a/src/com/android/settings/wifi/WifiConfigController2.java
+++ b/src/com/android/settings/wifi/WifiConfigController2.java
@@ -304,11 +304,12 @@
                 }
                 mPrivacySettingsSpinner.setSelection(prefMacValue);
 
-                if (config.getIpAssignment() == IpAssignment.STATIC) {
+                if (config.getIpConfiguration().getIpAssignment() == IpAssignment.STATIC) {
                     mIpSettingsSpinner.setSelection(STATIC_IP);
                     showAdvancedFields = true;
                     // Display IP address.
-                    StaticIpConfiguration staticConfig = config.getStaticIpConfiguration();
+                    StaticIpConfiguration staticConfig = config.getIpConfiguration()
+                            .getStaticIpConfiguration();
                     if (staticConfig != null && staticConfig.ipAddress != null) {
                         addRow(group, R.string.wifi_ip_address,
                                 staticConfig.ipAddress.getAddress().getHostAddress());
@@ -322,10 +323,11 @@
                     showAdvancedFields = true;
                 }
 
-                if (config.getProxySettings() == ProxySettings.STATIC) {
+                ProxySettings proxySettings = config.getIpConfiguration().getProxySettings();
+                if (proxySettings == ProxySettings.STATIC) {
                     mProxySettingsSpinner.setSelection(PROXY_STATIC);
                     showAdvancedFields = true;
-                } else if (config.getProxySettings() == ProxySettings.PAC) {
+                } else if (proxySettings == ProxySettings.PAC) {
                     mProxySettingsSpinner.setSelection(PROXY_PAC);
                     showAdvancedFields = true;
                 } else {
@@ -1328,7 +1330,8 @@
                 mDns2View.addTextChangedListener(this);
             }
             if (config != null) {
-                StaticIpConfiguration staticConfig = config.getStaticIpConfiguration();
+                StaticIpConfiguration staticConfig = config.getIpConfiguration()
+                        .getStaticIpConfiguration();
                 if (staticConfig != null) {
                     if (staticConfig.ipAddress != null) {
                         mIpAddressView.setText(
diff --git a/src/com/android/settings/wifi/WifiSettings2.java b/src/com/android/settings/wifi/WifiSettings2.java
index c48e739..225e68c 100644
--- a/src/com/android/settings/wifi/WifiSettings2.java
+++ b/src/com/android/settings/wifi/WifiSettings2.java
@@ -77,7 +77,6 @@
 import com.android.settingslib.wifi.LongPressWifiEntryPreference;
 import com.android.wifitrackerlib.WifiEntry;
 import com.android.wifitrackerlib.WifiEntry.ConnectCallback;
-import com.android.wifitrackerlib.WifiEntry.ConnectCallback.ConnectStatus;
 import com.android.wifitrackerlib.WifiPickerTracker;
 
 import java.time.Clock;
@@ -540,7 +539,7 @@
 
             if (selectedEntry.isSaved()) {
                 if (!selectedEntry.getWifiConfiguration().getNetworkSelectionStatus()
-                        .getHasEverConnected()) {
+                        .hasEverConnected()) {
                     launchConfigNewNetworkFragment(selectedEntry);
                     return true;
                 }
diff --git a/src/com/android/settings/wifi/WifiUtils.java b/src/com/android/settings/wifi/WifiUtils.java
index 9b3c1b3..4faf11f 100644
--- a/src/com/android/settings/wifi/WifiUtils.java
+++ b/src/com/android/settings/wifi/WifiUtils.java
@@ -272,7 +272,7 @@
             return CONNECT_TYPE_OPEN_NETWORK;
         } else if (accessPoint.isSaved() && config != null
                 && config.getNetworkSelectionStatus() != null
-                && config.getNetworkSelectionStatus().getHasEverConnected()) {
+                && config.getNetworkSelectionStatus().hasEverConnected()) {
             return CONNECT_TYPE_SAVED_NETWORK;
         } else if (accessPoint.isPasspoint()) {
             // Access point provided by an installed Passpoint provider, connect using
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
index be3c685..d179cae 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
@@ -33,14 +33,19 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.robolectric.Shadows.shadowOf;
 
 import android.content.Context;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.Settings;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
 import android.util.ArrayMap;
 import android.util.FeatureFlagUtils;
 
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
 import com.android.settings.core.FeatureFlags;
 import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardController;
 import com.android.settings.homepage.contextualcards.conditional.ConditionFooterContextualCard;
@@ -58,8 +63,9 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowSubscriptionManager;
+import org.robolectric.shadows.ShadowTelephonyManager;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -67,8 +73,9 @@
 import java.util.Map;
 import java.util.stream.Collectors;
 
-@RunWith(RobolectricTestRunner.class)
+@RunWith(AndroidJUnit4.class)
 public class ContextualCardManagerTest {
+    private static final int SUB_ID = 2;
 
     private static final String TEST_SLICE_URI = "context://test/test";
     private static final String TEST_SLICE_NAME = "test_name";
@@ -79,6 +86,8 @@
     Lifecycle mLifecycle;
 
     private Context mContext;
+    private ShadowSubscriptionManager mShadowSubscriptionManager;
+    private ShadowTelephonyManager mShadowTelephonyManager;
     private ContextualCardManager mManager;
 
     @Before
@@ -86,6 +95,16 @@
         MockitoAnnotations.initMocks(this);
         mContext = RuntimeEnvironment.application;
         FeatureFlagUtils.setEnabled(mContext, FeatureFlags.CONDITIONAL_CARDS, true);
+
+        mShadowSubscriptionManager = shadowOf(
+                mContext.getSystemService(SubscriptionManager.class));
+        mShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID);
+
+        final TelephonyManager telephonyManager =
+                mContext.getSystemService(TelephonyManager.class);
+        mShadowTelephonyManager = shadowOf(telephonyManager);
+        mShadowTelephonyManager.setTelephonyManagerForSubscriptionId(SUB_ID, telephonyManager);
+
         mManager = new ContextualCardManager(mContext, mLifecycle, null /* bundle */);
     }
 
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ControllerRendererPoolTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ControllerRendererPoolTest.java
index 0cb0598..ad2dd2a 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ControllerRendererPoolTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ControllerRendererPoolTest.java
@@ -18,7 +18,13 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+
 import android.content.Context;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
 
 import androidx.lifecycle.LifecycleOwner;
 
@@ -27,11 +33,17 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowSubscriptionManager;
+import org.robolectric.shadows.ShadowTelephonyManager;
 
 @RunWith(RobolectricTestRunner.class)
 public class ControllerRendererPoolTest {
+    private static final int SUB_ID = 1;
 
     private static final int UNSUPPORTED_CARD_TYPE = -99999;
     private static final int UNSUPPORTED_VIEW_TYPE = -99999;
@@ -41,12 +53,27 @@
     private Lifecycle mLifecycle;
     private LifecycleOwner mLifecycleOwner;
 
+    @Mock
+    private TelephonyManager mTelephonyMgr;
+
     @Before
     public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
         mContext = RuntimeEnvironment.application;
         mLifecycleOwner = () -> mLifecycle;
         mLifecycle = new Lifecycle(mLifecycleOwner);
 
+        // SubscriptionManager and TelephonyManager for CellularDataConditionController
+        ShadowSubscriptionManager shadowSubscriptionMgr = shadowOf(
+                mContext.getSystemService(SubscriptionManager.class));
+        shadowSubscriptionMgr.setDefaultDataSubscriptionId(SUB_ID);
+
+        ShadowTelephonyManager shadowTelephonyMgr = Shadow.extract(
+                mContext.getSystemService(TelephonyManager.class));
+        shadowTelephonyMgr.setTelephonyManagerForSubscriptionId(SUB_ID, mTelephonyMgr);
+        when(mTelephonyMgr.createForSubscriptionId(anyInt())).thenReturn(mTelephonyMgr);
+
         mPool = new ControllerRendererPool();
     }
 
diff --git a/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java b/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java
index c9b9ff9..adbd14d 100644
--- a/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java
+++ b/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java
@@ -17,6 +17,7 @@
 
 package com.android.settings.media;
 
+import static android.app.slice.Slice.EXTRA_RANGE_VALUE;
 import static android.app.slice.Slice.HINT_LIST_ITEM;
 import static android.app.slice.SliceItem.FORMAT_SLICE;
 
@@ -144,6 +145,7 @@
         final MediaDevice device = mock(MediaDevice.class);
         when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
         when(device.getIcon()).thenReturn(mTestDrawable);
+        when(device.getMaxVolume()).thenReturn(100);
         when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device);
 
         final Slice mediaSlice = mMediaOutputSlice.getSlice();
@@ -188,4 +190,23 @@
 
         verify(mLocalMediaManager, never()).connectDevice(device);
     }
+
+    @Test
+    public void onNotifyChange_adjustVolume() {
+        mDevices.clear();
+        final MediaDevice device = mock(MediaDevice.class);
+        when(device.getId()).thenReturn(TEST_DEVICE_1_ID);
+        when(mLocalMediaManager.getMediaDeviceById(mDevices, TEST_DEVICE_1_ID)).thenReturn(device);
+        mDevices.add(device);
+
+        mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
+
+        final Intent intent = new Intent();
+        intent.putExtra("media_device_id", TEST_DEVICE_1_ID);
+        intent.putExtra(EXTRA_RANGE_VALUE, 30);
+
+        mMediaOutputSlice.onNotifyChange(intent);
+
+        verify(device).requestSetVolume(30);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
index a79ffd8..e0dc97f 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
@@ -24,6 +24,7 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.net.IpConfiguration;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiEnterpriseConfig;
 import android.net.wifi.WifiEnterpriseConfig.Eap;
@@ -391,6 +392,7 @@
     private void checkSavedMacRandomizedValue(int macRandomizedValue) {
         when(mWifiEntry.isSaved()).thenReturn(true);
         final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
+        when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
         when(mWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfig);
         mockWifiConfig.macRandomizationSetting = macRandomizedValue;
         mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
@@ -505,6 +507,7 @@
         when(mWifiEntry.isSaved()).thenReturn(true);
         when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
         final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
+        when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
         final WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class);
         when(mockWifiEnterpriseConfig.getEapMethod()).thenReturn(Eap.PEAP);
         mockWifiConfig.enterpriseConfig = mockWifiEnterpriseConfig;
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
index bf50742..3a17b6c 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
@@ -24,6 +24,7 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.net.IpConfiguration;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiEnterpriseConfig;
 import android.net.wifi.WifiEnterpriseConfig.Eap;
@@ -389,6 +390,7 @@
     private void checkSavedMacRandomizedValue(int macRandomizedValue) {
         when(mAccessPoint.isSaved()).thenReturn(true);
         final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
+        when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
         when(mAccessPoint.getConfig()).thenReturn(mockWifiConfig);
         mockWifiConfig.macRandomizationSetting = macRandomizedValue;
         mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
@@ -503,6 +505,7 @@
         when(mAccessPoint.isSaved()).thenReturn(true);
         when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_EAP);
         final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
+        when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
         final WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class);
         when(mockWifiEnterpriseConfig.getEapMethod()).thenReturn(Eap.PEAP);
         mockWifiConfig.enterpriseConfig = mockWifiEnterpriseConfig ;
diff --git a/tests/robotests/src/com/android/settings/wifi/slice/ConnectToWifiHandlerTest.java b/tests/robotests/src/com/android/settings/wifi/slice/ConnectToWifiHandlerTest.java
index 195bafc..ac1384f 100644
--- a/tests/robotests/src/com/android/settings/wifi/slice/ConnectToWifiHandlerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/slice/ConnectToWifiHandlerTest.java
@@ -100,7 +100,7 @@
         when(mAccessPoint.isSaved()).thenReturn(true);
         when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_PSK);
         final NetworkSelectionStatus status = mock(NetworkSelectionStatus.class);
-        when(status.getHasEverConnected()).thenReturn(true);
+        when(status.hasEverConnected()).thenReturn(true);
         when(mWifiConfig.getNetworkSelectionStatus()).thenReturn(status);
 
         mHandler.connect(mContext, mAccessPoint);