Consolidate all wrappers used for testing.

- Add the wrapper package and move all wrappers to the wrapper package.
- Get rid of some wrapper interface/impl implementation and have a
wrapper class directly.

Bug: 65634579
Test: make RunSettingsRoboTests
Change-Id: Ic757d8f7bacfa7a034c7e692205bc1dc4b0e1de1
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index fa61cec..89724cc 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -110,9 +110,8 @@
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.UserIcons;
 import com.android.internal.widget.LockPatternUtils;
-import com.android.settings.enterprise.DevicePolicyManagerWrapper;
-import com.android.settings.password.FingerprintManagerWrapper;
-import com.android.settings.password.IFingerprintManager;
+import com.android.settings.wrapper.FingerprintManagerWrapper;
+import com.android.settings.wrapper.DevicePolicyManagerWrapper;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -1258,7 +1257,7 @@
         }
     }
 
-    public static IFingerprintManager getFingerprintManagerWrapperOrNull(Context context) {
+    public static FingerprintManagerWrapper getFingerprintManagerWrapperOrNull(Context context) {
         FingerprintManager fingerprintManager = getFingerprintManagerOrNull(context);
         if (fingerprintManager != null) {
             return new FingerprintManagerWrapper(fingerprintManager);
diff --git a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
index b5133d3..068847f 100644
--- a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
+++ b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
@@ -43,8 +43,7 @@
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settings.enterprise.DevicePolicyManagerWrapper;
-import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
+import com.android.settings.wrapper.DevicePolicyManagerWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import java.io.IOException;
@@ -60,7 +59,7 @@
     private DevicePolicyManagerWrapper mDpm;
 
     public RemoveAccountPreferenceController(Context context, Fragment parent) {
-        this(context, parent, new DevicePolicyManagerWrapperImpl(
+        this(context, parent, new DevicePolicyManagerWrapper(
                 (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE)));
     }
 
diff --git a/src/com/android/settings/applications/AccessibilityServiceInfoWrapperImpl.java b/src/com/android/settings/applications/AccessibilityServiceInfoWrapperImpl.java
deleted file mode 100644
index d0d99ea..0000000
--- a/src/com/android/settings/applications/AccessibilityServiceInfoWrapperImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.applications;
-
-import android.accessibilityservice.AccessibilityServiceInfo;
-import android.content.ComponentName;
-
-public class AccessibilityServiceInfoWrapperImpl implements AccessibilityServiceInfoWrapper {
-
-    private final AccessibilityServiceInfo mServiceInfo;
-
-    public AccessibilityServiceInfoWrapperImpl(AccessibilityServiceInfo serviceInfo) {
-        mServiceInfo = serviceInfo;
-    }
-
-    @Override
-    public AccessibilityServiceInfo getAccessibilityServiceInfo() {
-        return mServiceInfo;
-    }
-
-    @Override
-    public ComponentName getComponentName() {
-        return mServiceInfo.getComponentName();
-    }
-}
diff --git a/src/com/android/settings/applications/ActivityInfoWrapper.java b/src/com/android/settings/applications/ActivityInfoWrapper.java
deleted file mode 100644
index 4cb6e68..0000000
--- a/src/com/android/settings/applications/ActivityInfoWrapper.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.applications;
-
-/**
- * This interface replicates a subset of the android.content.pm.ActivityInfo. The interface
- * exists so that we can use a thin wrapper around the ActivityInfo in production code and a mock in
- * tests.
- */
-public interface ActivityInfoWrapper {
-
-    /**
-     * Returns whether this activity supports picture-in-picture.
-     */
-    boolean supportsPictureInPicture();
-}
diff --git a/src/com/android/settings/applications/AppCounter.java b/src/com/android/settings/applications/AppCounter.java
index 8c7aed7..a02ecfa 100644
--- a/src/com/android/settings/applications/AppCounter.java
+++ b/src/com/android/settings/applications/AppCounter.java
@@ -22,6 +22,8 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 
+import com.android.settingslib.wrapper.PackageManagerWrapper;
+
 import java.util.List;
 
 public abstract class AppCounter extends AsyncTask<Void, Void, Integer> {
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index a5daee2..b06c070 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -43,9 +43,8 @@
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settings.enterprise.DevicePolicyManagerWrapper;
-import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.wrapper.DevicePolicyManagerWrapper;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
@@ -94,7 +93,7 @@
                 .getApplicationFeatureProvider(activity);
         mState = ApplicationsState.getInstance(activity.getApplication());
         mSession = mState.newSession(this);
-        mDpm = new DevicePolicyManagerWrapperImpl(
+        mDpm = new DevicePolicyManagerWrapper(
                 (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE));
         mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
         mPm = activity.getPackageManager();
diff --git a/src/com/android/settings/applications/AppLister.java b/src/com/android/settings/applications/AppLister.java
index 425afa0..f1a3be9 100644
--- a/src/com/android/settings/applications/AppLister.java
+++ b/src/com/android/settings/applications/AppLister.java
@@ -23,6 +23,8 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 
+import com.android.settingslib.wrapper.PackageManagerWrapper;
+
 import java.util.ArrayList;
 import java.util.List;
 
diff --git a/src/com/android/settings/applications/AppStateAppOpsBridge.java b/src/com/android/settings/applications/AppStateAppOpsBridge.java
index 896102c..6ec32a3 100755
--- a/src/com/android/settings/applications/AppStateAppOpsBridge.java
+++ b/src/com/android/settings/applications/AppStateAppOpsBridge.java
@@ -31,6 +31,7 @@
 
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
+import com.android.settings.wrapper.IPackageManagerWrapper;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -57,7 +58,7 @@
     public AppStateAppOpsBridge(Context context, ApplicationsState appState, Callback callback,
             int appOpsOpCode, String[] permissions) {
         this(context, appState, callback, appOpsOpCode, permissions,
-            new IPackageManagerWrapperImpl(AppGlobals.getPackageManager()));
+            new IPackageManagerWrapper(AppGlobals.getPackageManager()));
     }
 
     @VisibleForTesting(otherwise = VisibleForTesting.NONE)
diff --git a/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounter.java b/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounter.java
index c7d0a62..a1bf14e 100644
--- a/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounter.java
+++ b/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounter.java
@@ -22,7 +22,9 @@
 import android.os.RemoteException;
 import android.os.UserHandle;
 
-import com.android.settings.enterprise.DevicePolicyManagerWrapper;
+import com.android.settings.wrapper.DevicePolicyManagerWrapper;
+import com.android.settings.wrapper.IPackageManagerWrapper;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 /**
  * Counts installed apps across all users that have been granted one or more specific permissions by
diff --git a/src/com/android/settings/applications/AppWithAdminGrantedPermissionsLister.java b/src/com/android/settings/applications/AppWithAdminGrantedPermissionsLister.java
index b21f31f..dd5a807 100644
--- a/src/com/android/settings/applications/AppWithAdminGrantedPermissionsLister.java
+++ b/src/com/android/settings/applications/AppWithAdminGrantedPermissionsLister.java
@@ -18,7 +18,9 @@
 
 import android.content.pm.ApplicationInfo;
 import android.os.UserManager;
-import com.android.settings.enterprise.DevicePolicyManagerWrapper;
+import com.android.settings.wrapper.DevicePolicyManagerWrapper;
+import com.android.settings.wrapper.IPackageManagerWrapper;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 /**
  * Lists installed apps across all users that have been granted one or more specific permissions by
diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
index 10b61c5..5323cd5 100644
--- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
+++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
@@ -29,7 +29,9 @@
 import android.view.View;
 
 import com.android.settings.applications.instantapps.InstantAppButtonsController;
-import com.android.settings.enterprise.DevicePolicyManagerWrapper;
+import com.android.settings.wrapper.DevicePolicyManagerWrapper;
+import com.android.settings.wrapper.IPackageManagerWrapper;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/com/android/settings/applications/AutofillManagerWrapperImpl.java b/src/com/android/settings/applications/AutofillManagerWrapperImpl.java
deleted file mode 100644
index 9dd1b33..0000000
--- a/src/com/android/settings/applications/AutofillManagerWrapperImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.applications;
-
-import android.view.autofill.AutofillManager;
-
-public class AutofillManagerWrapperImpl implements AutofillManagerWrapper {
-    private final AutofillManager mAfm;
-
-    public AutofillManagerWrapperImpl(AutofillManager afm) {
-        mAfm = afm;
-    }
-
-    @Override
-    public boolean hasAutofillFeature() {
-        if (mAfm == null) {
-            return false;
-        }
-
-        return mAfm.hasAutofillFeature();
-    }
-
-    @Override
-    public boolean isAutofillSupported() {
-        if (mAfm == null) {
-            return false;
-        }
-
-        return mAfm.isAutofillSupported();
-    }
-}
diff --git a/src/com/android/settings/applications/IPackageManagerWrapperImpl.java b/src/com/android/settings/applications/IPackageManagerWrapperImpl.java
deleted file mode 100644
index af5f378..0000000
--- a/src/com/android/settings/applications/IPackageManagerWrapperImpl.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.applications;
-
-import android.content.Intent;
-import android.content.pm.IPackageManager;
-import android.content.pm.PackageInfo;
-import android.content.pm.ParceledListSlice;
-import android.content.pm.ResolveInfo;
-import android.os.RemoteException;
-
-public class IPackageManagerWrapperImpl implements IPackageManagerWrapper {
-
-    private final IPackageManager mPms;
-
-    public IPackageManagerWrapperImpl(IPackageManager pms) {
-        mPms = pms;
-    }
-
-    @Override
-    public int checkUidPermission(String permName, int uid) throws RemoteException {
-        return mPms.checkUidPermission(permName, uid);
-    }
-
-    @Override
-    public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId)
-            throws RemoteException {
-        return mPms.findPersistentPreferredActivity(intent, userId);
-    }
-
-    @Override
-    public PackageInfo getPackageInfo(String packageName, int flags, int userId)
-            throws RemoteException {
-        return mPms.getPackageInfo(packageName, flags, userId);
-    }
-
-    @Override
-    public String[] getAppOpPermissionPackages(String permissionName) throws RemoteException {
-        return mPms.getAppOpPermissionPackages(permissionName);
-    }
-
-    @Override
-    public boolean isPackageAvailable(String packageName, int userId) throws RemoteException {
-        return mPms.isPackageAvailable(packageName, userId);
-    }
-
-    @Override
-    public ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(
-        String[] permissions, int flags, int userId) throws RemoteException {
-        return mPms.getPackagesHoldingPermissions(permissions, flags, userId);
-    }
-
-}
diff --git a/src/com/android/settings/applications/InstalledAppCounter.java b/src/com/android/settings/applications/InstalledAppCounter.java
index 932face..26372ee 100644
--- a/src/com/android/settings/applications/InstalledAppCounter.java
+++ b/src/com/android/settings/applications/InstalledAppCounter.java
@@ -21,6 +21,8 @@
 import android.content.pm.PackageManager;
 import android.os.UserHandle;
 
+import com.android.settingslib.wrapper.PackageManagerWrapper;
+
 import java.util.List;
 
 public abstract class InstalledAppCounter extends AppCounter {
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 209cd22..2f44d3e 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -24,7 +24,6 @@
 import android.app.AlertDialog;
 import android.app.LoaderManager;
 import android.app.LoaderManager.LoaderCallbacks;
-import android.app.admin.DevicePolicyManager;
 import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -106,6 +105,7 @@
 import com.android.settingslib.development.DevelopmentSettingsEnabler;
 import com.android.settingslib.net.ChartData;
 import com.android.settingslib.net.ChartDataLoader;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
@@ -1236,7 +1236,7 @@
 
         if (pref != null) {
             pref.setSummary(DefaultHomePreferenceController.isHomeDefault(mPackageName,
-                    new PackageManagerWrapperImpl(context.getPackageManager()))
+                    new PackageManagerWrapper(context.getPackageManager()))
                     ? R.string.yes : R.string.no);
         }
         pref = findPreference("default_browser");
diff --git a/src/com/android/settings/applications/InstalledAppLister.java b/src/com/android/settings/applications/InstalledAppLister.java
index d8e7c58..3312d3e 100644
--- a/src/com/android/settings/applications/InstalledAppLister.java
+++ b/src/com/android/settings/applications/InstalledAppLister.java
@@ -20,6 +20,8 @@
 import android.content.pm.PackageManager;
 import android.os.UserManager;
 
+import com.android.settingslib.wrapper.PackageManagerWrapper;
+
 public abstract class InstalledAppLister extends AppLister {
 
     public InstalledAppLister(PackageManagerWrapper packageManager, UserManager userManager) {
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 11eb0cc..90b6a54 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -90,6 +90,7 @@
 import com.android.settingslib.applications.ApplicationsState.CompoundFilter;
 import com.android.settingslib.applications.ApplicationsState.VolumeFilter;
 import com.android.settingslib.applications.StorageStatsSource;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -888,7 +889,6 @@
         private int mLastSortMode = -1;
         private int mWhichSize = SIZE_TOTAL;
         CharSequence mCurFilterPrefix;
-        private PackageManager mPm;
         private AppFilter mCompositeFilter;
         private boolean mHasReceivedLoadEntries;
         private boolean mHasReceivedBridgeCallback;
@@ -938,7 +938,6 @@
                     mManageApplications.mListContainer
             );
             mContext = manageApplications.getActivity();
-            mPm = mContext.getPackageManager();
             mFilterMode = filterMode;
             if (mManageApplications.mListType == LIST_TYPE_NOTIFICATION) {
                 mExtraInfoBridge = new AppStateNotificationBridge(mContext, mState, this,
@@ -1491,7 +1490,7 @@
         public void setListening(boolean listening) {
             if (listening) {
                 new InstalledAppCounter(mContext, InstalledAppCounter.IGNORE_INSTALL_REASON,
-                        new PackageManagerWrapperImpl(mContext.getPackageManager())) {
+                        new PackageManagerWrapper(mContext.getPackageManager())) {
                     @Override
                     protected void onCountComplete(int num) {
                         mLoader.setSummary(SummaryProvider.this,
diff --git a/src/com/android/settings/applications/NotificationApps.java b/src/com/android/settings/applications/NotificationApps.java
index f290d43..ee802dd 100644
--- a/src/com/android/settings/applications/NotificationApps.java
+++ b/src/com/android/settings/applications/NotificationApps.java
@@ -21,6 +21,7 @@
 import com.android.settings.R;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.notification.NotificationBackend;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 /**
  * Extension of ManageApplications with no changes other than having its own
@@ -39,7 +40,7 @@
             mContext = context;
             mLoader = loader;
             mNotificationBackend = new NotificationBackend();
-            mPackageManager = new PackageManagerWrapperImpl(mContext.getPackageManager());
+            mPackageManager = new PackageManagerWrapper(mContext.getPackageManager());
         }
 
         @Override
diff --git a/src/com/android/settings/applications/PackageManagerWrapper.java b/src/com/android/settings/applications/PackageManagerWrapper.java
deleted file mode 100644
index 580b578..0000000
--- a/src/com/android/settings/applications/PackageManagerWrapper.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.applications;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.IPackageDeleteObserver;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.UserHandle;
-import android.os.storage.VolumeInfo;
-
-import java.util.List;
-
-/**
- * This interface replicates a subset of the android.content.pm.PackageManager (PM). The interface
- * exists so that we can use a thin wrapper around the PM in production code and a mock in tests.
- * We cannot directly mock or shadow the PM, because some of the methods we rely on are newer than
- * the API version supported by Robolectric.
- */
-public interface PackageManagerWrapper {
-
-    /**
-     * Returns the real {@code PackageManager} object.
-     */
-    PackageManager getPackageManager();
-
-    /**
-     * Calls {@code PackageManager.getInstalledApplicationsAsUser()}.
-     *
-     * @see android.content.pm.PackageManager#getInstalledApplicationsAsUser
-     */
-    List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId);
-
-    /**
-     * Calls {@code PackageManager.hasSystemFeature()}.
-     *
-     * @see android.content.pm.PackageManager#hasSystemFeature
-     */
-    boolean hasSystemFeature(String name);
-
-    /**
-     * Calls {@code PackageManager.queryIntentActivitiesAsUser()}.
-     *
-     * @see android.content.pm.PackageManager#queryIntentActivitiesAsUser
-     */
-    List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId);
-
-    /**
-     * Calls {@code PackageManager.getInstallReason()}.
-     *
-     * @see android.content.pm.PackageManager#getInstallReason
-     */
-    int getInstallReason(String packageName, UserHandle user);
-
-    /**
-     * Calls {@code PackageManager.getApplicationInfoAsUser}
-     */
-    ApplicationInfo getApplicationInfoAsUser(String packageName, int i, int userId)
-            throws PackageManager.NameNotFoundException;
-
-    /**
-     * Calls {@code PackageManager.setDefaultBrowserPackageNameAsUser}
-     */
-    boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId);
-
-    /**
-     * Calls {@code PackageManager.getDefaultBrowserPackageNameAsUser}
-     */
-    String getDefaultBrowserPackageNameAsUser(int userId);
-
-    /**
-     * Calls {@code PackageManager.getHomeActivities}
-     */
-    ComponentName getHomeActivities(List<ResolveInfo> homeActivities);
-
-    /**
-     * Calls {@code PackageManager.queryIntentServicesAsUser}
-     */
-    List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int i, int user);
-
-    /**
-     * Calls {@code PackageManager.replacePreferredActivity}
-     */
-    void replacePreferredActivity(IntentFilter homeFilter, int matchCategoryEmpty,
-            ComponentName[] componentNames, ComponentName component);
-
-    /**
-     * Calls {@code PackageManager.getPrimaryStorageCurrentVolume}
-     */
-    VolumeInfo getPrimaryStorageCurrentVolume();
-
-    /**
-     * Calls {@code PackageManager.deletePackageAsUser}
-     */
-    void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int flags,
-            int userId);
-
-    int getPackageUidAsUser(String pkg, int userId) throws PackageManager.NameNotFoundException;
-}
diff --git a/src/com/android/settings/applications/PackageManagerWrapperImpl.java b/src/com/android/settings/applications/PackageManagerWrapperImpl.java
deleted file mode 100644
index a47137c..0000000
--- a/src/com/android/settings/applications/PackageManagerWrapperImpl.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.applications;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.IPackageDeleteObserver;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.UserHandle;
-import android.os.storage.VolumeInfo;
-
-import java.util.List;
-
-public class PackageManagerWrapperImpl implements PackageManagerWrapper {
-
-    private final PackageManager mPm;
-
-    public PackageManagerWrapperImpl(PackageManager pm) {
-        mPm = pm;
-    }
-
-    @Override
-    public PackageManager getPackageManager() {
-        return mPm;
-    }
-
-    @Override
-    public List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId) {
-        return mPm.getInstalledApplicationsAsUser(flags, userId);
-    }
-
-    @Override
-    public boolean hasSystemFeature(String name) {
-        return mPm.hasSystemFeature(name);
-    }
-
-    @Override
-    public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId) {
-        return mPm.queryIntentActivitiesAsUser(intent, flags, userId);
-    }
-
-    @Override
-    public int getInstallReason(String packageName, UserHandle user) {
-        return mPm.getInstallReason(packageName, user);
-    }
-
-    @Override
-    public ApplicationInfo getApplicationInfoAsUser(String packageName, int i, int userId)
-            throws PackageManager.NameNotFoundException {
-        return mPm.getApplicationInfoAsUser(packageName, i, userId);
-    }
-
-    @Override
-    public boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) {
-        return mPm.setDefaultBrowserPackageNameAsUser(packageName, userId);
-    }
-
-    @Override
-    public String getDefaultBrowserPackageNameAsUser(int userId) {
-        return mPm.getDefaultBrowserPackageNameAsUser(userId);
-    }
-
-    @Override
-    public ComponentName getHomeActivities(List<ResolveInfo> homeActivities) {
-        return mPm.getHomeActivities(homeActivities);
-    }
-
-    @Override
-    public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int i, int user) {
-        return mPm.queryIntentServicesAsUser(intent, i, user);
-    }
-
-    @Override
-    public void replacePreferredActivity(IntentFilter homeFilter, int matchCategoryEmpty,
-            ComponentName[] componentNames, ComponentName component) {
-        mPm.replacePreferredActivity(homeFilter, matchCategoryEmpty, componentNames, component);
-    }
-
-    @Override
-    public VolumeInfo getPrimaryStorageCurrentVolume() {
-        return mPm.getPrimaryStorageCurrentVolume();
-    }
-
-    @Override
-    public void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int flags,
-            int userId) {
-        mPm.deletePackageAsUser(packageName, observer, flags, userId);
-    }
-
-    @Override
-    public int getPackageUidAsUser(String pkg, int userId)
-            throws PackageManager.NameNotFoundException {
-        return mPm.getPackageUidAsUser(pkg, userId);
-    }
-}
diff --git a/src/com/android/settings/applications/PictureInPictureSettings.java b/src/com/android/settings/applications/PictureInPictureSettings.java
index b1c544a..d8e0b2b 100644
--- a/src/com/android/settings/applications/PictureInPictureSettings.java
+++ b/src/com/android/settings/applications/PictureInPictureSettings.java
@@ -36,6 +36,7 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.notification.EmptyTextSettings;
+import com.android.settings.wrapper.ActivityInfoWrapper;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -63,7 +64,7 @@
         if (activities != null) {
             wrappedActivities = new ActivityInfoWrapper[activities.length];
             for (int i = 0; i < activities.length; i++) {
-                wrappedActivities[i] = new ActivityInfoWrapperImpl(activities[i]);
+                wrappedActivities[i] = new ActivityInfoWrapper(activities[i]);
             }
         }
         return checkPackageHasPictureInPictureActivities(packageName, wrappedActivities);
diff --git a/src/com/android/settings/applications/RecentAppsPreferenceController.java b/src/com/android/settings/applications/RecentAppsPreferenceController.java
index 69a36f67..b6ae1ee 100644
--- a/src/com/android/settings/applications/RecentAppsPreferenceController.java
+++ b/src/com/android/settings/applications/RecentAppsPreferenceController.java
@@ -42,6 +42,7 @@
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -143,7 +144,7 @@
         refreshUi(mCategory.getContext());
         // Show total number of installed apps as See all's summary.
         new InstalledAppCounter(mContext, InstalledAppCounter.IGNORE_INSTALL_REASON,
-                new PackageManagerWrapperImpl(mContext.getPackageManager())) {
+                new PackageManagerWrapper(mContext.getPackageManager())) {
             @Override
             protected void onCountComplete(int num) {
                 if (mHasRecentApps) {
diff --git a/src/com/android/settings/applications/UserManagerWrapper.java b/src/com/android/settings/applications/UserManagerWrapper.java
deleted file mode 100644
index 5b4ed2a..0000000
--- a/src/com/android/settings/applications/UserManagerWrapper.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.applications;
-
-import android.content.pm.UserInfo;
-
-import java.util.List;
-
-/**
- * This interface replicates a subset of the android.os.UserManager. The interface
- * exists so that we can use a thin wrapper around the UserManager in production code and a mock in
- * tests. We cannot directly mock or shadow the UserManager, because some of the methods we rely on
- * are newer than the API version supported by Robolectric or are hidden.
- */
-public interface UserManagerWrapper {
-    UserInfo getPrimaryUser();
-    List<UserInfo> getUsers();
-}
diff --git a/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java b/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
index f51275e..c1fc528 100644
--- a/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
+++ b/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
@@ -24,9 +24,9 @@
 
 import com.android.internal.app.AssistUtils;
 import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.applications.PackageManagerWrapper;
 import com.android.settings.applications.defaultapps.DefaultAppInfo;
 import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java b/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java
index 12470eb..ec44af4 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java
@@ -26,8 +26,8 @@
 import android.os.RemoteException;
 import android.os.UserHandle;
 
-import com.android.settings.applications.PackageManagerWrapper;
 import com.android.settings.widget.RadioButtonPickerFragment;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 /**
  * Data model representing an app in DefaultAppPicker UI.
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
index d3617ef..6eb1ad8 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
@@ -29,11 +29,10 @@
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
-import com.android.settings.applications.PackageManagerWrapper;
-import com.android.settings.applications.PackageManagerWrapperImpl;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.widget.RadioButtonPickerFragment;
 import com.android.settings.widget.RadioButtonPreference;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 /**
  * A generic app picker fragment that shows a list of app as radio button group.
@@ -45,7 +44,7 @@
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
-        mPm = new PackageManagerWrapperImpl(context.getPackageManager());
+        mPm = new PackageManagerWrapper(context.getPackageManager());
     }
 
     @Override
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
index c7b450e..d533d0f 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
@@ -26,11 +26,10 @@
 import android.util.Log;
 
 import com.android.settings.R;
-import com.android.settings.applications.PackageManagerWrapper;
-import com.android.settings.applications.PackageManagerWrapperImpl;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.widget.GearPreference;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 public abstract class DefaultAppPreferenceController extends AbstractPreferenceController
         implements PreferenceControllerMixin {
@@ -44,7 +43,7 @@
 
     public DefaultAppPreferenceController(Context context) {
         super(context);
-        mPackageManager = new PackageManagerWrapperImpl(context.getPackageManager());
+        mPackageManager = new PackageManagerWrapper(context.getPackageManager());
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
         mUserId = UserHandle.myUserId();
     }
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java
index 1fd10ff..30aaf64 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java
@@ -23,8 +23,7 @@
 import android.text.TextUtils;
 import android.view.autofill.AutofillManager;
 
-import com.android.settings.applications.AutofillManagerWrapper;
-import com.android.settings.applications.AutofillManagerWrapperImpl;
+import com.android.settings.wrapper.AutofillManagerWrapper;
 
 public class DefaultAutofillPreferenceController extends DefaultAppPreferenceController {
     private AutofillManagerWrapper mAutofillManager;
@@ -32,7 +31,7 @@
     public DefaultAutofillPreferenceController(Context context) {
         super(context);
 
-        mAutofillManager = new AutofillManagerWrapperImpl(
+        mAutofillManager = new AutofillManagerWrapper(
                 mContext.getSystemService(AutofillManager.class));
     }
 
diff --git a/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java
index 88b36b2..1b229e8 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java
@@ -24,7 +24,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 
-import com.android.settings.applications.PackageManagerWrapper;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/com/android/settings/applications/instantapps/InstantAppButtonsController.java b/src/com/android/settings/applications/instantapps/InstantAppButtonsController.java
index 16956df..28e612c 100644
--- a/src/com/android/settings/applications/instantapps/InstantAppButtonsController.java
+++ b/src/com/android/settings/applications/instantapps/InstantAppButtonsController.java
@@ -29,9 +29,8 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.applications.AppStoreUtil;
-import com.android.settings.applications.PackageManagerWrapper;
-import com.android.settings.applications.PackageManagerWrapperImpl;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 /** Encapsulates a container for buttons relevant to instant apps */
 public class InstantAppButtonsController implements DialogInterface.OnClickListener {
@@ -62,7 +61,7 @@
       mFragment = fragment;
       mView = view;
       mShowDialogDelegate = showDialogDelegate;
-      mPackageManagerWrapper = new PackageManagerWrapperImpl(context.getPackageManager());
+      mPackageManagerWrapper = new PackageManagerWrapper(context.getPackageManager());
     }
 
     public InstantAppButtonsController setPackageName(String packageName) {
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java b/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java
index 4bed89b..eb969a5 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java
@@ -32,6 +32,7 @@
 import com.android.settings.fingerprint.FingerprintSuggestionActivity;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.wallpaper.WallpaperSuggestionActivity;
+import com.android.settings.wrapper.WallpaperManagerWrapper;
 import com.android.settingslib.drawer.Tile;
 
 /**
diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java
index 36d9d0f..5470e63 100644
--- a/src/com/android/settings/datausage/AppDataUsage.java
+++ b/src/com/android/settings/datausage/AppDataUsage.java
@@ -46,14 +46,13 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.applications.AppInfoBase;
-import com.android.settings.applications.PackageManagerWrapper;
-import com.android.settings.applications.PackageManagerWrapperImpl;
 import com.android.settings.widget.EntityHeaderController;
 import com.android.settingslib.AppItem;
 import com.android.settingslib.net.ChartData;
 import com.android.settingslib.net.ChartDataLoader;
 import com.android.settingslib.net.UidDetail;
 import com.android.settingslib.net.UidDetailProvider;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 public class AppDataUsage extends DataUsageBase implements Preference.OnPreferenceChangeListener,
         DataSaverBackend.Listener {
@@ -104,7 +103,7 @@
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
-        mPackageManagerWrapper = new PackageManagerWrapperImpl(getPackageManager());
+        mPackageManagerWrapper = new PackageManagerWrapper(getPackageManager());
         final Bundle args = getArguments();
 
         try {
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeOptionMenuController.java b/src/com/android/settings/deviceinfo/PrivateVolumeOptionMenuController.java
index 88b9487..6047f8c 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeOptionMenuController.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeOptionMenuController.java
@@ -24,12 +24,12 @@
 import android.view.MenuItem;
 
 import com.android.settings.R;
-import com.android.settings.applications.PackageManagerWrapper;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnCreateOptionsMenu;
 import com.android.settingslib.core.lifecycle.events.OnOptionsItemSelected;
 import com.android.settingslib.core.lifecycle.events.OnPrepareOptionsMenu;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.util.Objects;
 
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index dd0db9a..935e180 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -35,9 +35,6 @@
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.Utils;
-import com.android.settings.applications.PackageManagerWrapperImpl;
-import com.android.settings.applications.UserManagerWrapper;
-import com.android.settings.applications.UserManagerWrapperImpl;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.deviceinfo.storage.AutomaticStorageManagementSwitchPreferenceController;
 import com.android.settings.deviceinfo.storage.CachedStorageValuesHelper;
@@ -49,10 +46,12 @@
 import com.android.settings.deviceinfo.storage.VolumeSizesLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
+import com.android.settings.wrapper.UserManagerWrapper;
 import com.android.settingslib.applications.StorageStatsSource;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.deviceinfo.PrivateStorageInfo;
 import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -95,7 +94,7 @@
     @VisibleForTesting
     void initializeOptionsMenu(Activity activity) {
         mOptionMenuController = new PrivateVolumeOptionMenuController(
-                activity, mVolume, new PackageManagerWrapperImpl(activity.getPackageManager()));
+                activity, mVolume, new PackageManagerWrapper(activity.getPackageManager()));
         getLifecycle().addObserver(mOptionMenuController);
         setHasOptionsMenu(true);
         activity.invalidateOptionsMenu();
@@ -178,7 +177,7 @@
         controllers.add(mPreferenceController);
 
         UserManagerWrapper userManager =
-                new UserManagerWrapperImpl(context.getSystemService(UserManager.class));
+                new UserManagerWrapper(context.getSystemService(UserManager.class));
         mSecondaryUsers = SecondaryUserController.getSecondaryUserControllers(context, userManager);
         controllers.addAll(mSecondaryUsers);
 
@@ -227,7 +226,7 @@
                 public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
                     final StorageManager sm = context.getSystemService(StorageManager.class);
                     final UserManagerWrapper userManager =
-                            new UserManagerWrapperImpl(context.getSystemService(UserManager.class));
+                            new UserManagerWrapper(context.getSystemService(UserManager.class));
                     final List<AbstractPreferenceController> controllers = new ArrayList<>();
                     controllers.add(new StorageSummaryDonutPreferenceController(context));
                     controllers.add(new StorageItemPreferenceController(context, null /* host */,
@@ -244,10 +243,10 @@
             Bundle args) {
         Context context = getContext();
         return new StorageAsyncLoader(context,
-                new UserManagerWrapperImpl(context.getSystemService(UserManager.class)),
+                new UserManagerWrapper(context.getSystemService(UserManager.class)),
                 mVolume.fsUuid,
                 new StorageStatsSource(context),
-                new PackageManagerWrapperImpl(context.getPackageManager()));
+                new PackageManagerWrapper(context.getPackageManager()));
     }
 
     @Override
diff --git a/src/com/android/settings/deviceinfo/StorageProfileFragment.java b/src/com/android/settings/deviceinfo/StorageProfileFragment.java
index 9f3ce0c..f2383de 100644
--- a/src/com/android/settings/deviceinfo/StorageProfileFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageProfileFragment.java
@@ -30,15 +30,15 @@
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.Utils;
-import com.android.settings.applications.PackageManagerWrapperImpl;
-import com.android.settings.applications.UserManagerWrapperImpl;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.deviceinfo.storage.StorageAsyncLoader;
 import com.android.settings.deviceinfo.storage.StorageAsyncLoader.AppsStorageResult;
 import com.android.settings.deviceinfo.storage.StorageItemPreferenceController;
+import com.android.settings.wrapper.UserManagerWrapper;
 import com.android.settingslib.applications.StorageStatsSource;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -116,10 +116,10 @@
     public Loader<SparseArray<AppsStorageResult>> onCreateLoader(int id, Bundle args) {
         Context context = getContext();
         return new StorageAsyncLoader(context,
-                new UserManagerWrapperImpl(context.getSystemService(UserManager.class)),
+                new UserManagerWrapper(context.getSystemService(UserManager.class)),
                 mVolume.fsUuid,
                 new StorageStatsSource(context),
-                new PackageManagerWrapperImpl(context.getPackageManager()));
+                new PackageManagerWrapper(context.getPackageManager()));
     }
 
     @Override
diff --git a/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java b/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
index 3c69ab1..4aeb782 100644
--- a/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
+++ b/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
@@ -27,9 +27,9 @@
 import android.util.SparseArray;
 
 import com.android.settings.Utils;
-import com.android.settings.applications.UserManagerWrapper;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.deviceinfo.StorageItemPreference;
+import com.android.settings.wrapper.UserManagerWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import java.util.ArrayList;
diff --git a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
index f92a24e..2ce53f6 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
@@ -30,10 +30,10 @@
 import android.util.Log;
 import android.util.SparseArray;
 
-import com.android.settings.applications.PackageManagerWrapper;
-import com.android.settings.applications.UserManagerWrapper;
 import com.android.settings.utils.AsyncLoader;
+import com.android.settings.wrapper.UserManagerWrapper;
 import com.android.settingslib.applications.StorageStatsSource;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.io.IOException;
 import java.util.Collections;
diff --git a/src/com/android/settings/deviceinfo/storage/UserProfileController.java b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
index cf1e360..4870e7e 100644
--- a/src/com/android/settings/deviceinfo/storage/UserProfileController.java
+++ b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
@@ -30,10 +30,10 @@
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.internal.util.Preconditions;
 import com.android.settings.Utils;
-import com.android.settings.applications.UserManagerWrapper;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.deviceinfo.StorageItemPreference;
 import com.android.settings.deviceinfo.StorageProfileFragment;
+import com.android.settings.wrapper.UserManagerWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.drawer.SettingsDrawerActivity;
 
diff --git a/src/com/android/settings/display/BrightnessLevelPreferenceController.java b/src/com/android/settings/display/BrightnessLevelPreferenceController.java
index e1461dc..f9c9d53 100644
--- a/src/com/android/settings/display/BrightnessLevelPreferenceController.java
+++ b/src/com/android/settings/display/BrightnessLevelPreferenceController.java
@@ -31,6 +31,7 @@
 import android.util.Log;
 
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.wrapper.PowerManagerWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
diff --git a/src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java b/src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java
deleted file mode 100644
index 69ee272..0000000
--- a/src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.enterprise;
-
-import android.annotation.NonNull;
-import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.os.UserHandle;
-import android.support.annotation.Nullable;
-
-import java.util.List;
-
-public class DevicePolicyManagerWrapperImpl implements DevicePolicyManagerWrapper {
-    private final DevicePolicyManager mDpm;
-
-    public DevicePolicyManagerWrapperImpl(DevicePolicyManager dpm) {
-        mDpm = dpm;
-    }
-
-    @Override
-    public @Nullable List<ComponentName> getActiveAdminsAsUser(int userId) {
-        return mDpm.getActiveAdminsAsUser(userId);
-    }
-
-    @Override
-    public int getMaximumFailedPasswordsForWipe(@Nullable ComponentName admin, int userHandle) {
-        return mDpm.getMaximumFailedPasswordsForWipe(admin, userHandle);
-    }
-
-    @Override
-    public ComponentName getDeviceOwnerComponentOnCallingUser() {
-        return mDpm.getDeviceOwnerComponentOnCallingUser();
-    }
-
-    @Override
-    public ComponentName getDeviceOwnerComponentOnAnyUser() {
-        return mDpm.getDeviceOwnerComponentOnAnyUser();
-    }
-
-    @Override
-    public @Nullable ComponentName getProfileOwnerAsUser(final int userId) {
-        return mDpm.getProfileOwnerAsUser(userId);
-    }
-
-    @Override
-    public CharSequence getDeviceOwnerOrganizationName() {
-        return mDpm.getDeviceOwnerOrganizationName();
-    }
-
-    @Override
-    public int getPermissionGrantState(@Nullable ComponentName admin, String packageName,
-            String permission) {
-        return mDpm.getPermissionGrantState(admin, packageName, permission);
-    }
-
-    @Override
-    public boolean isSecurityLoggingEnabled(@Nullable ComponentName admin) {
-        return mDpm.isSecurityLoggingEnabled(admin);
-    }
-
-    @Override
-    public boolean isNetworkLoggingEnabled(@Nullable ComponentName admin) {
-        return mDpm.isNetworkLoggingEnabled(admin);
-    }
-
-    @Override
-    public long getLastSecurityLogRetrievalTime() {
-        return mDpm.getLastSecurityLogRetrievalTime();
-    }
-
-    @Override
-    public long getLastBugReportRequestTime() {
-        return mDpm.getLastBugReportRequestTime();
-    }
-
-    @Override
-    public long getLastNetworkLogRetrievalTime() {
-        return mDpm.getLastNetworkLogRetrievalTime();
-    }
-
-    @Override
-    public boolean isCurrentInputMethodSetByOwner() {
-        return mDpm.isCurrentInputMethodSetByOwner();
-    }
-
-    @Override
-    public List<String> getOwnerInstalledCaCerts(@NonNull UserHandle user) {
-        return mDpm.getOwnerInstalledCaCerts(user);
-    }
-
-    @Override
-    public boolean isDeviceOwnerAppOnAnyUser(String packageName) {
-        return mDpm.isDeviceOwnerAppOnAnyUser(packageName);
-    }
-
-    @Override
-    public boolean packageHasActiveAdmins(String packageName) {
-        return mDpm.packageHasActiveAdmins(packageName);
-    }
-
-    @Override
-    public boolean isUninstallInQueue(String packageName) {
-        return mDpm.isUninstallInQueue(packageName);
-    }
-
-    @Override
-    public Intent createAdminSupportIntent(@NonNull String restriction) {
-        return mDpm.createAdminSupportIntent(restriction);
-    }
-}
diff --git a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
index 159f57b..9217001 100644
--- a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
+++ b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
@@ -30,9 +30,10 @@
 import android.view.View;
 
 import com.android.settings.R;
-import com.android.settings.applications.PackageManagerWrapper;
-import com.android.settings.vpn2.ConnectivityManagerWrapper;
 import com.android.settings.vpn2.VpnUtils;
+import com.android.settings.wrapper.ConnectivityManagerWrapper;
+import com.android.settings.wrapper.DevicePolicyManagerWrapper;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.util.Date;
 import java.util.List;
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java
index 9ab561d..20bb13b 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java
@@ -29,8 +29,7 @@
 import com.android.settings.Utils;
 import com.android.settings.core.InstrumentedFragment;
 import com.android.settings.password.ChooseLockSettingsHelper;
-
-import com.android.settings.password.IFingerprintManager;
+import com.android.settings.wrapper.FingerprintManagerWrapper;
 
 import java.util.ArrayList;
 
@@ -48,7 +47,7 @@
     private byte[] mToken;
     private boolean mDone;
     private int mUserId;
-    private IFingerprintManager mFingerprintManager;
+    private FingerprintManagerWrapper mFingerprintManager;
     private ArrayList<QueuedEvent> mQueuedEvents;
 
     private abstract class QueuedEvent {
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 66a0ca2..d96db68 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -45,8 +45,7 @@
 import com.android.settings.Utils;
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.enterprise.DevicePolicyManagerWrapper;
-import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
+import com.android.settings.wrapper.DevicePolicyManagerWrapper;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.fuelgauge.anomaly.AnomalyDialogFragment;
 import com.android.settings.fuelgauge.anomaly.AnomalyLoader;
@@ -194,7 +193,7 @@
         super.onAttach(activity);
 
         mState = ApplicationsState.getInstance(getActivity().getApplication());
-        mDpm = new DevicePolicyManagerWrapperImpl(
+        mDpm = new DevicePolicyManagerWrapper(
                 (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE));
         mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
         mPackageManager = activity.getPackageManager();
diff --git a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
index 0d5bed8..20acee9 100644
--- a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
@@ -50,9 +50,9 @@
 import com.android.settings.Utils;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
-import com.android.settings.enterprise.DevicePolicyManagerWrapper;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.widget.ActionButtonPreference;
+import com.android.settings.wrapper.DevicePolicyManagerWrapper;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.applications.AppUtils;
 import com.android.settingslib.applications.ApplicationsState;
diff --git a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
index cea6d16..14aba85 100644
--- a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
@@ -35,8 +35,7 @@
 import com.android.settings.Utils;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settings.enterprise.DevicePolicyManagerWrapper;
-import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
+import com.android.settings.wrapper.DevicePolicyManagerWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 /**
@@ -71,7 +70,7 @@
         mPowerWhitelistBackend = backend;
         mPackageManager = context.getPackageManager();
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        mDpm = new DevicePolicyManagerWrapperImpl(
+        mDpm = new DevicePolicyManagerWrapper(
                 (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE));
         mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
         mUid = uid;
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicy.java b/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicy.java
index 4829ca0..57f0ab4 100644
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicy.java
+++ b/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicy.java
@@ -23,6 +23,8 @@
 import android.util.KeyValueListParser;
 import android.util.Log;
 
+import com.android.settings.wrapper.KeyValueListParserWrapper;
+
 /**
  * Class to store the policy for anomaly detection, which comes from
  * {@link android.provider.Settings.Global}
@@ -104,7 +106,7 @@
     private final KeyValueListParserWrapper mParserWrapper;
 
     public AnomalyDetectionPolicy(Context context) {
-        this(context, new KeyValueListParserWrapperImpl(new KeyValueListParser(',')));
+        this(context, new KeyValueListParserWrapper(new KeyValueListParser(',')));
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/fuelgauge/anomaly/KeyValueListParserWrapperImpl.java b/src/com/android/settings/fuelgauge/anomaly/KeyValueListParserWrapperImpl.java
deleted file mode 100644
index f724034..0000000
--- a/src/com/android/settings/fuelgauge/anomaly/KeyValueListParserWrapperImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.anomaly;
-
-import android.util.KeyValueListParser;
-
-/**
- * Impl of {@link KeyValueListParser}
- */
-public class KeyValueListParserWrapperImpl implements KeyValueListParserWrapper {
-    private KeyValueListParser mParser;
-
-    public KeyValueListParserWrapperImpl(KeyValueListParser parser) {
-        mParser = parser;
-    }
-
-    @Override
-    public KeyValueListParser getKeyValueListParser() {
-        return mParser;
-    }
-
-    @Override
-    public void setString(String str) throws IllegalArgumentException {
-        mParser.setString(str);
-    }
-
-    @Override
-    public boolean getBoolean(String key, boolean defaultValue) {
-        return mParser.getBoolean(key, defaultValue);
-    }
-
-    @Override
-    public long getLong(String key, long defaultValue) {
-        return mParser.getLong(key, defaultValue);
-    }
-}
diff --git a/src/com/android/settings/network/MobileNetworkPreferenceController.java b/src/com/android/settings/network/MobileNetworkPreferenceController.java
index 6e2c2d5..1199400 100644
--- a/src/com/android/settings/network/MobileNetworkPreferenceController.java
+++ b/src/com/android/settings/network/MobileNetworkPreferenceController.java
@@ -26,6 +26,7 @@
 
 import com.android.settings.Utils;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.wrapper.RestrictedLockUtilsWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnPause;
diff --git a/src/com/android/settings/network/NetworkScorerPicker.java b/src/com/android/settings/network/NetworkScorerPicker.java
index 1280cf5..187c9ce 100644
--- a/src/com/android/settings/network/NetworkScorerPicker.java
+++ b/src/com/android/settings/network/NetworkScorerPicker.java
@@ -30,6 +30,7 @@
 import com.android.settings.R;
 import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.widget.RadioButtonPreference;
+import com.android.settings.wrapper.NetworkScoreManagerWrapper;
 
 import java.util.List;
 
diff --git a/src/com/android/settings/network/NetworkScorerPickerPreferenceController.java b/src/com/android/settings/network/NetworkScorerPickerPreferenceController.java
index 8d4ea63..e25e62d 100644
--- a/src/com/android/settings/network/NetworkScorerPickerPreferenceController.java
+++ b/src/com/android/settings/network/NetworkScorerPickerPreferenceController.java
@@ -21,6 +21,7 @@
 
 import com.android.settings.R;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.wrapper.NetworkScoreManagerWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import java.util.List;
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java
index 36c3bc9..d3fca68 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.java
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java
@@ -25,8 +25,6 @@
 
 import com.android.settings.applications.ApplicationFeatureProvider;
 import com.android.settings.applications.ApplicationFeatureProviderImpl;
-import com.android.settings.applications.IPackageManagerWrapperImpl;
-import com.android.settings.applications.PackageManagerWrapperImpl;
 import com.android.settings.bluetooth.BluetoothFeatureProvider;
 import com.android.settings.bluetooth.BluetoothFeatureProviderImpl;
 import com.android.settings.connecteddevice.SmsMirroringFeatureProvider;
@@ -38,7 +36,6 @@
 import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl;
 import com.android.settings.datausage.DataPlanFeatureProvider;
 import com.android.settings.datausage.DataPlanFeatureProviderImpl;
-import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
 import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
 import com.android.settings.enterprise.EnterprisePrivacyFeatureProviderImpl;
 import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
@@ -53,7 +50,10 @@
 import com.android.settings.security.SecurityFeatureProviderImpl;
 import com.android.settings.users.UserFeatureProvider;
 import com.android.settings.users.UserFeatureProviderImpl;
-import com.android.settings.vpn2.ConnectivityManagerWrapperImpl;
+import com.android.settings.wrapper.ConnectivityManagerWrapper;
+import com.android.settings.wrapper.DevicePolicyManagerWrapper;
+import com.android.settings.wrapper.IPackageManagerWrapper;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 /**
  * {@link FeatureFactory} implementation for AOSP Settings.
@@ -109,9 +109,9 @@
     public ApplicationFeatureProvider getApplicationFeatureProvider(Context context) {
         if (mApplicationFeatureProvider == null) {
             mApplicationFeatureProvider = new ApplicationFeatureProviderImpl(context,
-                    new PackageManagerWrapperImpl(context.getPackageManager()),
-                    new IPackageManagerWrapperImpl(AppGlobals.getPackageManager()),
-                    new DevicePolicyManagerWrapperImpl((DevicePolicyManager) context
+                    new PackageManagerWrapper(context.getPackageManager()),
+                    new IPackageManagerWrapper(AppGlobals.getPackageManager()),
+                    new DevicePolicyManagerWrapper((DevicePolicyManager) context
                             .getSystemService(Context.DEVICE_POLICY_SERVICE)));
         }
         return mApplicationFeatureProvider;
@@ -129,11 +129,11 @@
     public EnterprisePrivacyFeatureProvider getEnterprisePrivacyFeatureProvider(Context context) {
         if (mEnterprisePrivacyFeatureProvider == null) {
             mEnterprisePrivacyFeatureProvider = new EnterprisePrivacyFeatureProviderImpl(context,
-                    new DevicePolicyManagerWrapperImpl((DevicePolicyManager) context
+                    new DevicePolicyManagerWrapper((DevicePolicyManager) context
                             .getSystemService(Context.DEVICE_POLICY_SERVICE)),
-                    new PackageManagerWrapperImpl(context.getPackageManager()),
+                    new PackageManagerWrapper(context.getPackageManager()),
                     UserManager.get(context),
-                    new ConnectivityManagerWrapperImpl((ConnectivityManager) context
+                    new ConnectivityManagerWrapper((ConnectivityManager) context
                             .getSystemService(Context.CONNECTIVITY_SERVICE)),
                     context.getResources());
         }
diff --git a/src/com/android/settings/password/IFingerprintManager.java b/src/com/android/settings/password/IFingerprintManager.java
deleted file mode 100644
index 9402146..0000000
--- a/src/com/android/settings/password/IFingerprintManager.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.password;
-
-import android.hardware.fingerprint.FingerprintManager.EnrollmentCallback;
-import android.os.CancellationSignal;
-
-/**
- * This is the workaround to allow us test {@link SetNewPasswordController} which uses a new hidden
- * API {@link android.hardware.fingerprint.FingerprintManager#hasEnrolledFingerprints(int)} that
- * roboelectric does not support yet. Having roboelectic to support latest platform API is tracked
- * in b/30995831.
- */
-public interface IFingerprintManager {
-    boolean isHardwareDetected();
-
-    boolean hasEnrolledFingerprints(int userId);
-
-    long preEnroll();
-
-    void setActiveUser(int userId);
-
-    void enroll(byte [] token, CancellationSignal cancel, int flags,
-            int userId, EnrollmentCallback callback);
-}
diff --git a/src/com/android/settings/password/SetNewPasswordController.java b/src/com/android/settings/password/SetNewPasswordController.java
index 57aa8c1..a974da4 100644
--- a/src/com/android/settings/password/SetNewPasswordController.java
+++ b/src/com/android/settings/password/SetNewPasswordController.java
@@ -36,6 +36,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.Utils;
+import com.android.settings.wrapper.FingerprintManagerWrapper;
 
 /**
  * Business logic for {@link SetNewPasswordActivity}.
@@ -56,7 +57,7 @@
      */
     private final int mTargetUserId;
     private final PackageManager mPackageManager;
-    @Nullable private final IFingerprintManager mFingerprintManager;
+    @Nullable private final FingerprintManagerWrapper mFingerprintManager;
     private final DevicePolicyManager mDevicePolicyManager;
     private final Ui mUi;
 
@@ -77,7 +78,7 @@
         }
         // Create a wrapper of FingerprintManager for testing, see IFingerPrintManager for details.
         final FingerprintManager fingerprintManager = Utils.getFingerprintManagerOrNull(context);
-        final IFingerprintManager fingerprintManagerWrapper =
+        final FingerprintManagerWrapper fingerprintManagerWrapper =
                 fingerprintManager == null
                         ? null
                         : new FingerprintManagerWrapper(fingerprintManager);
@@ -91,7 +92,7 @@
     SetNewPasswordController(
             int targetUserId,
             PackageManager packageManager,
-            IFingerprintManager fingerprintManager,
+            FingerprintManagerWrapper fingerprintManager,
             DevicePolicyManager devicePolicyManager,
             Ui ui) {
         mTargetUserId = targetUserId;
diff --git a/src/com/android/settings/search/InstalledAppResultLoader.java b/src/com/android/settings/search/InstalledAppResultLoader.java
index 9d80b73..69a4693 100644
--- a/src/com/android/settings/search/InstalledAppResultLoader.java
+++ b/src/com/android/settings/search/InstalledAppResultLoader.java
@@ -34,9 +34,9 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.applications.ManageApplications;
-import com.android.settings.applications.PackageManagerWrapper;
 import com.android.settings.dashboard.SiteMapManager;
 import com.android.settings.utils.AsyncLoader;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.util.ArrayList;
 import java.util.HashSet;
diff --git a/src/com/android/settings/search/SearchFeatureProviderImpl.java b/src/com/android/settings/search/SearchFeatureProviderImpl.java
index 69c086f..420b847 100644
--- a/src/com/android/settings/search/SearchFeatureProviderImpl.java
+++ b/src/com/android/settings/search/SearchFeatureProviderImpl.java
@@ -21,9 +21,9 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import com.android.settings.applications.PackageManagerWrapperImpl;
 import com.android.settings.dashboard.SiteMapManager;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 /**
  * FeatureProvider for the refactored search code.
@@ -50,7 +50,7 @@
     @Override
     public InstalledAppResultLoader getInstalledAppSearchLoader(Context context, String query) {
         return new InstalledAppResultLoader(
-                context, new PackageManagerWrapperImpl(context.getPackageManager()),
+                context, new PackageManagerWrapper(context.getPackageManager()),
                 cleanQuery(query), getSiteMapManager());
     }
 
diff --git a/src/com/android/settings/vpn2/ConnectivityManagerWrapperImpl.java b/src/com/android/settings/vpn2/ConnectivityManagerWrapperImpl.java
deleted file mode 100644
index f742cd2..0000000
--- a/src/com/android/settings/vpn2/ConnectivityManagerWrapperImpl.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.vpn2;
-
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.Network;
-import android.net.NetworkRequest;
-import android.os.Handler;
-import android.net.ProxyInfo;
-
-public class ConnectivityManagerWrapperImpl implements ConnectivityManagerWrapper {
-
-    private final ConnectivityManager mCm;
-
-    public ConnectivityManagerWrapperImpl(ConnectivityManager cm) {
-        mCm = cm;
-    }
-
-    @Override
-    public ConnectivityManager getConnectivityManager() {
-        return mCm;
-    }
-
-    @Override
-    public String getAlwaysOnVpnPackageForUser(int userId) {
-        return mCm.getAlwaysOnVpnPackageForUser(userId);
-    }
-
-    @Override
-    public ProxyInfo getGlobalProxy() {
-        return mCm.getGlobalProxy();
-    }
-
-    @Override
-    public void registerNetworkCallback(NetworkRequest request, NetworkCallback callback,
-            Handler handler) {
-        mCm.registerNetworkCallback(request, callback, handler);
-    }
-
-    @Override
-    public void startCaptivePortalApp(Network network) {
-        mCm.startCaptivePortalApp(network);
-    }
-}
diff --git a/src/com/android/settings/vpn2/VpnUtils.java b/src/com/android/settings/vpn2/VpnUtils.java
index a36cce8..1aa4ada 100644
--- a/src/com/android/settings/vpn2/VpnUtils.java
+++ b/src/com/android/settings/vpn2/VpnUtils.java
@@ -27,6 +27,7 @@
 
 import com.android.internal.net.LegacyVpnInfo;
 import com.android.internal.net.VpnConfig;
+import com.android.settings.wrapper.ConnectivityManagerWrapper;
 
 /**
  * Utility functions for vpn.
diff --git a/src/com/android/settings/webview/WebViewAppPicker.java b/src/com/android/settings/webview/WebViewAppPicker.java
index 380b964..362ca1f 100644
--- a/src/com/android/settings/webview/WebViewAppPicker.java
+++ b/src/com/android/settings/webview/WebViewAppPicker.java
@@ -30,9 +30,10 @@
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
-import com.android.settings.applications.PackageManagerWrapper;
 import com.android.settings.applications.defaultapps.DefaultAppInfo;
 import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
+import com.android.settings.wrapper.UserPackageWrapper;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java b/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java
index b40be19..e4eb0fc 100644
--- a/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java
+++ b/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java
@@ -28,6 +28,8 @@
 import android.widget.Toast;
 
 import com.android.settings.R;
+import com.android.settings.wrapper.UserPackageWrapper;
+import com.android.settings.wrapper.UserPackageWrapperImpl;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/com/android/settings/wifi/ConfigureWifiSettings.java b/src/com/android/settings/wifi/ConfigureWifiSettings.java
index 4199a6d..3c70048 100644
--- a/src/com/android/settings/wifi/ConfigureWifiSettings.java
+++ b/src/com/android/settings/wifi/ConfigureWifiSettings.java
@@ -28,12 +28,12 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.network.NetworkScoreManagerWrapper;
 import com.android.settings.network.NetworkScorerPickerPreferenceController;
 import com.android.settings.network.WifiCallingPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.wifi.p2p.WifiP2pPreferenceController;
+import com.android.settings.wrapper.NetworkScoreManagerWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import java.util.ArrayList;
diff --git a/src/com/android/settings/wifi/ConnectivityManagerWrapper.java b/src/com/android/settings/wifi/ConnectivityManagerWrapper.java
deleted file mode 100644
index 7317666..0000000
--- a/src/com/android/settings/wifi/ConnectivityManagerWrapper.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.wifi;
-
-import android.net.ConnectivityManager;
-
-/**
- * Wrapper around {@link ConnectivityManager} to facilitate unit testing.
- */
-public class ConnectivityManagerWrapper {
-    private final ConnectivityManager mConnectivityManager;
-
-    public ConnectivityManagerWrapper(ConnectivityManager connectivityManager) {
-        mConnectivityManager = connectivityManager;
-    }
-
-    /**
-     * {@link ConnectivityManager#stopTethering}
-     */
-    public void stopTethering(int type) {
-        mConnectivityManager.stopTethering(type);
-    }
-}
diff --git a/src/com/android/settings/wifi/UseOpenWifiPreferenceController.java b/src/com/android/settings/wifi/UseOpenWifiPreferenceController.java
index d44c8a9..c563fce 100644
--- a/src/com/android/settings/wifi/UseOpenWifiPreferenceController.java
+++ b/src/com/android/settings/wifi/UseOpenWifiPreferenceController.java
@@ -21,7 +21,7 @@
 
 import com.android.settings.R;
 import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.network.NetworkScoreManagerWrapper;
+import com.android.settings.wrapper.NetworkScoreManagerWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java
index 7718898..9c43142 100644
--- a/src/com/android/settings/wifi/WifiEnabler.java
+++ b/src/com/android/settings/wifi/WifiEnabler.java
@@ -35,6 +35,7 @@
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
 import com.android.settings.widget.SwitchWidgetController;
+import com.android.settings.wrapper.ConnectivityManagerWrapper;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 import com.android.settingslib.WirelessUtils;
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index f3b08bf..bc302b9 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -65,6 +65,7 @@
 import com.android.settings.widget.SummaryUpdater.OnSummaryChangeListener;
 import com.android.settings.widget.SwitchBarController;
 import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
+import com.android.settings.wrapper.WifiManagerWrapper;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.wifi.AccessPoint;
 import com.android.settingslib.wifi.AccessPoint.AccessPointListener;
diff --git a/src/com/android/settings/wifi/WifiWakeupPreferenceController.java b/src/com/android/settings/wifi/WifiWakeupPreferenceController.java
index efb8aa6..a3170c0 100644
--- a/src/com/android/settings/wifi/WifiWakeupPreferenceController.java
+++ b/src/com/android/settings/wifi/WifiWakeupPreferenceController.java
@@ -29,7 +29,7 @@
 
 import com.android.settings.R;
 import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.network.NetworkScoreManagerWrapper;
+import com.android.settings.wrapper.NetworkScoreManagerWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
diff --git a/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java b/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java
index 52871f6..dfed801 100644
--- a/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java
+++ b/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java
@@ -20,7 +20,6 @@
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.net.wifi.WifiManager;
 import android.nfc.FormatException;
 import android.nfc.NdefMessage;
 import android.nfc.NdefRecord;
@@ -43,6 +42,7 @@
 import android.widget.TextView;
 
 import com.android.settings.R;
+import com.android.settings.wrapper.WifiManagerWrapper;
 import com.android.settingslib.wifi.AccessPoint;
 
 import java.io.IOException;
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 014fb0f..40acfeb 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -57,12 +57,12 @@
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
-import com.android.settings.vpn2.ConnectivityManagerWrapper;
 import com.android.settings.widget.ActionButtonPreference;
 import com.android.settings.widget.EntityHeaderController;
 import com.android.settings.wifi.WifiDetailPreference;
 import com.android.settings.wifi.WifiDialog;
 import com.android.settings.wifi.WifiDialog.WifiDialogListener;
+import com.android.settings.wrapper.ConnectivityManagerWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
diff --git a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
index 765bebc..1609bef 100644
--- a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
+++ b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
@@ -31,9 +31,9 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.vpn2.ConnectivityManagerWrapperImpl;
 import com.android.settings.wifi.WifiConfigUiBase;
 import com.android.settings.wifi.WifiDialog;
+import com.android.settings.wrapper.ConnectivityManagerWrapper;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.wifi.AccessPoint;
 import java.util.ArrayList;
@@ -117,7 +117,7 @@
         ConnectivityManager cm = context.getSystemService(ConnectivityManager.class);
         mWifiDetailPreferenceController = WifiDetailPreferenceController.newInstance(
                 mAccessPoint,
-                new ConnectivityManagerWrapperImpl(cm),
+                new ConnectivityManagerWrapper(cm),
                 context,
                 this,
                 new Handler(Looper.getMainLooper()),  // UI thread.
diff --git a/src/com/android/settings/applications/AccessibilityManagerWrapperImpl.java b/src/com/android/settings/wrapper/AccessibilityManagerWrapper.java
similarity index 92%
rename from src/com/android/settings/applications/AccessibilityManagerWrapperImpl.java
rename to src/com/android/settings/wrapper/AccessibilityManagerWrapper.java
index 4ebaea7..4fd7ccf 100644
--- a/src/com/android/settings/applications/AccessibilityManagerWrapperImpl.java
+++ b/src/com/android/settings/wrapper/AccessibilityManagerWrapper.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.applications;
+package com.android.settings.wrapper;
 
 import android.view.accessibility.AccessibilityManager;
 
@@ -23,7 +23,7 @@
  * The interface exists so that we can use a thin wrapper around the AccessibilityManager in
  * production code and a mock in tests.
  */
-public class AccessibilityManagerWrapperImpl {
+public class AccessibilityManagerWrapper {
 
     /**
      * Determines if the accessibility button within the system navigation area is supported.
diff --git a/src/com/android/settings/applications/AccessibilityServiceInfoWrapper.java b/src/com/android/settings/wrapper/AccessibilityServiceInfoWrapper.java
similarity index 67%
rename from src/com/android/settings/applications/AccessibilityServiceInfoWrapper.java
rename to src/com/android/settings/wrapper/AccessibilityServiceInfoWrapper.java
index 6ce0a4a..c920392 100644
--- a/src/com/android/settings/applications/AccessibilityServiceInfoWrapper.java
+++ b/src/com/android/settings/wrapper/AccessibilityServiceInfoWrapper.java
@@ -14,24 +14,34 @@
  * limitations under the License.
  */
 
-package com.android.settings.applications;
+package com.android.settings.wrapper;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.content.ComponentName;
 
 /**
- * This interface replicates a subset of the
- * {@link android.accessibilityservice.AccessibilityServiceInfo}. The interface
+ * This class replicates a subset of the
+ * {@link android.accessibilityservice.AccessibilityServiceInfo}. The class
  * exists so that we can use a thin wrapper around it in production code and a mock in tests.
  * We cannot directly mock or shadow it, because some of the methods we rely on are newer than
  * the API version supported by Robolectric.
  */
-public interface AccessibilityServiceInfoWrapper {
+public class AccessibilityServiceInfoWrapper {
+
+    private final AccessibilityServiceInfo mServiceInfo;
+
+    public AccessibilityServiceInfoWrapper(AccessibilityServiceInfo serviceInfo) {
+        mServiceInfo = serviceInfo;
+    }
 
     /**
      * Returns the real {@code AccessibilityServiceInfo} object.
      */
-    AccessibilityServiceInfo getAccessibilityServiceInfo();
+    public AccessibilityServiceInfo getAccessibilityServiceInfo() {
+        return mServiceInfo;
+    }
 
-    ComponentName getComponentName();
+    public ComponentName getComponentName() {
+        return mServiceInfo.getComponentName();
+    }
 }
diff --git a/src/com/android/settings/applications/ActivityInfoWrapperImpl.java b/src/com/android/settings/wrapper/ActivityInfoWrapper.java
similarity index 66%
rename from src/com/android/settings/applications/ActivityInfoWrapperImpl.java
rename to src/com/android/settings/wrapper/ActivityInfoWrapper.java
index b70a1e8..37d0d42 100644
--- a/src/com/android/settings/applications/ActivityInfoWrapperImpl.java
+++ b/src/com/android/settings/wrapper/ActivityInfoWrapper.java
@@ -14,19 +14,26 @@
  * limitations under the License.
  */
 
-package com.android.settings.applications;
+package com.android.settings.wrapper;
 
 import android.content.pm.ActivityInfo;
 
-public class ActivityInfoWrapperImpl implements ActivityInfoWrapper {
+/**
+ * This class replicates a subset of the android.content.pm.ActivityInfo. The class
+ * exists so that we can use a thin wrapper around the ActivityInfo in production code and a mock in
+ * tests.
+ */
+public class ActivityInfoWrapper {
 
     private final ActivityInfo mInfo;
 
-    public ActivityInfoWrapperImpl(ActivityInfo info) {
+    public ActivityInfoWrapper(ActivityInfo info) {
         mInfo = info;
     }
 
-    @Override
+    /**
+     * Returns whether this activity supports picture-in-picture.
+     */
     public boolean supportsPictureInPicture() {
         return mInfo.supportsPictureInPicture();
     }
diff --git a/src/com/android/settings/applications/AutofillManagerWrapper.java b/src/com/android/settings/wrapper/AutofillManagerWrapper.java
similarity index 61%
rename from src/com/android/settings/applications/AutofillManagerWrapper.java
rename to src/com/android/settings/wrapper/AutofillManagerWrapper.java
index 04091b0..57c9375 100644
--- a/src/com/android/settings/applications/AutofillManagerWrapper.java
+++ b/src/com/android/settings/wrapper/AutofillManagerWrapper.java
@@ -14,28 +14,46 @@
  * limitations under the License.
  */
 
-package com.android.settings.applications;
+package com.android.settings.wrapper;
 
 import android.view.autofill.AutofillManager;
 
 /**
- * This interface replicates a subset of the android.view.autofill.AutofillManager (AFM). The
- * interface exists so that we can use a thin wrapper around the AFM in production code and a mock
+ * This class replicates a subset of the android.view.autofill.AutofillManager (AFM). The
+ * class exists so that we can use a thin wrapper around the AFM in production code and a mock
  * in tests. We cannot directly mock or shadow the AFM, because some of the methods we rely on are
  * newer than the API version supported by Robolectric.
  */
-public interface AutofillManagerWrapper {
+public class AutofillManagerWrapper {
+    private final AutofillManager mAfm;
+
+    public AutofillManagerWrapper(AutofillManager afm) {
+        mAfm = afm;
+    }
+
     /**
      * Calls {@code AutofillManager.hasAutofillFeature()}.
      *
      * @see AutofillManager#hasAutofillFeature
      */
-    public boolean hasAutofillFeature();
+    public boolean hasAutofillFeature() {
+        if (mAfm == null) {
+            return false;
+        }
+
+        return mAfm.hasAutofillFeature();
+    }
 
     /**
      * Calls {@code AutofillManager.isAutofillSupported()}.
      *
      * @see AutofillManager#isAutofillSupported
      */
-    public boolean isAutofillSupported();
+    public boolean isAutofillSupported() {
+        if (mAfm == null) {
+            return false;
+        }
+
+        return mAfm.isAutofillSupported();
+    }
 }
diff --git a/src/com/android/settings/vpn2/ConnectivityManagerWrapper.java b/src/com/android/settings/wrapper/ConnectivityManagerWrapper.java
similarity index 72%
rename from src/com/android/settings/vpn2/ConnectivityManagerWrapper.java
rename to src/com/android/settings/wrapper/ConnectivityManagerWrapper.java
index 9e20c9d..c80a97b 100644
--- a/src/com/android/settings/vpn2/ConnectivityManagerWrapper.java
+++ b/src/com/android/settings/wrapper/ConnectivityManagerWrapper.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.vpn2;
+package com.android.settings.wrapper;
 
 import android.net.ConnectivityManager;
 import android.net.ConnectivityManager.NetworkCallback;
@@ -24,31 +24,43 @@
 import android.net.ProxyInfo;
 
 /**
- * This interface replicates a subset of the android.net.ConnectivityManager (CM). The interface
+ * This class replicates a subset of the android.net.ConnectivityManager (CM). The class
  * exists so that we can use a thin wrapper around the CM in production code and a mock in tests.
  * We cannot directly mock or shadow the CM, because some of the methods we rely on are marked as
  * hidden and are thus invisible to Robolectric.
  */
-public interface ConnectivityManagerWrapper {
+public class ConnectivityManagerWrapper {
+
+    private final ConnectivityManager mCm;
+
+    public ConnectivityManagerWrapper(ConnectivityManager cm) {
+        mCm = cm;
+    }
 
     /**
      * Returns the real ConnectivityManager object wrapped by this wrapper.
      */
-    public ConnectivityManager getConnectivityManager();
+    public ConnectivityManager getConnectivityManager() {
+        return mCm;
+    }
 
     /**
      * Calls {@code ConnectivityManager.getAlwaysOnVpnPackageForUser()}.
      *
      * @see android.net.ConnectivityManager#getAlwaysOnVpnPackageForUser
      */
-   String getAlwaysOnVpnPackageForUser(int userId);
+    public String getAlwaysOnVpnPackageForUser(int userId) {
+        return mCm.getAlwaysOnVpnPackageForUser(userId);
+    }
 
     /**
      * Calls {@code ConnectivityManager.getGlobalProxy()}.
      *
      * @see android.net.ConnectivityManager#getGlobalProxy
      */
-   ProxyInfo getGlobalProxy();
+    public ProxyInfo getGlobalProxy() {
+        return mCm.getGlobalProxy();
+    }
 
     /**
      * Calls {@code ConnectivityManager.registerNetworkCallback()}.
@@ -60,7 +72,9 @@
      * @see android.net.ConnectivityManager#registerNetworkCallback(NetworkRequest,NetworkCallback,Handler)
      */
     public void registerNetworkCallback(NetworkRequest request, NetworkCallback callback,
-            Handler handler);
+            Handler handler) {
+        mCm.registerNetworkCallback(request, callback, handler);
+    }
 
     /**
      * Calls {@code ConnectivityManager.startCaptivePortalApp()}.
@@ -71,5 +85,14 @@
      *
      * @see android.net.ConnectivityManager#startCaptivePortalApp(Network)
      */
-    public void startCaptivePortalApp(Network network);
+    public void startCaptivePortalApp(Network network) {
+        mCm.startCaptivePortalApp(network);
+    }
+
+    /**
+     * {@link ConnectivityManager#stopTethering}
+     */
+    public void stopTethering(int type) {
+        mCm.stopTethering(type);
+    }
 }
diff --git a/src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java b/src/com/android/settings/wrapper/DevicePolicyManagerWrapper.java
similarity index 60%
rename from src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java
rename to src/com/android/settings/wrapper/DevicePolicyManagerWrapper.java
index ede241a..ed2eb46 100644
--- a/src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java
+++ b/src/com/android/settings/wrapper/DevicePolicyManagerWrapper.java
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-package com.android.settings.enterprise;
+package com.android.settings.wrapper;
 
 import android.annotation.NonNull;
+import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Intent;
 import android.os.UserHandle;
@@ -25,137 +26,178 @@
 import java.util.List;
 
 /**
- * This interface replicates a subset of the android.app.admin.DevicePolicyManager (DPM). The
- * interface exists so that we can use a thin wrapper around the DPM in production code and a mock
+ * This class replicates a subset of the android.app.admin.DevicePolicyManager (DPM). The
+ * class exists so that we can use a thin wrapper around the DPM in production code and a mock
  * in tests. We cannot directly mock or shadow the DPM, because some of the methods we rely on are
  * newer than the API version supported by Robolectric.
  */
-public interface DevicePolicyManagerWrapper {
+public class DevicePolicyManagerWrapper {
+    private final DevicePolicyManager mDpm;
+
+    public DevicePolicyManagerWrapper(DevicePolicyManager dpm) {
+        mDpm = dpm;
+    }
+
     /**
      * Calls {@code DevicePolicyManager.getActiveAdminsAsUser()}.
      *
      * @see android.app.admin.DevicePolicyManager#getActiveAdminsAsUser
      */
-    public @Nullable List<ComponentName> getActiveAdminsAsUser(int userId);
+    public @Nullable List<ComponentName> getActiveAdminsAsUser(int userId) {
+        return mDpm.getActiveAdminsAsUser(userId);
+    }
 
     /**
      * Calls {@code DevicePolicyManager.getMaximumFailedPasswordsForWipe()}.
      *
      * @see android.app.admin.DevicePolicyManager#getMaximumFailedPasswordsForWipe
      */
-    int getMaximumFailedPasswordsForWipe(@Nullable ComponentName admin, int userHandle);
+    public int getMaximumFailedPasswordsForWipe(@Nullable ComponentName admin, int userHandle) {
+        return mDpm.getMaximumFailedPasswordsForWipe(admin, userHandle);
+    }
 
     /**
      * Calls {@code DevicePolicyManager.getDeviceOwnerComponentOnCallingUser()}.
      *
      * @see android.app.admin.DevicePolicyManager#getDeviceOwnerComponentOnCallingUser
      */
-    ComponentName getDeviceOwnerComponentOnCallingUser();
+    public ComponentName getDeviceOwnerComponentOnCallingUser() {
+        return mDpm.getDeviceOwnerComponentOnCallingUser();
+    }
 
     /**
      * Calls {@code DevicePolicyManager.getDeviceOwnerComponentOnAnyUser()}.
      *
      * @see android.app.admin.DevicePolicyManager#getDeviceOwnerComponentOnAnyUser
      */
-    ComponentName getDeviceOwnerComponentOnAnyUser();
+    public ComponentName getDeviceOwnerComponentOnAnyUser() {
+        return mDpm.getDeviceOwnerComponentOnAnyUser();
+    }
 
     /**
      * Calls {@code DevicePolicyManager.getProfileOwnerAsUser()}.
      *
      * @see android.app.admin.DevicePolicyManager#getProfileOwnerAsUser
      */
-    @Nullable ComponentName getProfileOwnerAsUser(final int userId);
+    public @Nullable ComponentName getProfileOwnerAsUser(final int userId) {
+        return mDpm.getProfileOwnerAsUser(userId);
+    }
 
     /**
      * Calls {@code DevicePolicyManager.getDeviceOwnerNameOnAnyUser()}.
      *
      * @see android.app.admin.DevicePolicyManager#getDeviceOwnerNameOnAnyUser
      */
-    CharSequence getDeviceOwnerOrganizationName();
+    public CharSequence getDeviceOwnerOrganizationName() {
+        return mDpm.getDeviceOwnerOrganizationName();
+    }
 
     /**
      * Calls {@code DevicePolicyManager.getPermissionGrantState()}.
      *
      * @see android.app.admin.DevicePolicyManager#getPermissionGrantState
      */
-    int getPermissionGrantState(@Nullable ComponentName admin, String packageName,
-            String permission);
+    public int getPermissionGrantState(@Nullable ComponentName admin, String packageName,
+            String permission) {
+        return mDpm.getPermissionGrantState(admin, packageName, permission);
+    }
 
     /**
      * Calls {@code DevicePolicyManager.isSecurityLoggingEnabled()}.
      *
      * @see android.app.admin.DevicePolicyManager#isSecurityLoggingEnabled
      */
-    boolean isSecurityLoggingEnabled(@Nullable ComponentName admin);
+    public boolean isSecurityLoggingEnabled(@Nullable ComponentName admin) {
+        return mDpm.isSecurityLoggingEnabled(admin);
+    }
 
     /**
      * Calls {@code DevicePolicyManager.isNetworkLoggingEnabled()}.
      *
      * @see android.app.admin.DevicePolicyManager#isNetworkLoggingEnabled
      */
-    boolean isNetworkLoggingEnabled(@Nullable ComponentName admin);
+    public boolean isNetworkLoggingEnabled(@Nullable ComponentName admin) {
+        return mDpm.isNetworkLoggingEnabled(admin);
+    }
 
     /**
      * Calls {@code DevicePolicyManager.getLastSecurityLogRetrievalTime()}.
      *
      * @see android.app.admin.DevicePolicyManager#getLastSecurityLogRetrievalTime
      */
-    long getLastSecurityLogRetrievalTime();
+    public long getLastSecurityLogRetrievalTime() {
+        return mDpm.getLastSecurityLogRetrievalTime();
+    }
 
     /**
      * Calls {@code DevicePolicyManager.getLastBugReportRequestTime()}.
      *
      * @see android.app.admin.DevicePolicyManager#getLastBugReportRequestTime
      */
-    long getLastBugReportRequestTime();
+    public long getLastBugReportRequestTime() {
+        return mDpm.getLastBugReportRequestTime();
+    }
 
     /**
      * Calls {@code DevicePolicyManager.getLastNetworkLogRetrievalTime()}.
      *
      * @see android.app.admin.DevicePolicyManager#getLastNetworkLogRetrievalTime
      */
-    long getLastNetworkLogRetrievalTime();
+    public long getLastNetworkLogRetrievalTime() {
+        return mDpm.getLastNetworkLogRetrievalTime();
+    }
 
     /**
      * Calls {@code DevicePolicyManager.isCurrentInputMethodSetByOwner()}.
      *
      * @see android.app.admin.DevicePolicyManager#isCurrentInputMethodSetByOwner
      */
-    boolean isCurrentInputMethodSetByOwner();
-
+    public boolean isCurrentInputMethodSetByOwner() {
+        return mDpm.isCurrentInputMethodSetByOwner();
+    }
 
     /**
      * Calls {@code DevicePolicyManager.getOwnerInstalledCaCerts()}.
      *
      * @see android.app.admin.DevicePolicyManager#getOwnerInstalledCaCerts
      */
-    List<String> getOwnerInstalledCaCerts(@NonNull UserHandle user);
+    public List<String> getOwnerInstalledCaCerts(@NonNull UserHandle user) {
+        return mDpm.getOwnerInstalledCaCerts(user);
+    }
 
     /**
      * Calls {@code DevicePolicyManager.isDeviceOwnerAppOnAnyUser()}.
      *
      * @see android.app.admin.DevicePolicyManager#isDeviceOwnerAppOnAnyUser
      */
-    boolean isDeviceOwnerAppOnAnyUser(String packageName);
+    public boolean isDeviceOwnerAppOnAnyUser(String packageName) {
+        return mDpm.isDeviceOwnerAppOnAnyUser(packageName);
+    }
 
     /**
      * Calls {@code DevicePolicyManager.packageHasActiveAdmins()}.
      *
      * @see android.app.admin.DevicePolicyManager#packageHasActiveAdmins
      */
-    boolean packageHasActiveAdmins(String packageName);
+    public boolean packageHasActiveAdmins(String packageName) {
+        return mDpm.packageHasActiveAdmins(packageName);
+    }
 
     /**
      * Calls {@code DevicePolicyManager.isUninstallInQueue()}.
      *
      * @see android.app.admin.DevicePolicyManager#isUninstallInQueue
      */
-    boolean isUninstallInQueue(String packageName);
+    public boolean isUninstallInQueue(String packageName) {
+        return mDpm.isUninstallInQueue(packageName);
+    }
 
     /**
      * Calls {@code DevicePolicyManager.createAdminSupportIntent()}.
      *
      * @see android.app.admin.DevicePolicyManager#createAdminSupportIntent
      */
-    Intent createAdminSupportIntent(String restriction);
+    public Intent createAdminSupportIntent(@NonNull String restriction) {
+        return mDpm.createAdminSupportIntent(restriction);
+    }
 }
diff --git a/src/com/android/settings/password/FingerprintManagerWrapper.java b/src/com/android/settings/wrapper/FingerprintManagerWrapper.java
similarity index 79%
rename from src/com/android/settings/password/FingerprintManagerWrapper.java
rename to src/com/android/settings/wrapper/FingerprintManagerWrapper.java
index 51b31af..9b43bfa 100644
--- a/src/com/android/settings/password/FingerprintManagerWrapper.java
+++ b/src/com/android/settings/wrapper/FingerprintManagerWrapper.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.password;
+package com.android.settings.wrapper;
 
 import android.annotation.NonNull;
 import android.hardware.fingerprint.FingerprintManager;
@@ -24,10 +24,14 @@
 import com.android.internal.util.Preconditions;
 
 /**
- * Wrapper of {@link FingerprintManager}. Workaround for roboelectic testing. See
- * {@link IFingerprintManager} for details.
+ * Wrapper of {@link FingerprintManager}. Workaround for robolectic testing.
+ *
+ * This is the workaround to allow us test {@link SetNewPasswordController} which uses a new hidden
+ * API {@link android.hardware.fingerprint.FingerprintManager#hasEnrolledFingerprints(int)} that
+ * robolectric does not support yet. Having robolectic to support latest platform API is tracked
+ * in b/30995831.
  */
-public class FingerprintManagerWrapper implements IFingerprintManager {
+public class FingerprintManagerWrapper {
     private @NonNull FingerprintManager mFingerprintManager;
 
     public FingerprintManagerWrapper(@NonNull FingerprintManager fingerprintManager) {
@@ -35,27 +39,22 @@
         mFingerprintManager = fingerprintManager;
     }
 
-    @Override
     public boolean isHardwareDetected() {
         return mFingerprintManager.isHardwareDetected();
     }
 
-    @Override
     public boolean hasEnrolledFingerprints(int userId) {
         return mFingerprintManager.hasEnrolledFingerprints(userId);
     }
 
-    @Override
     public long preEnroll() {
         return mFingerprintManager.preEnroll();
     }
 
-    @Override
     public void setActiveUser(int userId) {
         mFingerprintManager.setActiveUser(userId);
     }
 
-    @Override
     public void enroll(
             byte[] token,
             CancellationSignal cancel,
diff --git a/src/com/android/settings/applications/IPackageManagerWrapper.java b/src/com/android/settings/wrapper/IPackageManagerWrapper.java
similarity index 60%
rename from src/com/android/settings/applications/IPackageManagerWrapper.java
rename to src/com/android/settings/wrapper/IPackageManagerWrapper.java
index b4d1b85..9bb2df7 100644
--- a/src/com/android/settings/applications/IPackageManagerWrapper.java
+++ b/src/com/android/settings/wrapper/IPackageManagerWrapper.java
@@ -14,62 +14,84 @@
  * limitations under the License.
  */
 
-package com.android.settings.applications;
+package com.android.settings.wrapper;
 
 import android.content.Intent;
+import android.content.pm.IPackageManager;
 import android.content.pm.PackageInfo;
 import android.content.pm.ParceledListSlice;
 import android.content.pm.ResolveInfo;
 import android.os.RemoteException;
 
 /**
- * This interface replicates a subset of the android.content.pm.IPackageManager (PMS). The interface
+ * This class replicates a subset of the android.content.pm.IPackageManager (PMS). The class
  * exists so that we can use a thin wrapper around the PMS in production code and a mock in tests.
  * We cannot directly mock or shadow the PMS, because some of the methods we rely on are newer than
  * the API version supported by Robolectric.
  */
-public interface IPackageManagerWrapper {
+public class IPackageManagerWrapper {
+
+    private final IPackageManager mPms;
+
+    public IPackageManagerWrapper(IPackageManager pms) {
+        mPms = pms;
+    }
 
     /**
      * Calls {@code IPackageManager.checkUidPermission()}.
      *
      * @see android.content.pm.IPackageManager#checkUidPermission
      */
-    int checkUidPermission(String permName, int uid) throws RemoteException;
+    public int checkUidPermission(String permName, int uid) throws RemoteException {
+        return mPms.checkUidPermission(permName, uid);
+    }
 
     /**
      * Calls {@code IPackageManager.findPersistentPreferredActivity()}.
      *
      * @see android.content.pm.IPackageManager#findPersistentPreferredActivity
      */
-    ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) throws RemoteException;
+    public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId)
+            throws RemoteException {
+        return mPms.findPersistentPreferredActivity(intent, userId);
+    }
 
     /**
      * Calls {@code IPackageManager.getPackageInfo()}.
      *
      * @see android.content.pm.IPackageManager#getPackageInfo
      */
-    PackageInfo getPackageInfo(String packageName, int flags, int userId) throws RemoteException;
+    public PackageInfo getPackageInfo(String packageName, int flags, int userId)
+            throws RemoteException {
+        return mPms.getPackageInfo(packageName, flags, userId);
+    }
 
     /**
      * Calls {@code IPackageManager.getAppOpPermissionPackages()}.
      *
      * @see android.content.pm.IPackageManager#getAppOpPermissionPackages
      */
-    String[] getAppOpPermissionPackages(String permissionName) throws RemoteException;
+    public String[] getAppOpPermissionPackages(String permissionName) throws RemoteException {
+        return mPms.getAppOpPermissionPackages(permissionName);
+    }
 
     /**
      * Calls {@code IPackageManager.isPackageAvailable()}.
      *
      * @see android.content.pm.IPackageManager#isPackageAvailable
      */
-    boolean isPackageAvailable(String packageName, int userId) throws RemoteException;
+    public boolean isPackageAvailable(String packageName, int userId) throws RemoteException {
+        return mPms.isPackageAvailable(packageName, userId);
+    }
 
     /**
      * Calls {@code IPackageManager.getPackagesHoldingPermissions()}.
      *
      * @see android.content.pm.IPackageManager#getPackagesHoldingPermissions
      */
-    ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(
-        String[] permissions, int flags, int userId) throws RemoteException;
+    public ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(
+        String[] permissions, int flags, int userId) throws RemoteException {
+        return mPms.getPackagesHoldingPermissions(permissions, flags, userId);
+    }
+
 }
diff --git a/src/com/android/settings/fuelgauge/anomaly/KeyValueListParserWrapper.java b/src/com/android/settings/wrapper/KeyValueListParserWrapper.java
similarity index 71%
rename from src/com/android/settings/fuelgauge/anomaly/KeyValueListParserWrapper.java
rename to src/com/android/settings/wrapper/KeyValueListParserWrapper.java
index 4a9c2a9..16dc50e 100644
--- a/src/com/android/settings/fuelgauge/anomaly/KeyValueListParserWrapper.java
+++ b/src/com/android/settings/wrapper/KeyValueListParserWrapper.java
@@ -14,22 +14,29 @@
  * limitations under the License.
  */
 
-package com.android.settings.fuelgauge.anomaly;
+package com.android.settings.wrapper;
 
 import android.util.KeyValueListParser;
 
 /**
- * This interface replicates a subset of the {@link KeyValueListParser}. The interface
+ * This class replicates a subset of the {@link KeyValueListParser}. The class
  * exists so that we can use a thin wrapper around the PM in production code and a mock in tests.
  * We cannot directly mock or shadow the {@link KeyValueListParser}, because some of the methods
  * we rely on are newer than the API version supported by Robolectric.
  */
-public interface KeyValueListParserWrapper {
+public class KeyValueListParserWrapper {
+    private KeyValueListParser mParser;
+
+    public KeyValueListParserWrapper(KeyValueListParser parser) {
+        mParser = parser;
+    }
 
     /**
      * Get real {@link KeyValueListParser}
      */
-    KeyValueListParser getKeyValueListParser();
+    public KeyValueListParser getKeyValueListParser() {
+        return mParser;
+    }
 
     /**
      * Resets the parser with a new string to parse. The string is expected to be in the following
@@ -41,7 +48,9 @@
      * @param str the string to parse.
      * @throws IllegalArgumentException if the string is malformed.
      */
-    void setString(String str) throws IllegalArgumentException;
+    public void setString(String str) throws IllegalArgumentException {
+        mParser.setString(str);
+    }
 
     /**
      * Get the value for key as a boolean.
@@ -49,7 +58,9 @@
      * @param defaultValue The value to return if the key was not found.
      * @return the string value associated with the key.
      */
-    boolean getBoolean(String key, boolean defaultValue);
+    public boolean getBoolean(String key, boolean defaultValue) {
+        return mParser.getBoolean(key, defaultValue);
+    }
 
     /**
      * Get the value for key as a long.
@@ -58,5 +69,7 @@
      *                     long.
      * @return the long value associated with the key.
      */
-    long getLong(String key, long defaultValue);
+    public long getLong(String key, long defaultValue) {
+        return mParser.getLong(key, defaultValue);
+    }
 }
diff --git a/src/com/android/settings/network/NetworkScoreManagerWrapper.java b/src/com/android/settings/wrapper/NetworkScoreManagerWrapper.java
similarity index 98%
rename from src/com/android/settings/network/NetworkScoreManagerWrapper.java
rename to src/com/android/settings/wrapper/NetworkScoreManagerWrapper.java
index 3489640..a07d645 100644
--- a/src/com/android/settings/network/NetworkScoreManagerWrapper.java
+++ b/src/com/android/settings/wrapper/NetworkScoreManagerWrapper.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.settings.network;
+package com.android.settings.wrapper;
 
 import android.annotation.Nullable;
 import android.net.NetworkScoreManager;
diff --git a/src/com/android/settings/display/PowerManagerWrapper.java b/src/com/android/settings/wrapper/PowerManagerWrapper.java
similarity index 97%
rename from src/com/android/settings/display/PowerManagerWrapper.java
rename to src/com/android/settings/wrapper/PowerManagerWrapper.java
index afa2f33..6357a3e 100644
--- a/src/com/android/settings/display/PowerManagerWrapper.java
+++ b/src/com/android/settings/wrapper/PowerManagerWrapper.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.display;
+package com.android.settings.wrapper;
 
 import android.os.PowerManager;
 
diff --git a/src/com/android/settings/network/RestrictedLockUtilsWrapper.java b/src/com/android/settings/wrapper/RestrictedLockUtilsWrapper.java
similarity index 93%
rename from src/com/android/settings/network/RestrictedLockUtilsWrapper.java
rename to src/com/android/settings/wrapper/RestrictedLockUtilsWrapper.java
index de5b808..7a0185f 100644
--- a/src/com/android/settings/network/RestrictedLockUtilsWrapper.java
+++ b/src/com/android/settings/wrapper/RestrictedLockUtilsWrapper.java
@@ -1,4 +1,4 @@
-package com.android.settings.network;
+package com.android.settings.wrapper;
 
 import android.content.Context;
 import com.android.settingslib.RestrictedLockUtils;
diff --git a/src/com/android/settings/applications/UserManagerWrapperImpl.java b/src/com/android/settings/wrapper/UserManagerWrapper.java
similarity index 66%
rename from src/com/android/settings/applications/UserManagerWrapperImpl.java
rename to src/com/android/settings/wrapper/UserManagerWrapper.java
index 14ea64a..eeb648b 100644
--- a/src/com/android/settings/applications/UserManagerWrapperImpl.java
+++ b/src/com/android/settings/wrapper/UserManagerWrapper.java
@@ -14,26 +14,30 @@
  * limitations under the License.
  */
 
-package com.android.settings.applications;
+package com.android.settings.wrapper;
 
 import android.content.pm.UserInfo;
 import android.os.UserManager;
 
 import java.util.List;
 
-public class UserManagerWrapperImpl implements UserManagerWrapper {
+/**
+ * This class replicates a subset of the android.os.UserManager. The class
+ * exists so that we can use a thin wrapper around the UserManager in production code and a mock in
+ * tests. We cannot directly mock or shadow the UserManager, because some of the methods we rely on
+ * are newer than the API version supported by Robolectric or are hidden.
+ */
+public class UserManagerWrapper {
     private UserManager mUserManager;
 
-    public UserManagerWrapperImpl(UserManager userManager) {
+    public UserManagerWrapper(UserManager userManager) {
         mUserManager = userManager;
     }
 
-    @Override
     public UserInfo getPrimaryUser() {
         return mUserManager.getPrimaryUser();
     }
 
-    @Override
     public List<UserInfo> getUsers() {
         return mUserManager.getUsers();
     }
diff --git a/src/com/android/settings/webview/UserPackageWrapper.java b/src/com/android/settings/wrapper/UserPackageWrapper.java
similarity index 86%
rename from src/com/android/settings/webview/UserPackageWrapper.java
rename to src/com/android/settings/wrapper/UserPackageWrapper.java
index 8fbb10c..afa1d82 100644
--- a/src/com/android/settings/webview/UserPackageWrapper.java
+++ b/src/com/android/settings/wrapper/UserPackageWrapper.java
@@ -12,20 +12,16 @@
  * permissions and limitations under the License.
  */
 
-package com.android.settings.webview;
+package com.android.settings.wrapper;
 
-import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.content.pm.UserInfo;
-import android.webkit.UserPackage;
-
-import java.util.List;
 
 /**
  * Wrapper class around android.webkit.UserPackage - to be able to use UserPackage in Robolectric
  * tests (such tests currently don't support mocking hidden classes).
  */
-interface UserPackageWrapper {
+public interface UserPackageWrapper {
     UserInfo getUserInfo();
     PackageInfo getPackageInfo();
     boolean isEnabledPackage();
diff --git a/src/com/android/settings/webview/UserPackageWrapperImpl.java b/src/com/android/settings/wrapper/UserPackageWrapperImpl.java
similarity index 83%
rename from src/com/android/settings/webview/UserPackageWrapperImpl.java
rename to src/com/android/settings/wrapper/UserPackageWrapperImpl.java
index 1ea7c2e..0a2b9cd 100644
--- a/src/com/android/settings/webview/UserPackageWrapperImpl.java
+++ b/src/com/android/settings/wrapper/UserPackageWrapperImpl.java
@@ -12,23 +12,19 @@
  * permissions and limitations under the License.
  */
 
-package com.android.settings.webview;
+package com.android.settings.wrapper;
 
-import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.content.pm.UserInfo;
 import android.webkit.UserPackage;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * Default implementation of UserPackageWrapper.
  */
-class UserPackageWrapperImpl implements UserPackageWrapper {
+public class UserPackageWrapperImpl implements UserPackageWrapper {
     private final UserPackage mUserPackage;
 
-    UserPackageWrapperImpl(UserPackage userPackage) {
+    public UserPackageWrapperImpl(UserPackage userPackage) {
         mUserPackage = userPackage;
     }
 
diff --git a/src/com/android/settings/dashboard/suggestions/WallpaperManagerWrapper.java b/src/com/android/settings/wrapper/WallpaperManagerWrapper.java
similarity index 94%
rename from src/com/android/settings/dashboard/suggestions/WallpaperManagerWrapper.java
rename to src/com/android/settings/wrapper/WallpaperManagerWrapper.java
index 9efe4fe..89015e5 100644
--- a/src/com/android/settings/dashboard/suggestions/WallpaperManagerWrapper.java
+++ b/src/com/android/settings/wrapper/WallpaperManagerWrapper.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.dashboard.suggestions;
+package com.android.settings.wrapper;
 
 import android.app.WallpaperManager;
 import android.content.Context;
diff --git a/src/com/android/settings/wifi/WifiManagerWrapper.java b/src/com/android/settings/wrapper/WifiManagerWrapper.java
similarity index 93%
rename from src/com/android/settings/wifi/WifiManagerWrapper.java
rename to src/com/android/settings/wrapper/WifiManagerWrapper.java
index 69b5ee9..e24f5eb 100644
--- a/src/com/android/settings/wifi/WifiManagerWrapper.java
+++ b/src/com/android/settings/wrapper/WifiManagerWrapper.java
@@ -1,4 +1,4 @@
-package com.android.settings.wifi;
+package com.android.settings.wrapper;
 
 import android.net.wifi.WifiManager;