Merge "DO NOT MERGE - Merge pi-platform-release (PPRL.190205.001) into stage-aosp-master" into stage-aosp-master
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 2c58b5f..ef8b3c0 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -41,7 +41,7 @@
     <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
-    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
     <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"/>
     <uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"/>
     <uses-permission android:name="android.permission.READ_USER_DICTIONARY"/>
@@ -436,7 +436,7 @@
             android:exported="true"
             android:permission="android.permission.TETHER_PRIVILEGED" />
 
-        <activity android:name="TetherProvisioningActivity"
+        <activity android:name=".network.TetherProvisioningActivity"
             android:exported="true"
             android:permission="android.permission.TETHER_PRIVILEGED"
             android:excludeFromRecents="true"
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 938f5b7..acc9a76 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -74,6 +74,7 @@
 import androidx.annotation.StringRes;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
+import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.Spannable;
 import android.text.SpannableString;
@@ -966,4 +967,13 @@
             return packageManager.getDefaultActivityIcon();
         }
     }
+
+    /** Get {@link Resources} by subscription id if subscription id is valid. */
+    public static Resources getResourcesForSubId(Context context, int subId) {
+        if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            return SubscriptionManager.getResourcesForSubId(context, subId);
+        } else {
+            return context.getResources();
+        }
+    }
 }
diff --git a/src/com/android/settings/development/ClearAdbKeysPreferenceController.java b/src/com/android/settings/development/ClearAdbKeysPreferenceController.java
index 9598b37..d94d428 100644
--- a/src/com/android/settings/development/ClearAdbKeysPreferenceController.java
+++ b/src/com/android/settings/development/ClearAdbKeysPreferenceController.java
@@ -20,8 +20,8 @@
 import android.hardware.usb.IUsbManager;
 import android.os.RemoteException;
 import android.os.ServiceManager;
-import android.os.SystemProperties;
 import android.os.UserManager;
+import android.sysprop.AdbProperties;
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
@@ -38,9 +38,6 @@
     private static final String TAG = "ClearAdbPrefCtrl";
     private static final String CLEAR_ADB_KEYS = "clear_adb_keys";
 
-    @VisibleForTesting
-    static final String RO_ADB_SECURE_PROPERTY_KEY = "ro.adb.secure";
-
     private final IUsbManager mUsbManager;
     private final DevelopmentSettingsDashboardFragment mFragment;
 
@@ -54,7 +51,7 @@
 
     @Override
     public boolean isAvailable() {
-        return SystemProperties.getBoolean(RO_ADB_SECURE_PROPERTY_KEY, false /* default */);
+        return AdbProperties.secure().orElse(false);
     }
 
     @Override
diff --git a/src/com/android/settings/TetherProvisioningActivity.java b/src/com/android/settings/network/TetherProvisioningActivity.java
similarity index 89%
rename from src/com/android/settings/TetherProvisioningActivity.java
rename to src/com/android/settings/network/TetherProvisioningActivity.java
index e842db1..b30950e 100644
--- a/src/com/android/settings/TetherProvisioningActivity.java
+++ b/src/com/android/settings/network/TetherProvisioningActivity.java
@@ -14,17 +14,21 @@
  * limitations under the License.
  */
 
-package com.android.settings;
+package com.android.settings.network;
 
 import android.app.Activity;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.content.res.Resources;
 import android.net.ConnectivityManager;
 import android.os.Bundle;
 import android.os.ResultReceiver;
 import android.os.UserHandle;
+import android.telephony.SubscriptionManager;
 import android.util.Log;
 
+import com.android.settings.Utils;
+
 /**
  * Activity which acts as a proxy to the tether provisioning app for sanity checks and permission
  * restrictions. Specifically, the provisioning apps require
@@ -47,7 +51,9 @@
 
         int tetherType = getIntent().getIntExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE,
                 ConnectivityManager.TETHERING_INVALID);
-        String[] provisionApp = getResources().getStringArray(
+        final int subId = SubscriptionManager.getDefaultDataSubscriptionId();
+        final Resources res = Utils.getResourcesForSubId(this, subId);
+        final String[] provisionApp = res.getStringArray(
                 com.android.internal.R.array.config_mobile_hotspot_provision_app);
 
         Intent intent = new Intent(Intent.ACTION_MAIN);
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
index 00f4758..c0cb4fc 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
@@ -33,6 +33,7 @@
 import android.telephony.PhoneStateListener;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.telephony.ims.ProvisioningManager;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.LayoutInflater;
@@ -42,7 +43,9 @@
 import android.widget.TextView;
 
 import com.android.ims.ImsConfig;
+import com.android.ims.ImsException;
 import com.android.ims.ImsManager;
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.telephony.Phone;
 import com.android.settings.R;
@@ -150,6 +153,19 @@
                 }
             };
 
+    private final ProvisioningManager.Callback mProvisioningCallback =
+            new ProvisioningManager.Callback() {
+                @Override
+                public void onProvisioningIntChanged(int item, int value) {
+                    if (item == ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED
+                            || item == ImsConfig.ConfigConstants.VLT_SETTING_ENABLED) {
+                        // The provisioning policy might have changed. Update the body to make sure
+                        // this change takes effect if needed.
+                        updateBody();
+                    }
+                }
+            };
+
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
@@ -219,6 +235,11 @@
         return 0;
     }
 
+    @VisibleForTesting
+    ImsManager getImsManager() {
+        return ImsManager.getInstance(getActivity(), SubscriptionManager.getPhoneId(mSubId));
+    }
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -234,8 +255,7 @@
                     FRAGMENT_BUNDLE_SUBID, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
         }
 
-        mImsManager = ImsManager.getInstance(
-                getActivity(), SubscriptionManager.getPhoneId(mSubId));
+        mImsManager = getImsManager();
 
         mButtonWfcMode = (ListPreference) findPreference(BUTTON_WFC_MODE);
         mButtonWfcMode.setOnPreferenceChangeListener(this);
@@ -272,6 +292,13 @@
     }
 
     private void updateBody() {
+        if (!mImsManager.isWfcProvisionedOnDevice()) {
+            // This screen is not allowed to be shown due to provisioning policy and should
+            // therefore be closed.
+            finish();
+            return;
+        }
+
         CarrierConfigManager configManager = (CarrierConfigManager)
                 getSystemService(Context.CARRIER_CONFIG_SERVICE);
         boolean isWifiOnlySupported = true;
@@ -333,6 +360,14 @@
         if (intent.getBooleanExtra(Phone.EXTRA_KEY_ALERT_SHOW, false)) {
             showAlert(intent);
         }
+
+        // Register callback for provisioning changes.
+        try {
+            mImsManager.getConfigInterface().addConfigCallback(mProvisioningCallback);
+        } catch (ImsException e) {
+            Log.w(TAG, "onResume: Unable to register callback for provisioning changes.");
+        }
+
     }
 
     @Override
@@ -351,6 +386,15 @@
         }
 
         context.unregisterReceiver(mIntentReceiver);
+
+        // Remove callback for provisioning changes.
+        try {
+            mImsManager.getConfigInterface().removeConfigCallback(
+                    mProvisioningCallback.getBinder());
+        } catch (ImsException e) {
+            Log.w(TAG, "onPause: Unable to remove callback for provisioning changes");
+        }
+
     }
 
     /**
diff --git a/src/com/android/settings/wifi/tether/TetherService.java b/src/com/android/settings/wifi/tether/TetherService.java
index e491de8..d1e8652 100644
--- a/src/com/android/settings/wifi/tether/TetherService.java
+++ b/src/com/android/settings/wifi/tether/TetherService.java
@@ -32,16 +32,20 @@
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
 import android.net.ConnectivityManager;
 import android.os.IBinder;
 import android.os.ResultReceiver;
 import android.os.SystemClock;
+import android.telephony.SubscriptionManager;
 import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 
+import com.android.settings.Utils;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -65,7 +69,7 @@
 
     private int mCurrentTypeIndex;
     private boolean mInProvisionCheck;
-    private UsageStatsManagerWrapper mUsageManagerWrapper;
+    private TetherServiceWrapper mWrapper;
     private ArrayList<Integer> mCurrentTethers;
     private ArrayMap<Integer, List<ResultReceiver>> mPendingCallbacks;
     private HotspotOffReceiver mHotspotReceiver;
@@ -79,7 +83,7 @@
     public void onCreate() {
         super.onCreate();
         if (DEBUG) Log.d(TAG, "Creating TetherService");
-        String provisionResponse = getResources().getString(
+        String provisionResponse = getResourceForDefaultDataSubId().getString(
                 com.android.internal.R.string.config_mobile_hotspot_provision_response);
         registerReceiver(mReceiver, new IntentFilter(provisionResponse),
                 android.Manifest.permission.CONNECTIVITY_INTERNAL, null);
@@ -91,9 +95,6 @@
         mPendingCallbacks.put(ConnectivityManager.TETHERING_USB, new ArrayList<ResultReceiver>());
         mPendingCallbacks.put(
                 ConnectivityManager.TETHERING_BLUETOOTH, new ArrayList<ResultReceiver>());
-        if (mUsageManagerWrapper == null) {
-            mUsageManagerWrapper = new UsageStatsManagerWrapper(this);
-        }
         mHotspotReceiver = new HotspotOffReceiver(this);
     }
 
@@ -258,7 +259,7 @@
     }
 
     private Intent getProvisionBroadcastIntent(int index) {
-        String provisionAction = getResources().getString(
+        String provisionAction = getResourceForDefaultDataSubId().getString(
                 com.android.internal.R.string.config_mobile_hotspot_provision_app_no_ui);
         Intent intent = new Intent(provisionAction);
         int type = mCurrentTethers.get(index);
@@ -282,7 +283,7 @@
         for (ResolveInfo resolver : resolvers) {
             if (resolver.activityInfo.applicationInfo.isSystemApp()) {
                 String packageName = resolver.activityInfo.packageName;
-                mUsageManagerWrapper.setAppInactive(packageName, false);
+                getTetherServiceWrapper().setAppInactive(packageName, false);
             }
         }
     }
@@ -294,7 +295,7 @@
 
         PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0);
         AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
-        int period = getResources().getInteger(
+        int period = getResourceForDefaultDataSubId().getInteger(
                 com.android.internal.R.integer.config_mobile_hotspot_provision_check_period);
         long periodMs = period * MS_PER_HOUR;
         long firstTime = SystemClock.elapsedRealtime() + periodMs;
@@ -347,7 +348,7 @@
         @Override
         public void onReceive(Context context, Intent intent) {
             if (DEBUG) Log.d(TAG, "Got provision result " + intent);
-            String provisionResponse = getResources().getString(
+            String provisionResponse = getResourceForDefaultDataSubId().getString(
                     com.android.internal.R.string.config_mobile_hotspot_provision_response);
 
             if (provisionResponse.equals(intent.getAction())) {
@@ -385,19 +386,27 @@
     };
 
     @VisibleForTesting
-    void setUsageStatsManagerWrapper(UsageStatsManagerWrapper wrapper) {
-        mUsageManagerWrapper = wrapper;
+    void setTetherServiceWrapper(TetherServiceWrapper wrapper) {
+        mWrapper = wrapper;
+    }
+
+    private TetherServiceWrapper getTetherServiceWrapper() {
+        if (mWrapper == null) {
+            mWrapper = new TetherServiceWrapper(this);
+        }
+        return mWrapper;
     }
 
     /**
-     * A static helper class used for tests. UsageStatsManager cannot be mocked out becasue
-     * it's marked final. This class can be mocked out instead.
+     * A static helper class used for tests. UsageStatsManager cannot be mocked out because
+     * it's marked final. Static method SubscriptionManager#getResourcesForSubId also cannot
+     * be mocked. This class can be mocked out instead.
      */
     @VisibleForTesting
-    public static class UsageStatsManagerWrapper {
+    public static class TetherServiceWrapper {
         private final UsageStatsManager mUsageStatsManager;
 
-        UsageStatsManagerWrapper(Context context) {
+        TetherServiceWrapper(Context context) {
             mUsageStatsManager = (UsageStatsManager)
                     context.getSystemService(Context.USAGE_STATS_SERVICE);
         }
@@ -405,5 +414,15 @@
         void setAppInactive(String packageName, boolean isInactive) {
             mUsageStatsManager.setAppInactive(packageName, isInactive);
         }
+
+        int getDefaultDataSubscriptionId() {
+            return SubscriptionManager.getDefaultDataSubscriptionId();
+        }
+    }
+
+    @VisibleForTesting
+    Resources getResourceForDefaultDataSubId() {
+        final int subId = getTetherServiceWrapper().getDefaultDataSubscriptionId();
+        return Utils.getResourcesForSubId(this, subId);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/development/ClearAdbKeysPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/ClearAdbKeysPreferenceControllerTest.java
index 6f7c224..772a32f 100644
--- a/tests/robotests/src/com/android/settings/development/ClearAdbKeysPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/ClearAdbKeysPreferenceControllerTest.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.development;
 
-import static com.android.settings.development.ClearAdbKeysPreferenceController.RO_ADB_SECURE_PROPERTY_KEY;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
@@ -28,7 +27,7 @@
 import android.content.Context;
 import android.hardware.usb.IUsbManager;
 import android.os.RemoteException;
-import android.os.SystemProperties;
+import android.sysprop.AdbProperties;
 import androidx.preference.SwitchPreference;
 import androidx.preference.PreferenceScreen;
 
@@ -79,21 +78,21 @@
 
     @Test
     public void isAvailable_roAdbSecureEnabled_shouldBeTrue() {
-        SystemProperties.set(RO_ADB_SECURE_PROPERTY_KEY, Boolean.toString(true));
+        AdbProperties.secure(true);
 
         assertThat(mController.isAvailable()).isTrue();
     }
 
     @Test
     public void isAvailable_roAdbSecureDisabled_shouldBeFalse() {
-        SystemProperties.set(RO_ADB_SECURE_PROPERTY_KEY, Boolean.toString(false));
+        AdbProperties.secure(false);
 
         assertThat(mController.isAvailable()).isFalse();
     }
 
     @Test
     public void displayPreference_isNotAdminUser_preferenceShouldBeDisabled() {
-        SystemProperties.set(RO_ADB_SECURE_PROPERTY_KEY, Boolean.toString(true));
+        AdbProperties.secure(true);
         doReturn(false).when(mController).isAdminUser();
 
         mController.displayPreference(mScreen);
@@ -104,7 +103,7 @@
     @Test
     @Config(shadows = ShadowClearAdbKeysWarningDialog.class)
     public void handlePreferenceTreeClick_clearAdbKeysPreference_shouldShowWarningDialog() {
-        SystemProperties.set(RO_ADB_SECURE_PROPERTY_KEY, Boolean.toString(true));
+        AdbProperties.secure(true);
         doReturn(true).when(mController).isAdminUser();
         mController.displayPreference(mScreen);
         final String preferenceKey = mController.getPreferenceKey();
@@ -117,7 +116,7 @@
 
     @Test
     public void handlePreferenceTreeClick_notClearAdbKeysPreference_shouldReturnFalse() {
-        SystemProperties.set(RO_ADB_SECURE_PROPERTY_KEY, Boolean.toString(true));
+        AdbProperties.secure(true);
         doReturn(true).when(mController).isAdminUser();
         mController.displayPreference(mScreen);
         when(mPreference.getKey()).thenReturn("Some random key!!!");
@@ -128,7 +127,7 @@
 
     @Test
     public void handlePreferenceTreeClick_monkeyUser_shouldReturnFalse() {
-        SystemProperties.set(RO_ADB_SECURE_PROPERTY_KEY, Boolean.toString(true));
+        AdbProperties.secure(true);
         doReturn(true).when(mController).isAdminUser();
         ShadowUtils.setIsUserAMonkey(true);
         mController.displayPreference(mScreen);
@@ -142,7 +141,7 @@
 
     @Test
     public void onDeveloperOptionsSwitchEnabled_isAdminUser_shouldEnablePreference() {
-        SystemProperties.set(RO_ADB_SECURE_PROPERTY_KEY, Boolean.toString(true));
+        AdbProperties.secure(true);
         doReturn(true).when(mController).isAdminUser();
         mController.displayPreference(mScreen);
         mController.onDeveloperOptionsSwitchEnabled();
@@ -152,7 +151,7 @@
 
     @Test
     public void onDeveloperOptionsSwitchEnabled_isNotAdminUser_shouldNotEnablePreference() {
-        SystemProperties.set(RO_ADB_SECURE_PROPERTY_KEY, Boolean.toString(true));
+        AdbProperties.secure(true);
         doReturn(false).when(mController).isAdminUser();
         mController.displayPreference(mScreen);
         mController.onDeveloperOptionsSwitchEnabled();
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
index d60f8cf..a5e80c6 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
@@ -18,17 +18,135 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.telephony.ims.ProvisioningManager;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.ims.ImsConfig;
+import com.android.ims.ImsException;
+import com.android.ims.ImsManager;
+import com.android.settings.R;
+import com.android.settings.SettingsActivity;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settings.widget.SwitchBar;
+import com.android.settings.widget.ToggleSwitch;
+
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
 
 @RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = SettingsShadowResources.SettingsShadowTheme.class)
 public class WifiCallingSettingsForSubTest {
+    private TestFragment mFragment;
+    private Context mContext;
+    private TextView mEmptyView;
+
+    @Mock private ImsManager mImsManager;
+    @Mock private PreferenceScreen mPreferenceScreen;
+    @Mock private SettingsActivity mActivity;
+    @Mock private SwitchBar mSwitchBar;
+    @Mock private ToggleSwitch mToggleSwitch;
+    @Mock private View mView;
+    @Mock private ImsConfig mImsConfig;
+
+    @Before
+    public void setUp() throws NoSuchFieldException, ImsException {
+        MockitoAnnotations.initMocks(this);
+        FakeFeatureFactory.setupForTest();
+
+        mContext = RuntimeEnvironment.application;
+        doReturn(mContext.getTheme()).when(mActivity).getTheme();
+
+        mFragment = spy(new TestFragment());
+        doReturn(mActivity).when(mFragment).getActivity();
+        doReturn(mock(Intent.class)).when(mActivity).getIntent();
+        doReturn(mContext.getResources()).when(mFragment).getResources();
+        doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen();
+        final Bundle bundle = new Bundle();
+        when(mFragment.getArguments()).thenReturn(bundle);
+        doNothing().when(mFragment).addPreferencesFromResource(anyInt());
+        doReturn(mock(ListPreference.class)).when(mFragment).findPreference(any());
+        doNothing().when(mFragment).finish();
+        doReturn(mView).when(mFragment).getView();
+
+        mEmptyView = new TextView(mContext);
+        doReturn(mEmptyView).when(mView).findViewById(android.R.id.empty);
+
+        ReflectionHelpers.setField(mSwitchBar, "mSwitch", mToggleSwitch);
+        doReturn(mSwitchBar).when(mView).findViewById(R.id.switch_bar);
+
+        doReturn(mImsManager).when(mFragment).getImsManager();
+        doReturn(mImsConfig).when(mImsManager).getConfigInterface();
+        doReturn(true).when(mImsManager).isWfcProvisionedOnDevice();
+
+        mFragment.onAttach(mContext);
+        mFragment.onCreate(null);
+        mFragment.onActivityCreated(null);
+    }
 
     @Test
     public void getHelpResource_shouldReturn0() {
-        assertThat(new WifiCallingSettingsForSub().getHelpResource())
-                .isEqualTo(0);
+        assertThat(mFragment.getHelpResource()).isEqualTo(0);
+    }
+
+    @Test
+    public void onResume_provisioningAllowed_shouldNotFinish() throws ImsException {
+        // Call onResume while provisioning is allowed.
+        mFragment.onResume();
+
+        // Verify that finish() is not called.
+        verify(mFragment, never()).finish();
+    }
+
+    @Test
+    public void onResume_provisioningDisallowed_shouldFinish() {
+        // Call onResume while provisioning is disallowed.
+        doReturn(false).when(mImsManager).isWfcProvisionedOnDevice();
+        mFragment.onResume();
+
+        // Verify that finish() is called
+        verify(mFragment).finish();
+    }
+
+    @Test
+    public void onResumeOnPause_provisioningCallbackRegistration() throws ImsException {
+        // Verify that provisioning callback is registered after call to onResume().
+        mFragment.onResume();
+        verify(mImsConfig).addConfigCallback(any(ProvisioningManager.Callback.class));
+
+        // Verify that provisioning callback is unregistered after call to onPause.
+        mFragment.onPause();
+        verify(mImsConfig).removeConfigCallback(any());
+    }
+
+    protected static class TestFragment extends WifiCallingSettingsForSub {
+        @Override
+        protected Object getSystemService(final String name) {
+            return null;
+        }
     }
 }
diff --git a/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
index 7bf5798..dc96c02 100644
--- a/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
+++ b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
@@ -31,6 +31,7 @@
 import static android.net.ConnectivityManager.TETHERING_WIFI;
 import static android.net.ConnectivityManager.TETHER_ERROR_NO_ERROR;
 import static android.net.ConnectivityManager.TETHER_ERROR_PROVISION_FAILED;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
 
 import android.app.Activity;
 import android.app.AlarmManager;
@@ -82,7 +83,7 @@
 
     private TetherService mService;
     private MockResources mResources;
-    private FakeUsageStatsManagerWrapper mUsageStatsManagerWrapper;
+    private MockTetherServiceWrapper mWrapper;
     int mLastReceiverResultCode = BOGUS_RECEIVER_RESULT;
     private int mLastTetherRequestType = TETHERING_INVALID;
     private int mProvisionResponse = BOGUS_RECEIVER_RESULT;
@@ -124,7 +125,7 @@
         when(mPrefs.edit()).thenReturn(mPrefEditor);
         when(mPrefEditor.putString(eq(CURRENT_TYPES), mStoredTypes.capture())).thenReturn(
                 mPrefEditor);
-        mUsageStatsManagerWrapper = new FakeUsageStatsManagerWrapper(mContext);
+        mWrapper = new MockTetherServiceWrapper(mContext);
 
         ResolveInfo systemAppResolveInfo = new ResolveInfo();
         ActivityInfo systemActivityInfo = new ActivityInfo();
@@ -145,6 +146,8 @@
         resolvers.add(systemAppResolveInfo);
         when(mPackageManager.queryBroadcastReceivers(
                 any(Intent.class), eq(PackageManager.MATCH_ALL))).thenReturn(resolvers);
+        setupService();
+        getService().setTetherServiceWrapper(mWrapper);
     }
 
     @Override
@@ -170,16 +173,13 @@
     }
 
     public void testStartKeepsProvisionAppActive() {
-        setupService();
-        getService().setUsageStatsManagerWrapper(mUsageStatsManagerWrapper);
-
         runProvisioningForType(TETHERING_WIFI);
 
         assertTrue(waitForProvisionRequest(TETHERING_WIFI));
         assertTrue(waitForProvisionResponse(TETHER_ERROR_NO_ERROR));
-        assertFalse(mUsageStatsManagerWrapper.isAppInactive(ENTITLEMENT_PACKAGE_NAME));
+        assertFalse(mWrapper.isAppInactive(ENTITLEMENT_PACKAGE_NAME));
         // Non-system handler of the intent action should stay idle.
-        assertTrue(mUsageStatsManagerWrapper.isAppInactive(FAKE_PACKAGE_NAME));
+        assertTrue(mWrapper.isAppInactive(FAKE_PACKAGE_NAME));
     }
 
     public void testScheduleRechecks() {
@@ -418,11 +418,11 @@
         }
     }
 
-    private static class FakeUsageStatsManagerWrapper
-            extends TetherService.UsageStatsManagerWrapper {
+    private static class MockTetherServiceWrapper
+            extends TetherService.TetherServiceWrapper {
         private final Set<String> mActivePackages;
 
-        FakeUsageStatsManagerWrapper(Context context) {
+        MockTetherServiceWrapper(Context context) {
             super(context);
             mActivePackages = new HashSet<>();
         }
@@ -439,5 +439,10 @@
         boolean isAppInactive(String packageName) {
             return !mActivePackages.contains(packageName);
         }
+
+        @Override
+        int getDefaultDataSubscriptionId() {
+            return INVALID_SUBSCRIPTION_ID;
+        }
     }
 }