diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 46c6490d880..44555db8b0a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -72,6 +72,7 @@ + diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg index bbc1f689c71..62a2e434793 100644 --- a/PREUPLOAD.cfg +++ b/PREUPLOAD.cfg @@ -1,4 +1,5 @@ [Hook Scripts] checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT} -fw src/com/android/settings/print/ +checkcolor_hook = ${REPO_ROOT}/prebuilts/checkcolor/checkcolor.py -p . diff --git a/color-check-baseline.xml b/color-check-baseline.xml new file mode 100644 index 00000000000..cbcdf48ddea --- /dev/null +++ b/color-check-baseline.xml @@ -0,0 +1,2484 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/xml/app_and_notification_new_advance_button.xml b/res/xml/app_and_notification_new_advance_button.xml new file mode 100644 index 00000000000..c7b91e867eb --- /dev/null +++ b/res/xml/app_and_notification_new_advance_button.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/xml/display_settings_new_advance_button.xml b/res/xml/display_settings_new_advance_button.xml new file mode 100644 index 00000000000..c7cf50590e9 --- /dev/null +++ b/res/xml/display_settings_new_advance_button.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/xml/language_and_input_new_advance_button.xml b/res/xml/language_and_input_new_advance_button.xml new file mode 100644 index 00000000000..e5ae674f552 --- /dev/null +++ b/res/xml/language_and_input_new_advance_button.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/xml/sound_settings_new_advance_button.xml b/res/xml/sound_settings_new_advance_button.xml new file mode 100644 index 00000000000..6b0ba0e81a7 --- /dev/null +++ b/res/xml/sound_settings_new_advance_button.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java index 86c3da16ba6..b5f848c630d 100644 --- a/src/com/android/settings/DisplaySettings.java +++ b/src/com/android/settings/DisplaySettings.java @@ -73,7 +73,8 @@ public class DisplaySettings extends DashboardFragment { @Override protected int getPreferenceScreenResId() { - return R.xml.display_settings; + return mProgressiveDisclosureMixin.isEnabled() + ? R.xml.display_settings : R.xml.display_settings_new_advance_button; } @Override diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index fa61cecdf2f..89724ccb34b 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -110,9 +110,8 @@ import com.android.internal.app.UnlaunchableAppActivity; 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 final class Utils extends com.android.settingslib.Utils { } } - 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 b5133d3b320..068847f00a5 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.R; 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 @@ public class RemoveAccountPreferenceController extends AbstractPreferenceControl 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 d0d99ea6533..00000000000 --- 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/AppAndNotificationDashboardFragment.java b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java index d3063536c47..204e120eb86 100644 --- a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java +++ b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java @@ -60,7 +60,8 @@ public class AppAndNotificationDashboardFragment extends DashboardFragment { @Override protected int getPreferenceScreenResId() { - return R.xml.app_and_notification; + return mProgressiveDisclosureMixin.isEnabled() + ? R.xml.app_and_notification : R.xml.app_and_notification_new_advance_button; } @Override diff --git a/src/com/android/settings/applications/AppCounter.java b/src/com/android/settings/applications/AppCounter.java index 8c7aed7aefa..a02ecfa70fa 100644 --- a/src/com/android/settings/applications/AppCounter.java +++ b/src/com/android/settings/applications/AppCounter.java @@ -22,6 +22,8 @@ import android.os.AsyncTask; import android.os.UserHandle; import android.os.UserManager; +import com.android.settingslib.wrapper.PackageManagerWrapper; + import java.util.List; public abstract class AppCounter extends AsyncTask { diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java index a5daee26564..b06c070c53f 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.SettingsActivity; 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 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment .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 425afa0fd07..f1a3be91dbe 100644 --- a/src/com/android/settings/applications/AppLister.java +++ b/src/com/android/settings/applications/AppLister.java @@ -23,6 +23,8 @@ import android.os.AsyncTask; 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 896102cb124..6ec32a3fdf5 100755 --- a/src/com/android/settings/applications/AppStateAppOpsBridge.java +++ b/src/com/android/settings/applications/AppStateAppOpsBridge.java @@ -31,6 +31,7 @@ import android.util.SparseArray; 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 abstract class AppStateAppOpsBridge extends AppStateBaseBridge { 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 c7d0a627268..a1bf14edb52 100644 --- a/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounter.java +++ b/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounter.java @@ -22,7 +22,9 @@ import android.os.Build; 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 b21f31f3a7d..dd5a8076462 100644 --- a/src/com/android/settings/applications/AppWithAdminGrantedPermissionsLister.java +++ b/src/com/android/settings/applications/AppWithAdminGrantedPermissionsLister.java @@ -18,7 +18,9 @@ package com.android.settings.applications; 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 10b61c5570b..5323cd5e58b 100644 --- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java @@ -29,7 +29,9 @@ import android.util.ArraySet; 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 9dd1b33b80b..00000000000 --- 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 af5f37868d9..00000000000 --- 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 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 932facee6f5..26372ee577e 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.ResolveInfo; 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 209cd22b972..2f44d3ec3f1 100755 --- a/src/com/android/settings/applications/InstalledAppDetails.java +++ b/src/com/android/settings/applications/InstalledAppDetails.java @@ -24,7 +24,6 @@ import android.app.ActivityManager; 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.applications.StorageStatsSource.AppStorageStats; 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 @@ public class InstalledAppDetails extends AppInfoBase 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 d8e7c58d3d9..3312d3ebce3 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.ApplicationInfo; 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 11eb0ccefd1..a9e3ae26def 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.AppFilter; 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; @@ -117,6 +118,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment public static final String EXTRA_VOLUME_NAME = "volumeName"; public static final String EXTRA_STORAGE_TYPE = "storageType"; public static final String EXTRA_WORK_ONLY = "workProfileOnly"; + public static final String EXTRA_WORK_ID = "workId"; private static final String EXTRA_SORT_ORDER = "sortOrder"; private static final String EXTRA_SHOW_SYSTEM = "showSystem"; @@ -222,6 +224,8 @@ public class ManageApplications extends InstrumentedPreferenceFragment public static final int STORAGE_TYPE_LEGACY = 2; // Show apps even if they can be categorized. public static final int STORAGE_TYPE_PHOTOS_VIDEOS = 3; + private static final int NO_USER_SPECIFIED = -1; + // sort order private int mSortOrder = R.id.sort_order_alpha; @@ -282,6 +286,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment private String mVolumeUuid; private int mStorageType; private boolean mIsWorkOnly; + private int mWorkUserId; @Override public void onCreate(Bundle savedInstanceState) { @@ -338,6 +343,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment } mFilter = getDefaultFilter(); mIsWorkOnly = args != null ? args.getBoolean(EXTRA_WORK_ONLY) : false; + mWorkUserId = args != null ? args.getInt(EXTRA_WORK_ID) : NO_USER_SPECIFIED; if (savedInstanceState != null) { mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder); @@ -378,13 +384,15 @@ public class ManageApplications extends InstrumentedPreferenceFragment mApplications.mHasReceivedBridgeCallback = savedInstanceState.getBoolean(EXTRA_HAS_BRIDGE, false); } + int userId = mIsWorkOnly ? mWorkUserId : UserHandle.getUserId(mCurrentUid); if (mStorageType == STORAGE_TYPE_MUSIC) { Context context = getContext(); - mApplications.setExtraViewController(new MusicViewHolderController( - context, - new StorageStatsSource(context), - mVolumeUuid, - UserHandle.of(UserHandle.getUserId(mCurrentUid)))); + mApplications.setExtraViewController( + new MusicViewHolderController( + context, + new StorageStatsSource(context), + mVolumeUuid, + UserHandle.of(userId))); } else if (mStorageType == STORAGE_TYPE_PHOTOS_VIDEOS) { Context context = getContext(); mApplications.setExtraViewController( @@ -392,7 +400,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment context, new StorageStatsSource(context), mVolumeUuid, - UserHandle.of(UserHandle.getUserId(mCurrentUid)))); + UserHandle.of(userId))); } mListView.setAdapter(mApplications); mListView.setRecyclerListener(mApplications); @@ -888,7 +896,6 @@ public class ManageApplications extends InstrumentedPreferenceFragment 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 +945,6 @@ public class ManageApplications extends InstrumentedPreferenceFragment mManageApplications.mListContainer ); mContext = manageApplications.getActivity(); - mPm = mContext.getPackageManager(); mFilterMode = filterMode; if (mManageApplications.mListType == LIST_TYPE_NOTIFICATION) { mExtraInfoBridge = new AppStateNotificationBridge(mContext, mState, this, @@ -1491,7 +1497,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment 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 f290d43b831..ee802dd5d9e 100644 --- a/src/com/android/settings/applications/NotificationApps.java +++ b/src/com/android/settings/applications/NotificationApps.java @@ -21,6 +21,7 @@ import android.content.pm.ApplicationInfo; 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 @@ public class NotificationApps extends ManageApplications { 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 580b578da73..00000000000 --- 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 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 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 homeActivities); - - /** - * Calls {@code PackageManager.queryIntentServicesAsUser} - */ - List 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 a47137c069f..00000000000 --- 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 getInstalledApplicationsAsUser(int flags, int userId) { - return mPm.getInstalledApplicationsAsUser(flags, userId); - } - - @Override - public boolean hasSystemFeature(String name) { - return mPm.hasSystemFeature(name); - } - - @Override - public List 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 homeActivities) { - return mPm.getHomeActivities(homeActivities); - } - - @Override - public List 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 b1c544ad089..d8e0b2bf8fc 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.annotations.VisibleForTesting; 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 @@ public class PictureInPictureSettings extends EmptyTextSettings { 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 69a36f67a53..b6ae1ee54fc 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.Utils; 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 @@ public class RecentAppsPreferenceController extends AbstractPreferenceController 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 5b4ed2aa05f..00000000000 --- 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 getUsers(); -} diff --git a/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java b/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java index f51275e23ea..c1fc5286630 100644 --- a/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java +++ b/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java @@ -24,9 +24,9 @@ import android.text.TextUtils; 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 12470eb3ab7..ec44af4f872 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.graphics.drawable.Drawable; 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 d3617ef8869..6eb1ad81b57 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java +++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java @@ -29,11 +29,10 @@ import android.util.Pair; 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 @@ public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment @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 c7b450e00d2..d533d0f4993 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.text.TextUtils; 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 abstract class DefaultAppPreferenceController extends AbstractPreferenceC 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 1fd10ffea72..30aaf646ccd 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.provider.Settings; 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 class DefaultAutofillPreferenceController extends DefaultAppPreferenceCon 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 88b36b25dda..1b229e8d3ed 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.ActivityInfo; 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 16956dfbd3b..28e612c98ff 100644 --- a/src/com/android/settings/applications/instantapps/InstantAppButtonsController.java +++ b/src/com/android/settings/applications/instantapps/InstantAppButtonsController.java @@ -29,9 +29,8 @@ import android.widget.Button; 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 @@ public class InstantAppButtonsController implements DialogInterface.OnClickListe 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/bluetooth/BluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java index 147021402ea..04e9f5a6803 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java @@ -51,8 +51,9 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController } protected void setHeaderProperties() { - final Pair pair = Utils.getBtClassDrawableWithDescription - (mContext, mCachedDevice); + final Pair pair = Utils.getBtClassDrawableWithDescription( + mContext, mCachedDevice, + mContext.getResources().getFraction(R.fraction.bt_battery_scale_fraction, 1, 1)); String summaryText = mCachedDevice.getConnectionSummary(); mHeaderController.setLabel(mCachedDevice.getName()); mHeaderController.setIcon(pair.first); diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java index e80237ebc6d..0ecf62d20a1 100755 --- a/src/com/android/settings/bluetooth/Utils.java +++ b/src/com/android/settings/bluetooth/Utils.java @@ -156,28 +156,36 @@ public final class Utils { static Pair getBtClassDrawableWithDescription(Context context, CachedBluetoothDevice cachedDevice) { + return getBtClassDrawableWithDescription(context, cachedDevice, 1 /* iconScale */); + } + + static Pair getBtClassDrawableWithDescription(Context context, + CachedBluetoothDevice cachedDevice, float iconScale) { BluetoothClass btClass = cachedDevice.getBtClass(); final int level = cachedDevice.getBatteryLevel(); if (btClass != null) { switch (btClass.getMajorDeviceClass()) { case BluetoothClass.Device.Major.COMPUTER: - return new Pair<>(getBluetoothDrawable(context, R.drawable.ic_bt_laptop, level), + return new Pair<>(getBluetoothDrawable(context, R.drawable.ic_bt_laptop, level, + iconScale), context.getString(R.string.bluetooth_talkback_computer)); case BluetoothClass.Device.Major.PHONE: return new Pair<>( - getBluetoothDrawable(context, R.drawable.ic_bt_cellphone, level), + getBluetoothDrawable(context, R.drawable.ic_bt_cellphone, level, + iconScale), context.getString(R.string.bluetooth_talkback_phone)); case BluetoothClass.Device.Major.PERIPHERAL: return new Pair<>( getBluetoothDrawable(context, HidProfile.getHidClassDrawable(btClass), - level), + level, iconScale), context.getString(R.string.bluetooth_talkback_input_peripheral)); case BluetoothClass.Device.Major.IMAGING: return new Pair<>( - getBluetoothDrawable(context, R.drawable.ic_settings_print, level), + getBluetoothDrawable(context, R.drawable.ic_settings_print, level, + iconScale), context.getString(R.string.bluetooth_talkback_imaging)); default: @@ -189,30 +197,34 @@ public final class Utils { for (LocalBluetoothProfile profile : profiles) { int resId = profile.getDrawableResource(btClass); if (resId != 0) { - return new Pair<>(getBluetoothDrawable(context, resId, level), null); + return new Pair<>(getBluetoothDrawable(context, resId, level, iconScale), null); } } if (btClass != null) { if (btClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET)) { return new Pair<>( - getBluetoothDrawable(context, R.drawable.ic_bt_headset_hfp, level), + getBluetoothDrawable(context, R.drawable.ic_bt_headset_hfp, level, + iconScale), context.getString(R.string.bluetooth_talkback_headset)); } if (btClass.doesClassMatch(BluetoothClass.PROFILE_A2DP)) { return new Pair<>( - getBluetoothDrawable(context, R.drawable.ic_bt_headphones_a2dp, level), + getBluetoothDrawable(context, R.drawable.ic_bt_headphones_a2dp, level, + iconScale), context.getString(R.string.bluetooth_talkback_headphone)); } } - return new Pair<>(getBluetoothDrawable(context, R.drawable.ic_settings_bluetooth, level), + return new Pair<>( + getBluetoothDrawable(context, R.drawable.ic_settings_bluetooth, level, iconScale), context.getString(R.string.bluetooth_talkback_bluetooth)); } @VisibleForTesting static Drawable getBluetoothDrawable(Context context, @DrawableRes int resId, - int batteryLevel) { + int batteryLevel, float iconScale) { if (batteryLevel != BluetoothDevice.BATTERY_LEVEL_UNKNOWN) { - return BluetoothDeviceLayerDrawable.createLayerDrawable(context, resId, batteryLevel); + return BluetoothDeviceLayerDrawable.createLayerDrawable(context, resId, batteryLevel, + iconScale); } else if (resId != 0) { return context.getDrawable(resId); } else { diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java index 884696c3350..8ee61c6fd0a 100644 --- a/src/com/android/settings/core/gateway/SettingsGateway.java +++ b/src/com/android/settings/core/gateway/SettingsGateway.java @@ -285,6 +285,7 @@ public class SettingsGateway { // Home page > Apps & Notifications Settings.UserSettingsActivity.class.getName(), Settings.ConfigureNotificationSettingsActivity.class.getName(), + Settings.AdvancedAppsActivity.class.getName(), Settings.ManageApplicationsActivity.class.getName(), Settings.PaymentSettingsActivity.class.getName(), // Home page > Security & screen lock diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java index fff70023371..741067ac92c 100644 --- a/src/com/android/settings/dashboard/DashboardAdapter.java +++ b/src/com/android/settings/dashboard/DashboardAdapter.java @@ -30,6 +30,7 @@ import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -47,6 +48,7 @@ import com.android.settings.dashboard.conditional.ConditionAdapter; import com.android.settings.dashboard.suggestions.SuggestionAdapter; import com.android.settings.dashboard.suggestions.SuggestionDismissController; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; +import com.android.settings.dashboard.suggestions.SuggestionLogHelper; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.Utils; import com.android.settingslib.drawer.DashboardCategory; @@ -159,7 +161,8 @@ public class DashboardAdapter extends RecyclerView.Adapter[] getSuggestionTaggedData() { + return SuggestionLogHelper.getSuggestionTaggedData( + mSuggestionFeatureProvider.isSmartSuggestionEnabled(mContext)); + } + public static class IconCache { private final Context mContext; private final ArrayMap mMap = new ArrayMap<>(); diff --git a/src/com/android/settings/dashboard/DashboardData.java b/src/com/android/settings/dashboard/DashboardData.java index 920386aeb69..414757e48dd 100644 --- a/src/com/android/settings/dashboard/DashboardData.java +++ b/src/com/android/settings/dashboard/DashboardData.java @@ -198,15 +198,22 @@ public class DashboardData { final int hiddenSuggestion = hasSuggestions ? sizeOf(mSuggestions) - sizeOf(suggestions) : 0; + final boolean hasSuggestionAndCollapsed = hasSuggestions + && mSuggestionConditionMode == HEADER_MODE_COLLAPSED; + final boolean onlyHasConditionAndCollapsed = !hasSuggestions + && hasConditions + && mSuggestionConditionMode != HEADER_MODE_FULLY_EXPANDED; + /* Top suggestion/condition header. This will be present when there is any suggestion - * and the mode is collapsed, or it only has conditions and the mode is not fully - * expanded. */ + * and the mode is collapsed */ addToItemList(new SuggestionConditionHeaderData(conditions, hiddenSuggestion), R.layout.suggestion_condition_header, - STABLE_ID_SUGGESTION_CONDITION_TOP_HEADER, - hasSuggestions && mSuggestionConditionMode == HEADER_MODE_COLLAPSED - || !hasSuggestions && hasConditions - && mSuggestionConditionMode != HEADER_MODE_FULLY_EXPANDED); + STABLE_ID_SUGGESTION_CONDITION_TOP_HEADER, hasSuggestionAndCollapsed); + + /* Use mid header if there is only condition & it's in collapsed mode */ + addToItemList(new SuggestionConditionHeaderData(conditions, hiddenSuggestion), + R.layout.suggestion_condition_header, + STABLE_ID_SUGGESTION_CONDITION_MIDDLE_HEADER, onlyHasConditionAndCollapsed); /* Suggestion container. This is the card view that contains the list of suggestions. * This will be added whenever the suggestion list is not empty */ diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java index be5fbdf15f7..6caf052bc60 100644 --- a/src/com/android/settings/dashboard/DashboardSummary.java +++ b/src/com/android/settings/dashboard/DashboardSummary.java @@ -38,6 +38,7 @@ import com.android.settings.dashboard.conditional.FocusRecyclerView; import com.android.settings.dashboard.conditional.FocusRecyclerView.FocusListener; import com.android.settings.dashboard.suggestions.SuggestionDismissController; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; +import com.android.settings.dashboard.suggestions.SuggestionControllerMixin; import com.android.settings.dashboard.suggestions.SuggestionsChecks; import com.android.settings.overlay.FeatureFactory; import com.android.settings.widget.ActionBarShadowController; @@ -60,7 +61,6 @@ public class DashboardSummary extends InstrumentedFragment private static final int MAX_WAIT_MILLIS = 700; private static final String TAG = "DashboardSummary"; - private static final String EXTRA_SCROLL_POSITION = "scroll_position"; private final Handler mHandler = new Handler(); @@ -72,6 +72,7 @@ public class DashboardSummary extends InstrumentedFragment private SuggestionParser mSuggestionParser; private LinearLayoutManager mLayoutManager; private SuggestionsChecks mSuggestionsChecks; + private SuggestionControllerMixin mSuggestionControllerMixin; private DashboardFeatureProvider mDashboardFeatureProvider; private SuggestionFeatureProvider mSuggestionFeatureProvider; private boolean isOnCategoriesChangedCalled; @@ -82,6 +83,12 @@ public class DashboardSummary extends InstrumentedFragment return MetricsEvent.DASHBOARD_SUMMARY; } + @Override + public void onAttach(Context context) { + super.onAttach(context); + mSuggestionControllerMixin = new SuggestionControllerMixin(context, getLifecycle()); + } + @Override public void onCreate(Bundle savedInstanceState) { long startTime = System.currentTimeMillis(); @@ -196,7 +203,7 @@ public class DashboardSummary extends InstrumentedFragment mDashboard.setHasFixedSize(true); mDashboard.setListener(this); mAdapter = new DashboardAdapter(getContext(), bundle, mConditionManager.getConditions(), - mSuggestionParser, this /* SuggestionDismissController.Callback */); + mSuggestionParser, this /* SuggestionDismissController.Callback */); mDashboard.setAdapter(mAdapter); mDashboard.setItemAnimator(new DashboardItemAnimator()); mSummaryLoader.setSummaryConsumer(mAdapter); diff --git a/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java b/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java index 92055be3764..3dfffccb801 100644 --- a/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java +++ b/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java @@ -24,6 +24,7 @@ import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; import android.support.v7.preference.PreferenceScreen; import android.text.TextUtils; +import android.util.FeatureFlagUtils; import android.util.Log; import com.android.internal.logging.nano.MetricsProto; @@ -42,6 +43,8 @@ import java.util.List; public class ProgressiveDisclosureMixin implements Preference.OnPreferenceClickListener, LifecycleObserver, OnCreate, OnSaveInstanceState { + @VisibleForTesting + static final String FEATURE_FLAG_NEW_ADVANCE_BUTTON = "new_settings_advance_button"; private static final String TAG = "ProgressiveDisclosure"; private static final String STATE_USER_EXPANDED = "state_user_expanded"; private static final int DEFAULT_TILE_LIMIT = 300; @@ -102,11 +105,17 @@ public class ProgressiveDisclosureMixin implements Preference.OnPreferenceClickL return false; } + public boolean isEnabled() { + return !FeatureFlagUtils.isEnabled(FEATURE_FLAG_NEW_ADVANCE_BUTTON); + } + /** * Sets the threshold to start collapsing preferences when there are too many. */ public void setTileLimit(int limit) { - mTileLimit = limit; + if (isEnabled()) { + mTileLimit = limit; + } } /** diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java index 2c9da4124b1..3815211c475 100644 --- a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java +++ b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java @@ -18,6 +18,7 @@ package com.android.settings.dashboard.suggestions; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -67,11 +68,12 @@ public class SuggestionAdapter extends RecyclerView.Adapter public void onBindViewHolder(DashboardItemHolder holder, int position) { final Tile suggestion = (Tile) mSuggestions.get(position); final String suggestionId = mSuggestionFeatureProvider.getSuggestionIdentifier( - mContext, suggestion); + mContext, suggestion); // This is for cases when a suggestion is dismissed and the next one comes to view if (!mSuggestionsShownLogged.contains(suggestionId)) { mMetricsFeatureProvider.action( - mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, suggestionId); + mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, suggestionId, + getSuggestionTaggedData()); mSuggestionsShownLogged.add(suggestionId); } if (suggestion.remoteViews != null) { @@ -102,9 +104,11 @@ public class SuggestionAdapter extends RecyclerView.Adapter // set the item view to disabled to remove any touch effects holder.itemView.setEnabled(false); } + clickHandler.setOnClickListener(v -> { mMetricsFeatureProvider.action(mContext, - MetricsEvent.ACTION_SETTINGS_SUGGESTION, suggestionId); + MetricsEvent.ACTION_SETTINGS_SUGGESTION, suggestionId, + getSuggestionTaggedData()); ((SettingsActivity) mContext).startSuggestion(suggestion.intent); }); } @@ -129,7 +133,7 @@ public class SuggestionAdapter extends RecyclerView.Adapter public Tile getSuggestion(int position) { final long itemId = getItemId(position); - for (Tile tile: mSuggestions) { + for (Tile tile : mSuggestions) { if (Objects.hash(tile.title) == itemId) { return tile; } @@ -141,4 +145,10 @@ public class SuggestionAdapter extends RecyclerView.Adapter mSuggestions.remove(suggestion); notifyDataSetChanged(); } + + private Pair[] getSuggestionTaggedData() { + return SuggestionLogHelper.getSuggestionTaggedData( + mSuggestionFeatureProvider.isSmartSuggestionEnabled(mContext)); + } + } diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionController.java b/src/com/android/settings/dashboard/suggestions/SuggestionController.java new file mode 100644 index 00000000000..ac20433bc69 --- /dev/null +++ b/src/com/android/settings/dashboard/suggestions/SuggestionController.java @@ -0,0 +1,146 @@ +/* + * 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.dashboard.suggestions; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.IBinder; +import android.os.RemoteException; +import android.service.settings.suggestions.ISuggestionService; +import android.service.settings.suggestions.Suggestion; +import android.support.annotation.Nullable; +import android.support.annotation.WorkerThread; +import android.util.Log; + +import java.util.List; + +/** + * A controller class to access suggestion data. + */ +public class SuggestionController { + + /** + * Callback interface when service is connected/disconnected. + */ + public interface ServiceConnectionListener { + /** + * Called when service is connected. + */ + void onServiceConnected(); + + /** + * Called when service is disconnected. + */ + void onServiceDisconnected(); + } + + private static final String TAG = "SuggestionController"; + private static final boolean DEBUG = false; + + private final Context mContext; + private final Intent mServiceIntent; + + private ServiceConnection mServiceConnection; + private ISuggestionService mRemoteService; + private ServiceConnectionListener mConnectionListener; + + /** + * Create a new controller instance. + * + * @param context caller context + * @param service The component name for service. + * @param listener listener to receive service connected/disconnected event. + */ + public SuggestionController(Context context, ComponentName service, + ServiceConnectionListener listener) { + mContext = context.getApplicationContext(); + mConnectionListener = listener; + mServiceIntent = new Intent().setComponent(service); + mServiceConnection = createServiceConnection(); + } + + /** + * Start the controller. + */ + public void start() { + mContext.bindServiceAsUser(mServiceIntent, mServiceConnection, Context.BIND_AUTO_CREATE, + android.os.Process.myUserHandle()); + } + + /** + * Stop the controller. + */ + public void stop() { + if (mRemoteService != null) { + mRemoteService = null; + mContext.unbindService(mServiceConnection); + } + } + + /** + * Get setting suggestions. + */ + @Nullable + @WorkerThread + public List getSuggestions() { + if (!isReady()) { + return null; + } + try { + return mRemoteService.getSuggestions(); + } catch (RemoteException e) { + Log.w(TAG, "Error when calling getSuggestion()", e); + return null; + } + } + + /** + * Whether or not the manager is ready + */ + private boolean isReady() { + return mRemoteService != null; + } + + /** + * Create a new {@link ServiceConnection} object to handle service connect/disconnect event. + */ + private ServiceConnection createServiceConnection() { + return new ServiceConnection() { + + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + if (DEBUG) { + Log.d(TAG, "Service is connected"); + } + mRemoteService = ISuggestionService.Stub.asInterface(service); + if (mConnectionListener != null) { + mConnectionListener.onServiceConnected(); + } + } + + @Override + public void onServiceDisconnected(ComponentName name) { + if (mConnectionListener != null) { + mRemoteService = null; + mConnectionListener.onServiceDisconnected(); + } + } + }; + } +} diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionControllerMixin.java b/src/com/android/settings/dashboard/suggestions/SuggestionControllerMixin.java new file mode 100644 index 00000000000..6f5c82eddff --- /dev/null +++ b/src/com/android/settings/dashboard/suggestions/SuggestionControllerMixin.java @@ -0,0 +1,92 @@ +/* + * 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.dashboard.suggestions; + +import android.content.ComponentName; +import android.content.Context; +import android.service.settings.suggestions.Suggestion; +import android.support.annotation.VisibleForTesting; +import android.util.FeatureFlagUtils; +import android.util.Log; + +import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; + +import java.util.List; + +/** + * Manages IPC communication to SettingsIntelligence for suggestion related services. + */ +public class SuggestionControllerMixin implements SuggestionController.ServiceConnectionListener, + LifecycleObserver, OnStart, OnStop { + + @VisibleForTesting + static final String FEATURE_FLAG = "new_settings_suggestion"; + private static final String TAG = "SuggestionCtrlMixin"; + private static final boolean DEBUG = false; + + private final Context mContext; + private final SuggestionController mSuggestionController; + + public static boolean isEnabled() { + return FeatureFlagUtils.isEnabled(FEATURE_FLAG); + } + + public SuggestionControllerMixin(Context context, Lifecycle lifecycle) { + mContext = context.getApplicationContext(); + mSuggestionController = new SuggestionController(context, + new ComponentName( + "com.android.settings.intelligence", + "com.android.settings.intelligence.suggestions.SuggestionService"), + this /* serviceConnectionListener */); + if (lifecycle != null) { + lifecycle.addObserver(this); + } + } + + @Override + public void onStart() { + if (!isEnabled()) { + Log.w(TAG, "Feature not enabled, skipping"); + return; + } + mSuggestionController.start(); + } + + @Override + public void onStop() { + mSuggestionController.stop(); + } + + @Override + public void onServiceConnected() { + // TODO: Call API to get data from a loader instead of in current thread. + final List data = mSuggestionController.getSuggestions(); + if (DEBUG) { + Log.d(TAG, "data size " + (data == null ? 0 : data.size())); + } + } + + @Override + public void onServiceDisconnected() { + if (DEBUG) { + Log.d(TAG, "SuggestionService disconnected"); + } + } +} diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java index f8b5a8b6a60..3d40d96d4e4 100644 --- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java @@ -26,8 +26,9 @@ import android.provider.Settings.Secure; import android.support.annotation.NonNull; import android.support.annotation.VisibleForTesting; import android.util.Log; +import android.util.Pair; -import com.android.internal.logging.nano.MetricsProto; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.Settings.AmbientDisplayPickupSuggestionActivity; import com.android.settings.Settings.AmbientDisplaySuggestionActivity; import com.android.settings.Settings.DoubleTapPowerSuggestionActivity; @@ -45,6 +46,7 @@ import com.android.settings.support.NewDeviceIntroSuggestionActivity; import com.android.settingslib.drawer.Tile; import com.android.settingslib.suggestions.SuggestionParser; +import java.util.ArrayList; import java.util.List; public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider { @@ -130,10 +132,13 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider if (parser == null || suggestion == null || context == null) { return; } - mMetricsFeatureProvider.action( - context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION, - getSuggestionIdentifier(context, suggestion)); + final Pair[] taggedData = + SuggestionLogHelper.getSuggestionTaggedData(isSmartSuggestionEnabled(context)); + mMetricsFeatureProvider.action( + context, MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION, + getSuggestionIdentifier(context, suggestion), + taggedData); if (!parser.dismissSuggestion(suggestion)) { return; } diff --git a/src/com/android/settings/wifi/ConnectivityManagerWrapper.java b/src/com/android/settings/dashboard/suggestions/SuggestionLogHelper.java similarity index 53% rename from src/com/android/settings/wifi/ConnectivityManagerWrapper.java rename to src/com/android/settings/dashboard/suggestions/SuggestionLogHelper.java index 73176663cc6..339392fa780 100644 --- a/src/com/android/settings/wifi/ConnectivityManagerWrapper.java +++ b/src/com/android/settings/dashboard/suggestions/SuggestionLogHelper.java @@ -13,24 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.settings.wifi; +package com.android.settings.dashboard.suggestions; -import android.net.ConnectivityManager; +import android.util.Pair; -/** - * Wrapper around {@link ConnectivityManager} to facilitate unit testing. - */ -public class ConnectivityManagerWrapper { - private final ConnectivityManager mConnectivityManager; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; - public ConnectivityManagerWrapper(ConnectivityManager connectivityManager) { - mConnectivityManager = connectivityManager; - } +public class SuggestionLogHelper { - /** - * {@link ConnectivityManager#stopTethering} - */ - public void stopTethering(int type) { - mConnectivityManager.stopTethering(type); + public static Pair[] getSuggestionTaggedData(boolean enabled) { + return new Pair[]{ + Pair.create( + MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, enabled ? 1 : 0)}; } } diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java b/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java index 4bed89b644c..eb969a55f8d 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.Utils; 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 36d9d0f6e65..5470e6372db 100644 --- a/src/com/android/settings/datausage/AppDataUsage.java +++ b/src/com/android/settings/datausage/AppDataUsage.java @@ -46,14 +46,13 @@ import android.widget.AdapterView; 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 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen @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/development/CameraHalHdrplusPreferenceController.java b/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java index a4f087a97f2..e8e2c2d8da1 100644 --- a/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java +++ b/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java @@ -102,6 +102,6 @@ public class CameraHalHdrplusPreferenceController extends AbstractPreferenceCont } private boolean isHalHdrplusEnabled() { - return SystemProperties.getBoolean(PROPERTY_CAMERA_HAL_HDRPLUS, true); + return SystemProperties.getBoolean(PROPERTY_CAMERA_HAL_HDRPLUS, false); } } diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index 919dc3a4bef..576829946ed 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -32,8 +32,10 @@ import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.widget.SwitchBar; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.development.DevelopmentSettingsEnabler; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -116,7 +118,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra @Override protected List getPreferenceControllers(Context context) { - return buildPreferenceControllers(context); + return buildPreferenceControllers(context, getLifecycle()); } void onEnableDevelopmentOptionsConfirmed() { @@ -129,8 +131,12 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra mSwitchBar.setChecked(false); } - private static List buildPreferenceControllers(Context context) { - return null; + private static List buildPreferenceControllers(Context context, + Lifecycle lifecycle) { + final List controllers = new ArrayList<>(); + controllers.add(new StayAwakePreferenceController(context, lifecycle)); + + return controllers; } /** @@ -156,7 +162,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra @Override public List getPreferenceControllers(Context context) { - return buildPreferenceControllers(context); + return buildPreferenceControllers(context, null /* lifecycle */); } }; } diff --git a/src/com/android/settings/development/StayAwakePreferenceController.java b/src/com/android/settings/development/StayAwakePreferenceController.java new file mode 100644 index 00000000000..ebba9e51496 --- /dev/null +++ b/src/com/android/settings/development/StayAwakePreferenceController.java @@ -0,0 +1,139 @@ +package com.android.settings.development; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.ContentObserver; +import android.net.Uri; +import android.os.BatteryManager; +import android.os.Handler; +import android.provider.Settings; +import android.support.annotation.VisibleForTesting; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; + +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.RestrictedSwitchPreference; +import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnPause; +import com.android.settingslib.core.lifecycle.events.OnResume; + + +public class StayAwakePreferenceController extends AbstractPreferenceController implements + PreferenceControllerMixin, Preference.OnPreferenceChangeListener, LifecycleObserver, + OnResume, OnPause { + + private static final String TAG = "StayAwakeCtrl"; + private static final String PREFERENCE_KEY = "keep_screen_on"; + @VisibleForTesting + static final int SETTING_VALUE_OFF = 0; + @VisibleForTesting + static final int SETTING_VALUE_ON = + BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB + | BatteryManager.BATTERY_PLUGGED_WIRELESS; + @VisibleForTesting + SettingsObserver mSettingsObserver; + + private RestrictedSwitchPreference mPreference; + + public StayAwakePreferenceController(Context context, Lifecycle lifecycle) { + super(context); + mSettingsObserver = new SettingsObserver(); + + if (lifecycle != null) { + lifecycle.addObserver(this); + } + } + + @Override + public boolean isAvailable() { + return true; + } + + @Override + public String getPreferenceKey() { + return PREFERENCE_KEY; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = (RestrictedSwitchPreference) screen.findPreference(getPreferenceKey()); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + final boolean stayAwake = (Boolean) newValue; + Settings.Global.putInt(mContext.getContentResolver(), + Settings.Global.STAY_ON_WHILE_PLUGGED_IN, + stayAwake ? SETTING_VALUE_ON : SETTING_VALUE_OFF); + return true; + } + + @Override + public void updateState(Preference preference) { + final RestrictedLockUtils.EnforcedAdmin admin = checkIfMaximumTimeToLockSetByAdmin(); + if (admin != null) { + mPreference.setDisabledByAdmin(admin); + return; + } + + final int stayAwakeMode = Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.STAY_ON_WHILE_PLUGGED_IN, + SETTING_VALUE_OFF); + mPreference.setChecked(stayAwakeMode != SETTING_VALUE_OFF); + } + + @Override + public void onResume() { + if (mPreference != null) { + mSettingsObserver.register(true /* register */); + } + } + + @Override + public void onPause() { + if (mPreference != null) { + mSettingsObserver.register(false /* unregister */); + } + } + + @VisibleForTesting + RestrictedLockUtils.EnforcedAdmin checkIfMaximumTimeToLockSetByAdmin() { + // A DeviceAdmin has specified a maximum time until the device + // will lock... in this case we can't allow the user to turn + // on "stay awake when plugged in" because that would defeat the + // restriction. + return RestrictedLockUtils.checkIfMaximumTimeToLockIsSet(mContext); + } + + @VisibleForTesting + class SettingsObserver extends ContentObserver { + private final Uri mStayAwakeUri = Settings.Global.getUriFor( + Settings.Global.STAY_ON_WHILE_PLUGGED_IN); + + public SettingsObserver() { + super(new Handler()); + } + + public void register(boolean register) { + final ContentResolver cr = mContext.getContentResolver(); + if (register) { + cr.registerContentObserver( + mStayAwakeUri, false, this); + } else { + cr.unregisterContentObserver(this); + } + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + super.onChange(selfChange, uri); + if (mStayAwakeUri.equals(uri)) { + updateState(mPreference); + } + } + } +} diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeOptionMenuController.java b/src/com/android/settings/deviceinfo/PrivateVolumeOptionMenuController.java index 88b94876688..6047f8cc082 100644 --- a/src/com/android/settings/deviceinfo/PrivateVolumeOptionMenuController.java +++ b/src/com/android/settings/deviceinfo/PrivateVolumeOptionMenuController.java @@ -24,12 +24,12 @@ import android.view.MenuInflater; 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 dd0db9a2335..5b9b3750617 100644 --- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java +++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java @@ -35,9 +35,6 @@ import android.view.View; 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.UserIconLoader; 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 @@ public class StorageDashboardFragment extends DashboardFragment @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(); @@ -105,9 +104,7 @@ public class StorageDashboardFragment extends DashboardFragment public void onViewCreated(View v, Bundle savedInstanceState) { super.onViewCreated(v, savedInstanceState); initializeCacheProvider(); - if (mAppsResult == null || mStorageInfo == null) { - setLoading(true, false); - } + maybeSetLoading(isQuotaSupported()); } @Override @@ -125,21 +122,23 @@ public class StorageDashboardFragment extends DashboardFragment } private void onReceivedSizes() { - if (mStorageInfo == null || mAppsResult == null) { - return; + if (mStorageInfo != null) { + long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes; + mSummaryController.updateBytes(privateUsedBytes, mStorageInfo.totalBytes); + mPreferenceController.setVolume(mVolume); + mPreferenceController.setUsedSize(privateUsedBytes); + mPreferenceController.setTotalSize(mStorageInfo.totalBytes); + for (int i = 0, size = mSecondaryUsers.size(); i < size; i++) { + AbstractPreferenceController controller = mSecondaryUsers.get(i); + if (controller instanceof SecondaryUserController) { + SecondaryUserController userController = (SecondaryUserController) controller; + userController.setTotalSize(mStorageInfo.totalBytes); + } + } } - long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes; - mSummaryController.updateBytes(privateUsedBytes, mStorageInfo.totalBytes); - mPreferenceController.setVolume(mVolume); - mPreferenceController.setUsedSize(privateUsedBytes); - mPreferenceController.setTotalSize(mStorageInfo.totalBytes); - for (int i = 0, size = mSecondaryUsers.size(); i < size; i++) { - AbstractPreferenceController controller = mSecondaryUsers.get(i); - if (controller instanceof SecondaryUserController) { - SecondaryUserController userController = (SecondaryUserController) controller; - userController.setTotalSize(mStorageInfo.totalBytes); - } + if (mAppsResult == null) { + return; } mPreferenceController.onLoadFinished(mAppsResult, UserHandle.myUserId()); @@ -178,7 +177,7 @@ public class StorageDashboardFragment extends DashboardFragment 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 class StorageDashboardFragment extends DashboardFragment public List 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 controllers = new ArrayList<>(); controllers.add(new StorageSummaryDonutPreferenceController(context)); controllers.add(new StorageItemPreferenceController(context, null /* host */, @@ -244,10 +243,10 @@ public class StorageDashboardFragment extends DashboardFragment 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 @@ -272,11 +271,21 @@ public class StorageDashboardFragment extends DashboardFragment return mStorageInfo; } + @VisibleForTesting + public void setPrivateStorageInfo(PrivateStorageInfo info) { + mStorageInfo = info; + } + @VisibleForTesting public SparseArray getAppsStorageResult() { return mAppsResult; } + @VisibleForTesting + public void setAppsStorageResult(SparseArray info) { + mAppsResult = info; + } + @VisibleForTesting public void initializeCachedValues() { PrivateStorageInfo info = mCachedStorageValuesHelper.getCachedPrivateStorageInfo(); @@ -290,6 +299,16 @@ public class StorageDashboardFragment extends DashboardFragment mAppsResult = loaderResult; } + @VisibleForTesting + public void maybeSetLoading(boolean isQuotaSupported) { + // If we have fast stats, we load until both have loaded. + // If we have slow stats, we load when we get the total volume sizes. + if ((isQuotaSupported && (mStorageInfo == null || mAppsResult == null)) || + (!isQuotaSupported && mStorageInfo == null)) { + setLoading(true /* loading */, false /* animate */); + } + } + private void initializeCacheProvider() { mCachedStorageValuesHelper = new CachedStorageValuesHelper(getContext(), UserHandle.myUserId()); @@ -304,6 +323,11 @@ public class StorageDashboardFragment extends DashboardFragment } } + private boolean isQuotaSupported() { + final StorageStatsManager stats = getActivity().getSystemService(StorageStatsManager.class); + return stats.isQuotaSupported(mVolume.fsUuid); + } + /** * IconLoaderCallbacks exists because StorageDashboardFragment already implements * LoaderCallbacks for a different type. diff --git a/src/com/android/settings/deviceinfo/StorageProfileFragment.java b/src/com/android/settings/deviceinfo/StorageProfileFragment.java index 9f3ce0ca8d0..f2383de4aa6 100644 --- a/src/com/android/settings/deviceinfo/StorageProfileFragment.java +++ b/src/com/android/settings/deviceinfo/StorageProfileFragment.java @@ -30,15 +30,15 @@ import android.util.SparseArray; 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 class StorageProfileFragment extends DashboardFragment public Loader> 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/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java index 01075559cdb..01903c0e9d0 100644 --- a/src/com/android/settings/deviceinfo/StorageSettings.java +++ b/src/com/android/settings/deviceinfo/StorageSettings.java @@ -603,16 +603,6 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index data.screenTitle = context.getString(R.string.storage_settings); result.add(data); - data = new SearchIndexableRaw(context); - data.title = context.getString(R.string.memory_downloads_usage); - data.screenTitle = context.getString(R.string.storage_settings); - result.add(data); - - data = new SearchIndexableRaw(context); - data.title = context.getString(R.string.memory_media_cache_usage); - data.screenTitle = context.getString(R.string.storage_settings); - result.add(data); - data = new SearchIndexableRaw(context); data.title = context.getString(R.string.memory_media_misc_usage); data.screenTitle = context.getString(R.string.storage_settings); diff --git a/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java b/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java index 3c69ab1fc54..4aeb78299bf 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.support.v7.preference.PreferenceScreen; 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 f92a24e9f9d..2ce53f65755 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.ArraySet; 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/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java index 163f5b9dff4..7f2cc33e291 100644 --- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java +++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java @@ -20,7 +20,6 @@ import android.app.Fragment; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.net.TrafficStats; @@ -314,7 +313,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle } private Intent getPhotosIntent() { - Bundle args = new Bundle(2); + Bundle args = getWorkAnnotatedBundle(2); args.putString( ManageApplications.EXTRA_CLASSNAME, Settings.PhotosStorageActivity.class.getName()); args.putInt( @@ -336,8 +335,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle return null; } - Bundle args = new Bundle(); - args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile); + Bundle args = getWorkAnnotatedBundle(4); args.putString(ManageApplications.EXTRA_CLASSNAME, Settings.StorageUseActivity.class.getName()); args.putString(ManageApplications.EXTRA_VOLUME_UUID, mVolume.getFsUuid()); @@ -353,8 +351,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle return null; } - Bundle args = new Bundle(); - args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile); + Bundle args = getWorkAnnotatedBundle(3); args.putString(ManageApplications.EXTRA_CLASSNAME, Settings.StorageUseActivity.class.getName()); args.putString(ManageApplications.EXTRA_VOLUME_UUID, mVolume.getFsUuid()); @@ -365,8 +362,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle } private Intent getGamesIntent() { - Bundle args = new Bundle(1); - args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile); + Bundle args = getWorkAnnotatedBundle(1); args.putString(ManageApplications.EXTRA_CLASSNAME, Settings.GamesStorageActivity.class.getName()); return Utils.onBuildStartFragmentIntent(mContext, @@ -375,8 +371,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle } private Intent getMoviesIntent() { - Bundle args = new Bundle(1); - args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile); + Bundle args = getWorkAnnotatedBundle(1); args.putString(ManageApplications.EXTRA_CLASSNAME, Settings.MoviesStorageActivity.class.getName()); return Utils.onBuildStartFragmentIntent(mContext, @@ -384,6 +379,13 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle null, false, mMetricsFeatureProvider.getMetricsCategory(mFragment)); } + private Bundle getWorkAnnotatedBundle(int additionalCapacity) { + Bundle args = new Bundle(2 + additionalCapacity); + args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile); + args.putInt(ManageApplications.EXTRA_WORK_ID, mUserId); + return args; + } + private Intent getFilesIntent() { return mSvp.findEmulatedForPrivate(mVolume).buildBrowseIntent(); } diff --git a/src/com/android/settings/deviceinfo/storage/UserProfileController.java b/src/com/android/settings/deviceinfo/storage/UserProfileController.java index cf1e3603bbe..4870e7e3fa3 100644 --- a/src/com/android/settings/deviceinfo/storage/UserProfileController.java +++ b/src/com/android/settings/deviceinfo/storage/UserProfileController.java @@ -30,10 +30,10 @@ import android.util.SparseArray; 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 e1461dc9747..f9c9d53a961 100644 --- a/src/com/android/settings/display/BrightnessLevelPreferenceController.java +++ b/src/com/android/settings/display/BrightnessLevelPreferenceController.java @@ -31,6 +31,7 @@ import android.support.v7.preference.PreferenceScreen; 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 69ee2727d8d..00000000000 --- 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 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 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 159f57ba7f6..9217001b221 100644 --- a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java +++ b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java @@ -30,9 +30,10 @@ import android.text.style.ClickableSpan; 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 9ab561d2c1b..20bb13b58f1 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java @@ -29,8 +29,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 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 @@ public class FingerprintEnrollSidecar extends InstrumentedFragment { private byte[] mToken; private boolean mDone; private int mUserId; - private IFingerprintManager mFingerprintManager; + private FingerprintManagerWrapper mFingerprintManager; private ArrayList mQueuedEvents; private abstract class QueuedEvent { diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java index 719187a9710..6a8a1fd57f0 100644 --- a/src/com/android/settings/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/fingerprint/FingerprintSettings.java @@ -280,7 +280,8 @@ public class FingerprintSettings extends SubSettings { } private void retryFingerprint() { - if (mRemovalSidecar.inProgress()) { + if (mRemovalSidecar.inProgress() + || 0 == mFingerprintManager.getEnrolledFingerprints(mUserId).size()) { return; } // Don't start authentication if ChooseLockGeneric is showing, otherwise if the user diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index 66a0ca2ee89..d96db687101 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.SettingsActivity; 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 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements 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 0d5bed8aca5..20acee9b04b 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.SettingsActivity; 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 cea6d165a74..14aba85a948 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.R; 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 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo 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 4829ca01d31..382c6921dbf 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.text.format.DateUtils; 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 @@ public class AnomalyDetectionPolicy { private final KeyValueListParserWrapper mParserWrapper; public AnomalyDetectionPolicy(Context context) { - this(context, new KeyValueListParserWrapperImpl(new KeyValueListParser(','))); + this(context, new KeyValueListParserWrapper(new KeyValueListParser(','))); } @VisibleForTesting @@ -122,7 +124,7 @@ public class AnomalyDetectionPolicy { anomalyDetectionEnabled = mParserWrapper.getBoolean(KEY_ANOMALY_DETECTION_ENABLED, true); wakeLockDetectionEnabled = mParserWrapper.getBoolean(KEY_WAKELOCK_DETECTION_ENABLED, true); wakeupAlarmDetectionEnabled = mParserWrapper.getBoolean(KEY_WAKEUP_ALARM_DETECTION_ENABLED, - true); + false); bluetoothScanDetectionEnabled = mParserWrapper.getBoolean( KEY_BLUETOOTH_SCAN_DETECTION_ENABLED, true); wakeLockThreshold = mParserWrapper.getLong(KEY_WAKELOCK_THRESHOLD, 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 f7240341e6f..00000000000 --- 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/language/LanguageAndInputSettings.java b/src/com/android/settings/language/LanguageAndInputSettings.java index 4affc6edbc6..19b1a9f0b67 100644 --- a/src/com/android/settings/language/LanguageAndInputSettings.java +++ b/src/com/android/settings/language/LanguageAndInputSettings.java @@ -86,7 +86,8 @@ public class LanguageAndInputSettings extends DashboardFragment { @Override protected int getPreferenceScreenResId() { - return R.xml.language_and_input; + return mProgressiveDisclosureMixin.isEnabled() + ? R.xml.language_and_input : R.xml.language_and_input_new_advance_button; } @Override diff --git a/src/com/android/settings/network/MobileNetworkPreferenceController.java b/src/com/android/settings/network/MobileNetworkPreferenceController.java index 6e2c2d56e9c..1199400f55a 100644 --- a/src/com/android/settings/network/MobileNetworkPreferenceController.java +++ b/src/com/android/settings/network/MobileNetworkPreferenceController.java @@ -26,6 +26,7 @@ import android.telephony.TelephonyManager; 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 1280cf501c2..187c9ce3ebc 100644 --- a/src/com/android/settings/network/NetworkScorerPicker.java +++ b/src/com/android/settings/network/NetworkScorerPicker.java @@ -30,6 +30,7 @@ import com.android.internal.logging.nano.MetricsProto; 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 8d4ea63836a..e25e62d79ec 100644 --- a/src/com/android/settings/network/NetworkScorerPickerPreferenceController.java +++ b/src/com/android/settings/network/NetworkScorerPickerPreferenceController.java @@ -21,6 +21,7 @@ import android.support.v7.preference.Preference; 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/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java index e759c390bd5..6812d4d557b 100644 --- a/src/com/android/settings/notification/SoundSettings.java +++ b/src/com/android/settings/notification/SoundSettings.java @@ -109,7 +109,8 @@ public class SoundSettings extends DashboardFragment { @Override protected int getPreferenceScreenResId() { - return R.xml.sound_settings; + return mProgressiveDisclosureMixin.isEnabled() + ? R.xml.sound_settings : R.xml.sound_settings_new_advance_button; } @Override diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java index 36c3bc943e6..d3fca683df5 100644 --- a/src/com/android/settings/overlay/FeatureFactoryImpl.java +++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java @@ -25,8 +25,6 @@ import android.support.annotation.Keep; 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.SuggestionFeatureProvider; 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.SecurityFeatureProvider; 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 class FeatureFactoryImpl extends FeatureFactory { 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 class FeatureFactoryImpl extends FeatureFactory { 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/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java index a67184a8ae3..2cb337b5294 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java @@ -243,7 +243,6 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends OptionsMenuFra try { IActivityManager activityManager = ActivityManager.getService(); final ActivityOptions options = ActivityOptions.makeBasic(); - options.setLaunchStackId(ActivityManager.StackId.INVALID_STACK_ID); activityManager.startActivityFromRecents(taskId, options.toBundle()); return; } catch (RemoteException e) { diff --git a/src/com/android/settings/password/IFingerprintManager.java b/src/com/android/settings/password/IFingerprintManager.java deleted file mode 100644 index 94021460bfc..00000000000 --- 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 57aa8c17d1d..a974da4f0ec 100644 --- a/src/com/android/settings/password/SetNewPasswordController.java +++ b/src/com/android/settings/password/SetNewPasswordController.java @@ -36,6 +36,7 @@ import android.os.UserManager; 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 @@ final class SetNewPasswordController { */ 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 @@ final class SetNewPasswordController { } // 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 @@ final class SetNewPasswordController { SetNewPasswordController( int targetUserId, PackageManager packageManager, - IFingerprintManager fingerprintManager, + FingerprintManagerWrapper fingerprintManager, DevicePolicyManager devicePolicyManager, Ui ui) { mTargetUserId = targetUserId; diff --git a/src/com/android/settings/search/DatabaseIndexingManager.java b/src/com/android/settings/search/DatabaseIndexingManager.java index 9c79885602a..de71f0a6539 100644 --- a/src/com/android/settings/search/DatabaseIndexingManager.java +++ b/src/com/android/settings/search/DatabaseIndexingManager.java @@ -362,4 +362,4 @@ public class DatabaseIndexingManager { } } } -} +} \ No newline at end of file diff --git a/src/com/android/settings/search/DatabaseIndexingUtils.java b/src/com/android/settings/search/DatabaseIndexingUtils.java index f43f210ec27..ce58256a1f1 100644 --- a/src/com/android/settings/search/DatabaseIndexingUtils.java +++ b/src/com/android/settings/search/DatabaseIndexingUtils.java @@ -17,16 +17,10 @@ package com.android.settings.search; -import android.Manifest; import android.content.Context; import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Bundle; -import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; @@ -37,10 +31,8 @@ import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.core.AbstractPreferenceController; import java.lang.reflect.Field; -import java.text.Normalizer; import java.util.List; import java.util.Map; -import java.util.regex.Pattern; /** * Utility class for {@like DatabaseIndexingManager} to handle the mapping between Payloads @@ -53,15 +45,6 @@ public class DatabaseIndexingUtils { private static final String FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER = "SEARCH_INDEX_DATA_PROVIDER"; - private static final String NON_BREAKING_HYPHEN = "\u2011"; - private static final String EMPTY = ""; - private static final String LIST_DELIMITERS = "[,]\\s*"; - private static final String HYPHEN = "-"; - private static final String SPACE = " "; - - private static final Pattern REMOVE_DIACRITICALS_PATTERN - = Pattern.compile("\\p{InCombiningDiacriticalMarks}+"); - /** * Builds intent into a subsetting. */ @@ -173,19 +156,4 @@ public class DatabaseIndexingUtils { } return null; } - - public static String normalizeHyphen(String input) { - return (input != null) ? input.replaceAll(NON_BREAKING_HYPHEN, HYPHEN) : EMPTY; - } - - public static String normalizeString(String input) { - final String nohyphen = (input != null) ? input.replaceAll(HYPHEN, EMPTY) : EMPTY; - final String normalized = Normalizer.normalize(nohyphen, Normalizer.Form.NFD); - - return REMOVE_DIACRITICALS_PATTERN.matcher(normalized).replaceAll("").toLowerCase(); - } - - public static String normalizeKeywords(String input) { - return (input != null) ? input.replaceAll(LIST_DELIMITERS, SPACE) : EMPTY; - } } diff --git a/src/com/android/settings/search/InstalledAppResultLoader.java b/src/com/android/settings/search/InstalledAppResultLoader.java index 9d80b734a44..69a4693d780 100644 --- a/src/com/android/settings/search/InstalledAppResultLoader.java +++ b/src/com/android/settings/search/InstalledAppResultLoader.java @@ -34,9 +34,9 @@ import com.android.internal.logging.nano.MetricsProto; 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 69c086f1659..420b8470d91 100644 --- a/src/com/android/settings/search/SearchFeatureProviderImpl.java +++ b/src/com/android/settings/search/SearchFeatureProviderImpl.java @@ -21,9 +21,9 @@ import android.content.Context; 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 @@ public class SearchFeatureProviderImpl implements SearchFeatureProvider { @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/search/indexing/IndexData.java b/src/com/android/settings/search/indexing/IndexData.java index b0c79f368b6..c05c95d51df 100644 --- a/src/com/android/settings/search/indexing/IndexData.java +++ b/src/com/android/settings/search/indexing/IndexData.java @@ -27,7 +27,9 @@ import com.android.settings.search.ResultPayload; import com.android.settings.search.ResultPayloadUtils; import com.android.settings.search.SearchIndexableResources; +import java.text.Normalizer; import java.util.Objects; +import java.util.regex.Pattern; /** * Data class representing a single row in the Setting Search results database. @@ -38,14 +40,11 @@ public class IndexData { public final String normalizedTitle; public final String updatedSummaryOn; public final String normalizedSummaryOn; - public final String updatedSummaryOff; - public final String normalizedSummaryOff; public final String entries; public final String className; public final String childClassName; public final String screenTitle; public final int iconResId; - public final int rank; public final String spaceDelimitedKeywords; public final String intentAction; public final String intentTargetPackage; @@ -56,21 +55,28 @@ public class IndexData { public final int payloadType; public final byte[] payload; + private static final String NON_BREAKING_HYPHEN = "\u2011"; + private static final String EMPTY = ""; + private static final String HYPHEN = "-"; + private static final String SPACE = " "; + // Regex matching a comma, and any number of subsequent white spaces. + private static final String LIST_DELIMITERS = "[,]\\s*"; + + private static final Pattern REMOVE_DIACRITICALS_PATTERN + = Pattern.compile("\\p{InCombiningDiacriticalMarks}+"); + private IndexData(Builder builder) { locale = builder.mLocale; - updatedTitle = builder.mUpdatedTitle; - normalizedTitle = builder.mNormalizedTitle; - updatedSummaryOn = builder.mUpdatedSummaryOn; - normalizedSummaryOn = builder.mNormalizedSummaryOn; - updatedSummaryOff = builder.mUpdatedSummaryOff; - normalizedSummaryOff = builder.mNormalizedSummaryOff; + updatedTitle = normalizeHyphen(builder.mTitle); + normalizedTitle = normalizeString(builder.mTitle); + updatedSummaryOn = normalizeHyphen(builder.mSummaryOn); + normalizedSummaryOn = normalizeString(builder.mSummaryOn); entries = builder.mEntries; className = builder.mClassName; childClassName = builder.mChildClassName; screenTitle = builder.mScreenTitle; iconResId = builder.mIconResId; - rank = builder.mRank; - spaceDelimitedKeywords = builder.mSpaceDelimitedKeywords; + spaceDelimitedKeywords = normalizeKeywords(builder.mKeywords); intentAction = builder.mIntentAction; intentTargetPackage = builder.mIntentTargetPackage; intentTargetClass = builder.mIntentTargetClass; @@ -93,21 +99,49 @@ public class IndexData { : key.hashCode(); } + @Override + public String toString() { + return new StringBuilder(updatedTitle) + .append(": ") + .append(updatedSummaryOn) + .toString(); + } + + /** + * In the list of keywords, replace the comma and all subsequent whitespace with a single space. + */ + public static String normalizeKeywords(String input) { + return (input != null) ? input.replaceAll(LIST_DELIMITERS, SPACE) : EMPTY; + } + + /** + * @return {@param input} where all non-standard hyphens are replaced by normal hyphens. + */ + public static String normalizeHyphen(String input) { + return (input != null) ? input.replaceAll(NON_BREAKING_HYPHEN, HYPHEN) : EMPTY; + } + + /** + * @return {@param input} with all hyphens removed, and all letters lower case. + */ + public static String normalizeString(String input) { + final String normalizedHypen = normalizeHyphen(input); + final String nohyphen = (input != null) ? normalizedHypen.replaceAll(HYPHEN, EMPTY) : EMPTY; + final String normalized = Normalizer.normalize(nohyphen, Normalizer.Form.NFD); + + return REMOVE_DIACRITICALS_PATTERN.matcher(normalized).replaceAll("").toLowerCase(); + } + public static class Builder { private String mLocale; - private String mUpdatedTitle; - private String mNormalizedTitle; - private String mUpdatedSummaryOn; - private String mNormalizedSummaryOn; - private String mUpdatedSummaryOff; - private String mNormalizedSummaryOff; + private String mTitle; + private String mSummaryOn; private String mEntries; private String mClassName; private String mChildClassName; private String mScreenTitle; private int mIconResId; - private int mRank; - private String mSpaceDelimitedKeywords; + private String mKeywords; private String mIntentAction; private String mIntentTargetPackage; private String mIntentTargetClass; @@ -123,33 +157,13 @@ public class IndexData { return this; } - public Builder setUpdatedTitle(String updatedTitle) { - mUpdatedTitle = updatedTitle; + public Builder setTitle(String title) { + mTitle = title; return this; } - public Builder setNormalizedTitle(String normalizedTitle) { - mNormalizedTitle = normalizedTitle; - return this; - } - - public Builder setUpdatedSummaryOn(String updatedSummaryOn) { - mUpdatedSummaryOn = updatedSummaryOn; - return this; - } - - public Builder setNormalizedSummaryOn(String normalizedSummaryOn) { - mNormalizedSummaryOn = normalizedSummaryOn; - return this; - } - - public Builder setUpdatedSummaryOff(String updatedSummaryOff) { - mUpdatedSummaryOff = updatedSummaryOff; - return this; - } - - public Builder setNormalizedSummaryOff(String normalizedSummaryOff) { - this.mNormalizedSummaryOff = normalizedSummaryOff; + public Builder setSummaryOn(String summaryOn) { + mSummaryOn = summaryOn; return this; } @@ -178,13 +192,8 @@ public class IndexData { return this; } - public Builder setRank(int rank) { - mRank = rank; - return this; - } - - public Builder setSpaceDelimitedKeywords(String spaceDelimitedKeywords) { - mSpaceDelimitedKeywords = spaceDelimitedKeywords; + public Builder setKeywords(String keywords) { + mKeywords = keywords; return this; } @@ -260,8 +269,8 @@ public class IndexData { boolean isEmptyIntentAction = TextUtils.isEmpty(mIntentAction); // No intent action is set, or the intent action is for a subsetting. if (isEmptyIntentAction - || (!isEmptyIntentAction && TextUtils.equals(mIntentTargetPackage, - SearchIndexableResources.SUBSETTING_TARGET_PACKAGE))) { + || TextUtils.equals(mIntentTargetPackage, + SearchIndexableResources.SUBSETTING_TARGET_PACKAGE)) { // Action is null, we will launch it as a sub-setting intent = DatabaseIndexingUtils.buildSubsettingIntent(context, mClassName, mKey, mScreenTitle); diff --git a/src/com/android/settings/search/indexing/IndexDataConverter.java b/src/com/android/settings/search/indexing/IndexDataConverter.java index 3c602f67098..f900b83cdc6 100644 --- a/src/com/android/settings/search/indexing/IndexDataConverter.java +++ b/src/com/android/settings/search/indexing/IndexDataConverter.java @@ -147,12 +147,14 @@ public class IndexDataConverter { } IndexData.Builder builder = new IndexData.Builder(); - builder.setLocale(localeStr) + builder.setTitle(raw.title) + .setSummaryOn(raw.summaryOn) + .setLocale(localeStr) .setEntries(raw.entries) + .setKeywords(raw.keywords) .setClassName(raw.className) .setScreenTitle(raw.screenTitle) .setIconResId(raw.iconResId) - .setRank(raw.rank) .setIntentAction(raw.intentAction) .setIntentTargetPackage(raw.intentTargetPackage) .setIntentTargetClass(raw.intentTargetClass) @@ -160,8 +162,7 @@ public class IndexDataConverter { .setKey(raw.key) .setUserId(raw.userId); - updateOneRowWithFilteredData(builder, raw.title, raw.summaryOn, raw.summaryOff, - raw.keywords); + updateOneRow(builder.build(mContext)); } @VisibleForTesting @@ -249,7 +250,6 @@ public class IndexDataConverter { ResultPayload payload; boolean enabled; final String fragmentName = sir.className; - final int rank = sir.rank; final String intentAction = sir.intentAction; final String intentTargetPackage = sir.intentTargetPackage; final String intentTargetClass = sir.intentTargetClass; @@ -271,11 +271,12 @@ public class IndexDataConverter { // TODO: Set payload type for header results IndexData.Builder headerBuilder = new IndexData.Builder(); - headerBuilder.setLocale(localeStr) - .setEntries(null) + headerBuilder.setTitle(headerTitle) + .setSummaryOn(headerSummary) + .setKeywords(headerKeywords) + .setLocale(localeStr) .setClassName(fragmentName) .setScreenTitle(screenTitle) - .setRank(rank) .setIntentAction(intentAction) .setIntentTargetPackage(intentTargetPackage) .setIntentTargetClass(intentTargetClass) @@ -306,11 +307,12 @@ public class IndexDataConverter { } builder = new IndexData.Builder(); - builder.setLocale(localeStr) + builder.setTitle(title) + .setLocale(localeStr) + .setKeywords(keywords) .setClassName(fragmentName) .setScreenTitle(screenTitle) .setIconResId(iconResId) - .setRank(rank) .setIntentAction(intentAction) .setIntentTargetPackage(intentTargetPackage) .setIntentTargetClass(intentTargetClass) @@ -331,14 +333,17 @@ public class IndexDataConverter { payload = DatabaseIndexingUtils.getPayloadFromUriMap(controllerUriMap, key); childFragment = XmlParserUtils.getDataChildFragment(context, attrs); - builder.setEntries(entries) + builder.setSummaryOn(summary) + .setEntries(entries) .setChildClassName(childFragment) .setPayload(payload); // Insert rows for the child nodes of PreferenceScreen - updateOneRowWithFilteredData(builder, title, summary, - null /* summary off */, keywords); + updateOneRow(builder.build(mContext)); } else { + // TODO (b/33577327) We removed summary off here. We should check if we can + // merge this 'else' section with the one above. Put a break point to + // investigate. String summaryOn = XmlParserUtils.getDataSummaryOn(context, attrs); String summaryOff = XmlParserUtils.getDataSummaryOff(context, attrs); @@ -346,15 +351,15 @@ public class IndexDataConverter { summaryOn = XmlParserUtils.getDataSummary(context, attrs); } - updateOneRowWithFilteredData(builder, title, summaryOn, summaryOff, - keywords); + builder.setSummaryOn(summaryOn); + + updateOneRow(builder.build(mContext)); } } // The xml header's title does not match the title of one of the child settings. if (isHeaderUnique) { - updateOneRowWithFilteredData(headerBuilder, headerTitle, headerSummary, - null /* summary off */, headerKeywords); + updateOneRow(headerBuilder.build(mContext)); } } catch (XmlPullParserException e) { throw new RuntimeException("Error parsing PreferenceScreen", e); @@ -394,8 +399,11 @@ public class IndexDataConverter { boolean enabled = !nonIndexableKeys.contains(raw.key); IndexData.Builder builder = new IndexData.Builder(); - builder.setLocale(localeStr) + builder.setTitle(raw.title) + .setSummaryOn(raw.summaryOn) + .setLocale(localeStr) .setEntries(raw.entries) + .setKeywords(raw.keywords) .setClassName(className) .setScreenTitle(raw.screenTitle) .setIconResId(raw.iconResId) @@ -406,8 +414,7 @@ public class IndexDataConverter { .setKey(raw.key) .setUserId(raw.userId); - updateOneRowWithFilteredData(builder, raw.title, raw.summaryOn, raw.summaryOff, - raw.keywords); + updateOneRow(builder.build(mContext)); } } @@ -438,32 +445,6 @@ public class IndexDataConverter { } } - @VisibleForTesting - void updateOneRowWithFilteredData(IndexData.Builder builder, - String title, String summaryOn, String summaryOff, String keywords) { - - final String updatedTitle = DatabaseIndexingUtils.normalizeHyphen(title); - final String updatedSummaryOn = DatabaseIndexingUtils.normalizeHyphen(summaryOn); - final String updatedSummaryOff = DatabaseIndexingUtils.normalizeHyphen(summaryOff); - - final String normalizedTitle = DatabaseIndexingUtils.normalizeString(updatedTitle); - final String normalizedSummaryOn = DatabaseIndexingUtils.normalizeString(updatedSummaryOn); - final String normalizedSummaryOff = DatabaseIndexingUtils - .normalizeString(updatedSummaryOff); - - final String spaceDelimitedKeywords = DatabaseIndexingUtils.normalizeKeywords(keywords); - - builder.setUpdatedTitle(updatedTitle) - .setUpdatedSummaryOn(updatedSummaryOn) - .setUpdatedSummaryOff(updatedSummaryOff) - .setNormalizedTitle(normalizedTitle) - .setNormalizedSummaryOn(normalizedSummaryOn) - .setNormalizedSummaryOff(normalizedSummaryOff) - .setSpaceDelimitedKeywords(spaceDelimitedKeywords); - - updateOneRow(builder.build(mContext)); - } - private void updateOneRow(IndexData row) { if (TextUtils.isEmpty(row.updatedTitle)) { return; @@ -472,13 +453,10 @@ public class IndexDataConverter { ContentValues values = new ContentValues(); values.put(IndexDatabaseHelper.IndexColumns.DOCID, row.getDocId()); values.put(LOCALE, row.locale); - values.put(DATA_RANK, row.rank); values.put(DATA_TITLE, row.updatedTitle); values.put(DATA_TITLE_NORMALIZED, row.normalizedTitle); values.put(DATA_SUMMARY_ON, row.updatedSummaryOn); values.put(DATA_SUMMARY_ON_NORMALIZED, row.normalizedSummaryOn); - values.put(DATA_SUMMARY_OFF, row.updatedSummaryOff); - values.put(DATA_SUMMARY_OFF_NORMALIZED, row.normalizedSummaryOff); values.put(DATA_ENTRIES, row.entries); values.put(DATA_KEYWORDS, row.spaceDelimitedKeywords); values.put(CLASS_NAME, row.className); diff --git a/src/com/android/settings/vpn2/ConnectivityManagerWrapperImpl.java b/src/com/android/settings/vpn2/ConnectivityManagerWrapperImpl.java deleted file mode 100644 index f742cd22b06..00000000000 --- 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 a36cce82e01..1aa4adaea41 100644 --- a/src/com/android/settings/vpn2/VpnUtils.java +++ b/src/com/android/settings/vpn2/VpnUtils.java @@ -27,6 +27,7 @@ import android.util.Log; 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 380b964ab7e..362ca1f2535 100644 --- a/src/com/android/settings/webview/WebViewAppPicker.java +++ b/src/com/android/settings/webview/WebViewAppPicker.java @@ -30,9 +30,10 @@ import android.text.TextUtils; 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 b40be1941fa..e4eb0fcfca4 100644 --- a/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java +++ b/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java @@ -28,6 +28,8 @@ import android.webkit.WebViewProviderInfo; 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 4199a6d3b97..3c700483d99 100644 --- a/src/com/android/settings/wifi/ConfigureWifiSettings.java +++ b/src/com/android/settings/wifi/ConfigureWifiSettings.java @@ -28,12 +28,12 @@ import android.provider.SearchIndexableResource; 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/UseOpenWifiPreferenceController.java b/src/com/android/settings/wifi/UseOpenWifiPreferenceController.java index d44c8a9d636..c563fce4261 100644 --- a/src/com/android/settings/wifi/UseOpenWifiPreferenceController.java +++ b/src/com/android/settings/wifi/UseOpenWifiPreferenceController.java @@ -21,7 +21,7 @@ import android.text.TextUtils; 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 77188987b3d..9c431422371 100644 --- a/src/com/android/settings/wifi/WifiEnabler.java +++ b/src/com/android/settings/wifi/WifiEnabler.java @@ -35,6 +35,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 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 f3b08bf1dac..bc302b98395 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.search.SearchIndexableRaw; 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 efb8aa6f84a..a3170c09cbc 100644 --- a/src/com/android/settings/wifi/WifiWakeupPreferenceController.java +++ b/src/com/android/settings/wifi/WifiWakeupPreferenceController.java @@ -29,7 +29,7 @@ import android.text.TextUtils; 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 52871f6cba4..dfed8018457 100644 --- a/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java +++ b/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java @@ -20,7 +20,6 @@ import android.app.Activity; 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.ProgressBar; 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 014fb0f84ac..40acfeb4e02 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.Utils; 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 765bebccb2b..1609bef2980 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; 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 @@ public class WifiNetworkDetailsFragment extends DashboardFragment { 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/wifi/tether/WifiTetherPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java index 2f05274b377..fa10607b342 100644 --- a/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java +++ b/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java @@ -139,6 +139,8 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController private void handleWifiApStateChanged(int state, int reason) { switch (state) { case WifiManager.WIFI_AP_STATE_ENABLING: + mPreference.setSummary(R.string.wifi_tether_starting); + break; case WifiManager.WIFI_AP_STATE_ENABLED: /** * Summary on enable is handled by tether diff --git a/src/com/android/settings/applications/AccessibilityManagerWrapperImpl.java b/src/com/android/settings/wrapper/AccessibilityManagerWrapper.java similarity index 93% rename from src/com/android/settings/applications/AccessibilityManagerWrapperImpl.java rename to src/com/android/settings/wrapper/AccessibilityManagerWrapper.java index 4ebaea759fc..4fd7ccffa67 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 @@ import android.view.accessibility.AccessibilityManager; * 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 6ce0a4a9bcd..c920392306d 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 67% rename from src/com/android/settings/applications/ActivityInfoWrapperImpl.java rename to src/com/android/settings/wrapper/ActivityInfoWrapper.java index b70a1e87235..37d0d423772 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 04091b01d4c..57c9375ec2d 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 9e20c9d1fd8..c80a97b3afa 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.os.Handler; 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 @@ public interface ConnectivityManagerWrapper { * @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 @@ public interface ConnectivityManagerWrapper { * * @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 59% rename from src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java rename to src/com/android/settings/wrapper/DevicePolicyManagerWrapper.java index ede241a0f10..ed2eb462ae4 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 android.support.annotation.Nullable; 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 getActiveAdminsAsUser(int userId); + public @Nullable List 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 getOwnerInstalledCaCerts(@NonNull UserHandle user); + public List 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 51b31afc9e6..9b43bfaa027 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 android.os.CancellationSignal; 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 @@ public class FingerprintManagerWrapper implements IFingerprintManager { 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 b4d1b85e8f7..9bb2df72d02 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 getPackagesHoldingPermissions( - String[] permissions, int flags, int userId) throws RemoteException; + public ParceledListSlice 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 4a9c2a92b45..16dc50eecdc 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 @@ public interface KeyValueListParserWrapper { * @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 @@ public interface KeyValueListParserWrapper { * @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 @@ public interface KeyValueListParserWrapper { * 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 3489640f6a2..a07d6457a09 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 afa2f333590..6357a3ecd36 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 de5b80851d3..7a0185ff7b9 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 14ea64ae345..eeb648bd102 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 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 8fbb10cb8a1..afa1d82d314 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 84% rename from src/com/android/settings/webview/UserPackageWrapperImpl.java rename to src/com/android/settings/wrapper/UserPackageWrapperImpl.java index 1ea7c2e7927..0a2b9cde1cb 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 95% rename from src/com/android/settings/dashboard/suggestions/WallpaperManagerWrapper.java rename to src/com/android/settings/wrapper/WallpaperManagerWrapper.java index 9efe4fe0a0f..89015e5513e 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 69b5ee903db..e24f5eb3191 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; diff --git a/src/com/android/settings/applications/ActivityInfoWrapper.java b/tests/robotests/src/android/service/settings/suggestions/ISuggestionService.java similarity index 60% rename from src/com/android/settings/applications/ActivityInfoWrapper.java rename to tests/robotests/src/android/service/settings/suggestions/ISuggestionService.java index 4cb6e68c5cf..f4f5a519bd0 100644 --- a/src/com/android/settings/applications/ActivityInfoWrapper.java +++ b/tests/robotests/src/android/service/settings/suggestions/ISuggestionService.java @@ -14,17 +14,10 @@ * limitations under the License. */ -package com.android.settings.applications; +package android.service.settings.suggestions; -/** - * 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 { +import java.util.List; - /** - * Returns whether this activity supports picture-in-picture. - */ - boolean supportsPictureInPicture(); +public interface ISuggestionService { + List getSuggestions(); } diff --git a/tests/robotests/src/android/service/settings/suggestions/Suggestion.java b/tests/robotests/src/android/service/settings/suggestions/Suggestion.java new file mode 100644 index 00000000000..df7a8aed962 --- /dev/null +++ b/tests/robotests/src/android/service/settings/suggestions/Suggestion.java @@ -0,0 +1,20 @@ +/* + * 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 android.service.settings.suggestions; + +public class Suggestion { +} diff --git a/tests/robotests/src/com/android/settings/DisplaySettingsTest.java b/tests/robotests/src/com/android/settings/DisplaySettingsTest.java index 4b345c0c308..3ee8feb1268 100644 --- a/tests/robotests/src/com/android/settings/DisplaySettingsTest.java +++ b/tests/robotests/src/com/android/settings/DisplaySettingsTest.java @@ -2,8 +2,11 @@ package com.android.settings; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; + import android.content.Context; +import com.android.settings.dashboard.ProgressiveDisclosureMixin; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.XmlTestUtils; import com.android.settings.testutils.shadow.ShadowPowerManagerWrapper; @@ -13,6 +16,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.List; @@ -25,9 +29,9 @@ public class DisplaySettingsTest { @Config(shadows = ShadowPowerManagerWrapper.class) public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() { final Context context = RuntimeEnvironment.application; -// PowerManager wrapper = mock(PowerManager.class); -// doReturn(wrapper).when(context).getSystemService(Context.POWER_SERVICE); final DisplaySettings fragment = new DisplaySettings(); + ReflectionHelpers.setField(fragment, "mProgressiveDisclosureMixin", + mock(ProgressiveDisclosureMixin.class)); final List preferenceScreenKeys = XmlTestUtils.getKeysFromPreferenceXml(context, fragment.getPreferenceScreenResId()); final List preferenceKeys = new ArrayList<>(); diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java index 19b87a1b1fa..26b5b0236c5 100644 --- a/tests/robotests/src/com/android/settings/UtilsTest.java +++ b/tests/robotests/src/com/android/settings/UtilsTest.java @@ -26,8 +26,8 @@ import android.text.SpannableStringBuilder; import android.text.format.DateUtils; import android.text.style.TtsSpan; -import com.android.settings.enterprise.DevicePolicyManagerWrapper; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.wrapper.DevicePolicyManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/accessibility/ShortcutServicePickerFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ShortcutServicePickerFragmentTest.java index f2d1e6534ac..785bdbdffaf 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ShortcutServicePickerFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ShortcutServicePickerFragmentTest.java @@ -23,8 +23,8 @@ import android.os.UserManager; import android.test.mock.MockContentResolver; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; @@ -40,7 +40,6 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; - @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class ShortcutServicePickerFragmentTest { diff --git a/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java index a1eb2d85488..d4e866f8044 100644 --- a/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java @@ -46,10 +46,10 @@ import android.widget.Button; import com.android.settings.R; import com.android.settings.TestConfig; import com.android.settings.applications.LayoutPreference; -import com.android.settings.enterprise.DevicePolicyManagerWrapper; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowAccountManager; import com.android.settings.testutils.shadow.ShadowContentResolver; +import com.android.settings.wrapper.DevicePolicyManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/AppAndNotificationDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/applications/AppAndNotificationDashboardFragmentTest.java index 697d04ffa8d..269d840cac4 100644 --- a/tests/robotests/src/com/android/settings/applications/AppAndNotificationDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/applications/AppAndNotificationDashboardFragmentTest.java @@ -19,6 +19,8 @@ package com.android.settings.applications; import android.content.Context; import android.os.UserManager; + +import com.android.settings.dashboard.ProgressiveDisclosureMixin; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.XmlTestUtils; @@ -27,6 +29,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; import java.util.List; @@ -47,7 +50,10 @@ public class AppAndNotificationDashboardFragmentTest { when(context.getSystemService(Context.USER_SERVICE)).thenReturn(manager); final List niks = AppAndNotificationDashboardFragment.SEARCH_INDEX_DATA_PROVIDER .getNonIndexableKeys(context); - final int xmlId = (new AppAndNotificationDashboardFragment()).getPreferenceScreenResId(); + AppAndNotificationDashboardFragment fragment = new AppAndNotificationDashboardFragment(); + ReflectionHelpers.setField(fragment, "mProgressiveDisclosureMixin", + mock(ProgressiveDisclosureMixin.class)); + final int xmlId = fragment.getPreferenceScreenResId(); final List keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId); diff --git a/tests/robotests/src/com/android/settings/applications/AppStateAppOpsBridgeTest.java b/tests/robotests/src/com/android/settings/applications/AppStateAppOpsBridgeTest.java index df226a83be4..d63697ec5a4 100644 --- a/tests/robotests/src/com/android/settings/applications/AppStateAppOpsBridgeTest.java +++ b/tests/robotests/src/com/android/settings/applications/AppStateAppOpsBridgeTest.java @@ -27,6 +27,7 @@ import android.os.RemoteException; import android.os.UserManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settings.wrapper.IPackageManagerWrapper; import com.android.settingslib.applications.ApplicationsState.AppEntry; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounterTest.java b/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounterTest.java index 11401a886d6..33d261f807b 100644 --- a/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounterTest.java +++ b/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounterTest.java @@ -28,7 +28,9 @@ import android.os.UserManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -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 org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsListerTest.java b/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsListerTest.java index c3c1bb3877c..2e9328ab6e6 100644 --- a/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsListerTest.java +++ b/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsListerTest.java @@ -25,7 +25,9 @@ import android.os.UserManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -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 org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java index 2b1c2967107..e5b7a66e79d 100644 --- a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java @@ -30,9 +30,11 @@ import android.os.UserManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.enterprise.DevicePolicyManagerWrapper; import com.android.settings.testutils.ApplicationTestUtils; import com.android.settings.testutils.shadow.ShadowUserManager; +import com.android.settings.wrapper.DevicePolicyManagerWrapper; +import com.android.settings.wrapper.IPackageManagerWrapper; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppCounterTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppCounterTest.java index 56df10e73e3..58c4386661f 100644 --- a/tests/robotests/src/com/android/settings/applications/InstalledAppCounterTest.java +++ b/tests/robotests/src/com/android/settings/applications/InstalledAppCounterTest.java @@ -41,6 +41,7 @@ import android.os.UserManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.shadow.ShadowUserManager; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java index 8fb1e99ae8a..35f961bf362 100644 --- a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java +++ b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java @@ -16,7 +16,6 @@ package com.android.settings.applications; - import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Matchers.anyDouble; @@ -33,7 +32,6 @@ import android.app.AlertDialog; import android.app.AppOpsManager; import android.app.Fragment; import android.app.LoaderManager; -import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -55,11 +53,11 @@ import com.android.settings.SettingsActivity; import com.android.settings.TestConfig; import com.android.settings.applications.instantapps.InstantAppButtonsController; import com.android.settings.applications.instantapps.InstantAppButtonsController.ShowDialogDelegate; -import com.android.settings.enterprise.DevicePolicyManagerWrapper; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.widget.ActionButtonPreferenceTest; +import com.android.settings.wrapper.DevicePolicyManagerWrapper; import com.android.settingslib.Utils; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState.AppEntry; diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppListerTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppListerTest.java index c4c3259bf2c..c74deaeb5cf 100644 --- a/tests/robotests/src/com/android/settings/applications/InstalledAppListerTest.java +++ b/tests/robotests/src/com/android/settings/applications/InstalledAppListerTest.java @@ -26,6 +26,7 @@ import android.os.UserManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/NotificationAppsTest.java b/tests/robotests/src/com/android/settings/applications/NotificationAppsTest.java index 16355768651..11d757fc504 100644 --- a/tests/robotests/src/com/android/settings/applications/NotificationAppsTest.java +++ b/tests/robotests/src/com/android/settings/applications/NotificationAppsTest.java @@ -27,6 +27,7 @@ import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.notification.NotificationBackend; +import com.android.settingslib.wrapper.PackageManagerWrapper; import java.util.List; import java.util.ArrayList; diff --git a/tests/robotests/src/com/android/settings/applications/PictureInPictureDetailsTest.java b/tests/robotests/src/com/android/settings/applications/PictureInPictureDetailsTest.java index 6bac9a3ee67..02b8c7a003c 100644 --- a/tests/robotests/src/com/android/settings/applications/PictureInPictureDetailsTest.java +++ b/tests/robotests/src/com/android/settings/applications/PictureInPictureDetailsTest.java @@ -28,6 +28,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.wrapper.ActivityInfoWrapper; import org.junit.Before; import org.junit.Test; @@ -104,11 +105,12 @@ public class PictureInPictureDetailsTest { activities); } - private class MockActivityInfo implements ActivityInfoWrapper { + private class MockActivityInfo extends ActivityInfoWrapper { private boolean mSupportsPictureInPicture; public MockActivityInfo(boolean supportsPictureInPicture) { + super(null); mSupportsPictureInPicture = supportsPictureInPicture; } diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppInfoTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppInfoTest.java index 281e70a367f..0ae96159e94 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppInfoTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppInfoTest.java @@ -16,7 +16,6 @@ package com.android.settings.applications.defaultapps; - import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -27,7 +26,7 @@ import android.content.pm.PackageManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java index 655f693f46f..9a3ec100c73 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java @@ -29,8 +29,8 @@ import android.os.UserManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java index d6f1122451f..bc72ee4ee3f 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java @@ -16,7 +16,6 @@ package com.android.settings.applications.defaultapps; - import android.content.Context; import android.content.pm.PackageManager; import android.os.UserManager; @@ -27,8 +26,8 @@ import android.view.autofill.AutofillManager; import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.AutofillManagerWrapper; -import com.android.settings.applications.PackageManagerWrapper; +import com.android.settings.wrapper.AutofillManagerWrapper; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java index f5dc72d5ab9..e8a6c1e964c 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java @@ -16,14 +16,13 @@ package com.android.settings.applications.defaultapps; - import android.app.Activity; import android.content.Context; import android.os.UserManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java index e918ee221b5..8d527ff2702 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java @@ -16,7 +16,6 @@ package com.android.settings.applications.defaultapps; - import android.content.Context; import android.content.Intent; import android.content.pm.ResolveInfo; @@ -26,7 +25,7 @@ import android.support.v7.preference.Preference; import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultEmergencyPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultEmergencyPickerTest.java index 04972ae358a..124817afe17 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultEmergencyPickerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultEmergencyPickerTest.java @@ -23,7 +23,7 @@ import android.provider.Settings; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePickerTest.java index b50063729e3..4b82f1a98b5 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePickerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePickerTest.java @@ -31,7 +31,7 @@ import android.os.UserManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceControllerTest.java index 22b30bda3bb..ca5c10b1996 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceControllerTest.java @@ -16,7 +16,6 @@ package com.android.settings.applications.defaultapps; - import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.anyList; import static org.mockito.Mockito.atLeastOnce; @@ -31,8 +30,8 @@ import android.os.UserManager; import android.support.v7.preference.Preference; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java index 600acb4a778..f2b7db86c66 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java @@ -16,14 +16,13 @@ package com.android.settings.applications.defaultapps; - import android.app.Activity; import android.content.Context; import android.os.UserManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java index da0c325ed23..91e68eafeca 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java @@ -16,14 +16,13 @@ package com.android.settings.applications.defaultapps; - import android.app.Activity; import android.content.Context; import android.os.UserManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java b/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java index 9e190b56e49..f56fbbf00e6 100644 --- a/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java @@ -46,9 +46,9 @@ import android.widget.Button; import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java b/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java index 76549212a0c..220d8299f62 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java @@ -80,7 +80,7 @@ public class UtilsTest { @Test public void testGetBluetoothDrawable_noBatteryLevel_returnSimpleDrawable() { final Drawable drawable = Utils.getBluetoothDrawable(RuntimeEnvironment.application, - R.drawable.ic_bt_laptop, BluetoothDevice.BATTERY_LEVEL_UNKNOWN); + R.drawable.ic_bt_laptop, BluetoothDevice.BATTERY_LEVEL_UNKNOWN, 1 /* iconScale */); assertThat(drawable).isNotInstanceOf(BluetoothDeviceLayerDrawable.class); } @@ -88,7 +88,7 @@ public class UtilsTest { @Test public void testGetBluetoothDrawable_hasBatteryLevel_returnLayerDrawable() { final Drawable drawable = Utils.getBluetoothDrawable(RuntimeEnvironment.application, - R.drawable.ic_bt_laptop, 10 /* batteryLevel */); + R.drawable.ic_bt_laptop, 10 /* batteryLevel */, 1 /* iconScale */); assertThat(drawable).isInstanceOf(BluetoothDeviceLayerDrawable.class); } diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java index e00908e52b3..4b345d072d7 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java @@ -37,6 +37,7 @@ import android.graphics.drawable.Icon; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.widget.RelativeLayout; @@ -89,6 +90,8 @@ public class DashboardAdapterTest { private ArgumentCaptor mActionCategoryCaptor = ArgumentCaptor.forClass(Integer.class); @Captor private ArgumentCaptor mActionPackageCaptor = ArgumentCaptor.forClass(String.class); + @Captor + private ArgumentCaptor mTaggedDataCaptor = ArgumentCaptor.forClass(Pair.class); private FakeFeatureFactory mFactory; private DashboardAdapter mDashboardAdapter; private DashboardAdapter.SuggestionAndConditionHeaderHolder mSuggestionHolder; @@ -123,112 +126,143 @@ public class DashboardAdapterTest { @Test public void testSuggestionsLogs_NotExpanded() { setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3")); + verify(mFactory.metricsFeatureProvider, times(2)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg2"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION - }; - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); + MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly("pkg1", "pkg2"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_NotExpandedAndPaused() { setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3")); + mDashboardAdapter.onPause(); + verify(mFactory.metricsFeatureProvider, times(4)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg2", "pkg1", "pkg2"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION}; - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); + MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly( + "pkg1", "pkg2", "pkg1", "pkg2"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_Expanded() { setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3")); + mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); + verify(mFactory.metricsFeatureProvider, times(3)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg2", "pkg3"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly( + "pkg1", "pkg2", "pkg3"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_ExpandedAndPaused() { setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3")); + mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); mDashboardAdapter.onPause(); + verify(mFactory.metricsFeatureProvider, times(6)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg2", "pkg3", "pkg1", "pkg2", "pkg3"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly( + "pkg1", "pkg2", "pkg3", "pkg1", "pkg2", "pkg3"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_ExpandedAfterPause() { setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3")); + mDashboardAdapter.onPause(); mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); + verify(mFactory.metricsFeatureProvider, times(7)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{ - "pkg1", "pkg2", "pkg1", "pkg2", "pkg1", "pkg2", "pkg3"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly( + "pkg1", "pkg2", "pkg1", "pkg2", "pkg1", "pkg2", "pkg3"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_ExpandedAfterPauseAndPausedAgain() { setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3")); + mDashboardAdapter.onPause(); mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); mDashboardAdapter.onPause(); + verify(mFactory.metricsFeatureProvider, times(10)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{ - "pkg1", "pkg2", "pkg1", "pkg2", "pkg1", "pkg2", "pkg3", "pkg1", "pkg2", "pkg3"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, @@ -238,63 +272,82 @@ public class DashboardAdapterTest { MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly( + "pkg1", "pkg2", "pkg1", "pkg2", "pkg1", "pkg2", "pkg3", "pkg1", "pkg2", "pkg3"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_ExpandedWithLessThanDefaultShown() { setupSuggestions(makeSuggestions("pkg1")); + mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); + verify(mFactory.metricsFeatureProvider, times(1)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1"}; - Integer[] expectedActions = new Integer[]{ - MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( + MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly("pkg1"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_ExpandedWithLessThanDefaultShownAndPaused() { setupSuggestions(makeSuggestions("pkg1")); + mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); mDashboardAdapter.onPause(); + verify(mFactory.metricsFeatureProvider, times(2)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg1"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly("pkg1", "pkg1"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test public void testSuggestionsLogs_ExpandedWithLessThanDefaultShownAfterPause() { setupSuggestions(makeSuggestions("pkg1")); + mDashboardAdapter.onPause(); mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); + verify(mFactory.metricsFeatureProvider, times(3)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg1", "pkg1"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly("pkg1", "pkg1", "pkg1"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); } @Test @@ -304,18 +357,46 @@ public class DashboardAdapterTest { mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); mSuggestionHolder.itemView.callOnClick(); mDashboardAdapter.onPause(); + verify(mFactory.metricsFeatureProvider, times(4)).action( any(Context.class), mActionCategoryCaptor.capture(), - mActionPackageCaptor.capture()); - String[] expectedPackages = new String[]{"pkg1", "pkg1", "pkg1", "pkg1"}; - Integer[] expectedActions = new Integer[]{ + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, - MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION - }; - assertThat(mActionPackageCaptor.getAllValues().toArray()).isEqualTo(expectedPackages); - assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions); + MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly( + "pkg1", "pkg1", "pkg1", "pkg1"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); + } + + @Test + public void testSuggestionsLogs_SmartSuggestionEnabled() { + when(mFactory.suggestionsFeatureProvider + .isSmartSuggestionEnabled(any(Context.class))).thenReturn(true); + setupSuggestions(makeSuggestions("pkg1")); + + mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData); + mSuggestionHolder.itemView.callOnClick(); + mDashboardAdapter.onPause(); + + verify(mFactory.metricsFeatureProvider, times(2)).action( + any(Context.class), mActionCategoryCaptor.capture(), + mActionPackageCaptor.capture(), + mTaggedDataCaptor.capture()); + assertThat(mActionCategoryCaptor.getAllValues()).containsExactly( + MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, + MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION); + assertThat(mActionPackageCaptor.getAllValues()).containsExactly("pkg1", "pkg1"); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 1), + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 1)); } @Test diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java index 68d33545bc1..cc4f7417902 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java @@ -16,6 +16,13 @@ package com.android.settings.dashboard; +import static com.android.settings.dashboard.DashboardData.STABLE_ID_CONDITION_CONTAINER; +import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONDITION_FOOTER; +import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONTAINER; +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import android.support.annotation.NonNull; import android.support.v7.util.DiffUtil; import android.support.v7.util.ListUpdateCallback; @@ -41,15 +48,6 @@ import java.util.Collections; import java.util.List; import java.util.Objects; -import static com.android.settings.dashboard.DashboardData.STABLE_ID_CONDITION_CONTAINER; -import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONDITION_FOOTER; -import static com.android.settings.dashboard.DashboardData - .STABLE_ID_SUGGESTION_CONDITION_TOP_HEADER; -import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONTAINER; -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - @RunWith(RobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class DashboardDataTest { @@ -216,6 +214,38 @@ public class DashboardDataTest { mDashboardDataWithTwoConditions, testResultData); } + @Test + public void testDiffUtil_RemoveOneSuggestion_causeItemRemoveAndChange() { + //Build testResultData + final List testResultData = new ArrayList<>(); + testResultData.add(new ListUpdateResult.ResultData( + ListUpdateResult.ResultData.TYPE_OPERATION_REMOVE, 0, 1)); + testResultData.add(new ListUpdateResult.ResultData( + ListUpdateResult.ResultData.TYPE_OPERATION_CHANGE, 1, 1)); + // Build DashboardData + final List oneItemConditions = new ArrayList<>(); + when(mTestCondition.shouldShow()).thenReturn(true); + oneItemConditions.add(mTestCondition); + final List suggestions = new ArrayList<>(); + mTestSuggestion.title = TEST_SUGGESTION_TITLE; + suggestions.add(mTestSuggestion); + + final DashboardData oldData = new DashboardData.Builder() + .setConditions(oneItemConditions) + .setCategory(mDashboardCategory) + .setSuggestions(suggestions) + .setSuggestionConditionMode(DashboardData.HEADER_MODE_DEFAULT) + .build(); + final DashboardData newData = new DashboardData.Builder() + .setConditions(oneItemConditions) + .setSuggestions(null) + .setCategory(mDashboardCategory) + .setSuggestionConditionMode(DashboardData.HEADER_MODE_DEFAULT) + .build(); + + testDiffUtil(oldData, newData, testResultData); + } + @Test public void testDiffUtil_DeleteAllData_ResultDataOneDeleted() { //Build testResultData diff --git a/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java b/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java index 6fe60cf5124..3155ea90a33 100644 --- a/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java @@ -26,7 +26,9 @@ import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.shadow.SettingsShadowSystemProperties; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -39,6 +41,7 @@ import org.robolectric.util.ReflectionHelpers; import java.util.List; +import static android.util.FeatureFlagUtils.FFLAG_PREFIX; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.nullable; @@ -53,7 +56,8 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(SettingsRobolectricTestRunner.class) -@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, + shadows = {SettingsShadowSystemProperties.class}) public class ProgressiveDisclosureTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) @@ -80,6 +84,25 @@ public class ProgressiveDisclosureTest { mPreference.setKey("test"); } + @After + public void tearDown() { + SettingsShadowSystemProperties.clear(); + } + + @Test + public void systemPropertySetForNewAdvancedButtonFeature_verifyIsDisabled() { + SettingsShadowSystemProperties.set( + FFLAG_PREFIX + ProgressiveDisclosureMixin.FEATURE_FLAG_NEW_ADVANCE_BUTTON, "true"); + assertThat(mMixin.isEnabled()).isFalse(); + } + + @Test + public void systemPropertyNotSet_verifyIsDisabled() { + SettingsShadowSystemProperties.set( + FFLAG_PREFIX + ProgressiveDisclosureMixin.FEATURE_FLAG_NEW_ADVANCE_BUTTON, "false"); + assertThat(mMixin.isEnabled()).isTrue(); + } + @Test public void shouldNotCollapse_lessPreferenceThanLimit() { when(mScreen.getPreferenceCount()).thenReturn(5); diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/ShadowSuggestionController.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/ShadowSuggestionController.java new file mode 100644 index 00000000000..b720f83a210 --- /dev/null +++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/ShadowSuggestionController.java @@ -0,0 +1,61 @@ +/* + * 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.dashboard.suggestions; + +import android.service.settings.suggestions.Suggestion; + +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; + +import java.util.List; + +@Implements(SuggestionController.class) +public class ShadowSuggestionController { + + public static boolean sStartCalled; + public static boolean sStopCalled; + public static boolean sGetSuggestionCalled; + + public static List sSuggestions; + + public static void reset() { + sStartCalled = false; + sStopCalled = false; + sGetSuggestionCalled = false; + sSuggestions = null; + } + + @Implementation + public void start() { + sStartCalled = true; + } + + @Implementation + public void stop() { + sStopCalled = true; + } + + public static void setSuggestion(List suggestions) { + sSuggestions = suggestions; + } + + @Implementation + public List getSuggestions() { + sGetSuggestionCalled = true; + return sSuggestions; + } +} diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionControllerMixinTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionControllerMixinTest.java new file mode 100644 index 00000000000..e1184783423 --- /dev/null +++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionControllerMixinTest.java @@ -0,0 +1,99 @@ +/* + * 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.dashboard.suggestions; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.util.FeatureFlagUtils; + +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowSystemProperties; +import com.android.settingslib.core.lifecycle.Lifecycle; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, + shadows = { + SettingsShadowSystemProperties.class, + ShadowSuggestionController.class + }) +public class SuggestionControllerMixinTest { + + @Mock + private Context mContext; + private Lifecycle mLifecycle; + private SuggestionControllerMixin mMixin; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mLifecycle = new Lifecycle(); + when(mContext.getApplicationContext()).thenReturn(mContext); + SettingsShadowSystemProperties.set( + FeatureFlagUtils.FFLAG_PREFIX + SuggestionControllerMixin.FEATURE_FLAG, "true"); + } + + @After + public void tearDown() { + ShadowSuggestionController.reset(); + SettingsShadowSystemProperties.clear(); + } + + @Test + public void systemPropertySet_verifyIsEnabled() { + SettingsShadowSystemProperties.set( + FeatureFlagUtils.FFLAG_PREFIX + SuggestionControllerMixin.FEATURE_FLAG, "true"); + assertThat(SuggestionControllerMixin.isEnabled()).isTrue(); + } + + @Test + public void systemPropertyNotSet_verifyIsDisabled() { + SettingsShadowSystemProperties.set( + FeatureFlagUtils.FFLAG_PREFIX + SuggestionControllerMixin.FEATURE_FLAG, "false"); + assertThat(SuggestionControllerMixin.isEnabled()).isFalse(); + } + + @Test + public void goThroughLifecycle_onStartStop_shouldStartStopService() { + mMixin = new SuggestionControllerMixin(mContext, mLifecycle); + + mLifecycle.onStart(); + assertThat(ShadowSuggestionController.sStartCalled).isTrue(); + + mLifecycle.onStop(); + assertThat(ShadowSuggestionController.sStopCalled).isTrue(); + } + + @Test + public void onServiceConnected_shouldGetSuggestion() { + mMixin = new SuggestionControllerMixin(mContext, mLifecycle); + mMixin.onServiceConnected(); + + assertThat(ShadowSuggestionController.sGetSuggestionCalled).isTrue(); + } + +} diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java index 45d04a45657..c343f972bd8 100644 --- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java @@ -35,7 +35,9 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.hardware.fingerprint.FingerprintManager; import android.provider.Settings.Secure; +import android.util.Pair; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.Settings.AmbientDisplayPickupSuggestionActivity; @@ -60,6 +62,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; @@ -93,6 +97,8 @@ public class SuggestionFeatureProviderImplTest { private FingerprintManager mFingerprintManager; @Mock private SharedPreferences mSharedPreferences; + @Captor + private ArgumentCaptor mTaggedDataCaptor = ArgumentCaptor.forClass(Pair.class); private FakeFeatureFactory mFactory; private SuggestionFeatureProviderImpl mProvider; @@ -335,7 +341,10 @@ public class SuggestionFeatureProviderImplTest { verify(mFactory.metricsFeatureProvider).action( eq(mContext), eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION), - anyString()); + anyString(), + mTaggedDataCaptor.capture()); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); verify(mContext, never()).getPackageManager(); } @@ -356,8 +365,10 @@ public class SuggestionFeatureProviderImplTest { verify(mFactory.metricsFeatureProvider).action( eq(mContext), eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION), - anyString()); - + anyString(), + mTaggedDataCaptor.capture()); + assertThat(mTaggedDataCaptor.getAllValues()).containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); verify(mContext.getPackageManager()) .setComponentEnabledSetting(mSuggestion.intent.getComponent(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionLogHelperTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionLogHelperTest.java new file mode 100644 index 00000000000..8eb4273fc54 --- /dev/null +++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionLogHelperTest.java @@ -0,0 +1,41 @@ +/* + * 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.dashboard.suggestions; + +import static com.google.common.truth.Truth.assertThat; + +import android.util.Pair; + +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; + +import org.junit.Test; + +public class SuggestionLogHelperTest { + + @Test + public void testGetSmartSuggestionEnabledTaggedData_disabled() { + assertThat(SuggestionLogHelper.getSuggestionTaggedData(false)).asList().containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 0)); + } + + @Test + public void testGetSmartSuggestionEnabledTaggedData_enabled() { + assertThat(SuggestionLogHelper.getSuggestionTaggedData(true)).asList().containsExactly( + Pair.create(MetricsEvent.FIELD_SETTINGS_SMART_SUGGESTIONS_ENABLED, 1)); + } +} + diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionsChecksTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionsChecksTest.java index 59752c6575d..0165fffd8ea 100644 --- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionsChecksTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionsChecksTest.java @@ -33,6 +33,7 @@ import android.hardware.fingerprint.FingerprintManager; import com.android.settings.Settings; import com.android.settings.TestConfig; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.wrapper.WallpaperManagerWrapper; import com.android.settingslib.drawer.Tile; import org.junit.Before; diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java index 2f2a6852dae..26071ed07db 100644 --- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java +++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java @@ -16,7 +16,6 @@ package com.android.settings.datausage; - import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyInt; @@ -39,12 +38,12 @@ import android.util.ArraySet; import android.view.View; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowEntityHeaderController; import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.AppItem; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.After; import org.junit.Before; diff --git a/tests/robotests/src/com/android/settings/development/StayAwakePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/StayAwakePreferenceControllerTest.java new file mode 100644 index 00000000000..cbef53173e1 --- /dev/null +++ b/tests/robotests/src/com/android/settings/development/StayAwakePreferenceControllerTest.java @@ -0,0 +1,117 @@ +package com.android.settings.development; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.ContentResolver; +import android.content.Context; +import android.provider.Settings; +import android.support.v7.preference.PreferenceScreen; + +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.RestrictedSwitchPreference; +import com.android.settingslib.core.lifecycle.Lifecycle; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class StayAwakePreferenceControllerTest { + + @Mock + private Context mContext; + @Mock + private RestrictedSwitchPreference mPreference; + @Mock + private PreferenceScreen mPreferenceScreen; + @Mock + private Lifecycle mLifecycle; + private ContentResolver mContentResolver; + private StayAwakePreferenceController mController; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mContentResolver = RuntimeEnvironment.application.getContentResolver(); + mController = new StayAwakePreferenceController(mContext, mLifecycle); + when(mContext.getContentResolver()).thenReturn(mContentResolver); + when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn( + mPreference); + mController.displayPreference(mPreferenceScreen); + } + + @Test + public void onPreferenceChanged_turnOnStayAwake() { + mController.onPreferenceChange(null, true); + + final int mode = Settings.System.getInt(mContentResolver, + Settings.Global.STAY_ON_WHILE_PLUGGED_IN, -1); + assertThat(mode).isEqualTo(StayAwakePreferenceController.SETTING_VALUE_ON); + } + + @Test + public void onPreferenceChanged_turnOffStayAwake() { + mController.onPreferenceChange(null, false); + + final int mode = Settings.System.getInt(mContentResolver, + Settings.Global.STAY_ON_WHILE_PLUGGED_IN, -1); + assertThat(mode).isEqualTo(StayAwakePreferenceController.SETTING_VALUE_OFF); + } + + @Test + public void updateState_preferenceShouldBeChecked() { + Settings.System.putInt(mContentResolver, Settings.Global.STAY_ON_WHILE_PLUGGED_IN, + StayAwakePreferenceController.SETTING_VALUE_ON); + mController.updateState(mPreference); + verify(mPreference).setChecked(true); + } + + @Test + public void updateState_preferenceShouldNotBeChecked() { + Settings.System.putInt(mContentResolver, Settings.Global.STAY_ON_WHILE_PLUGGED_IN, + StayAwakePreferenceController.SETTING_VALUE_OFF); + mController.updateState(mPreference); + verify(mPreference).setChecked(false); + } + + @Test + public void displayPreference_expectSetDisabledByAdminToBeCalled() { + mController = spy(mController); + RestrictedLockUtils.EnforcedAdmin admin = Mockito.mock( + RestrictedLockUtils.EnforcedAdmin.class); + doReturn(admin).when(mController).checkIfMaximumTimeToLockSetByAdmin(); + mController.updateState(mPreference); + verify(mPreference).setDisabledByAdmin(admin); + } + + @Test + public void observerOnChangeCalledWithSameUri_preferenceShouldBeUpdated() { + Settings.System.putInt(mContentResolver, Settings.Global.STAY_ON_WHILE_PLUGGED_IN, + StayAwakePreferenceController.SETTING_VALUE_ON); + mController.mSettingsObserver.onChange(false, + Settings.Global.getUriFor(Settings.Global.STAY_ON_WHILE_PLUGGED_IN)); + verify(mPreference).setChecked(true); + } + + @Test + public void observerOnChangeCalledWithDifferentUri_preferenceShouldNotBeUpdated() { + Settings.System.putInt(mContentResolver, Settings.Global.STAY_ON_WHILE_PLUGGED_IN, + StayAwakePreferenceController.SETTING_VALUE_ON); + mController.mSettingsObserver.onChange(false, null); + verify(mPreference, never()).setChecked(true); + } +} diff --git a/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeOptionMenuControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeOptionMenuControllerTest.java index ca6a33a268b..6363317ed17 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeOptionMenuControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeOptionMenuControllerTest.java @@ -30,7 +30,7 @@ import android.view.MenuItem; import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java index a87f563cc9e..b1296e5f38b 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java @@ -18,7 +18,11 @@ package com.android.settings.deviceinfo; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -26,6 +30,7 @@ import android.app.Activity; import android.os.storage.StorageManager; import android.provider.SearchIndexableResource; import android.util.SparseArray; +import android.view.View; import com.android.settings.deviceinfo.storage.CachedStorageValuesHelper; import com.android.settings.deviceinfo.storage.StorageAsyncLoader; @@ -33,6 +38,7 @@ import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settingslib.deviceinfo.PrivateStorageInfo; import com.android.settingslib.drawer.CategoryKey; +import android.support.v7.widget.RecyclerView; import org.junit.Before; import org.junit.Test; @@ -114,6 +120,87 @@ public class StorageDashboardFragmentTest { assertThat(mFragment.getAppsStorageResult()).isNull(); } + @Test + public void test_loadWhenQuotaOffIfVolumeInfoNotLoaded() { + View fakeView = mock(View.class, RETURNS_DEEP_STUBS); + RecyclerView fakeRecyclerView = mock(RecyclerView.class, RETURNS_DEEP_STUBS); + when(fakeView.findViewById(anyInt())).thenReturn(fakeView); + mFragment = spy(mFragment); + when(mFragment.getView()).thenReturn(fakeView); + when(mFragment.getListView()).thenReturn(fakeRecyclerView); + + mFragment.maybeSetLoading(false); + + verify(mFragment).setLoading(true, false); + } + + @Test + public void test_dontLoadWhenQuotaOffIfVolumeInfoNotLoaded() { + View fakeView = mock(View.class, RETURNS_DEEP_STUBS); + RecyclerView fakeRecyclerView = mock(RecyclerView.class, RETURNS_DEEP_STUBS); + when(fakeView.findViewById(anyInt())).thenReturn(fakeView); + mFragment = spy(mFragment); + when(mFragment.getView()).thenReturn(fakeView); + when(mFragment.getListView()).thenReturn(fakeRecyclerView); + + PrivateStorageInfo info = new PrivateStorageInfo(0, 0); + mFragment.setPrivateStorageInfo(info); + + mFragment.maybeSetLoading(false); + + verify(mFragment, never()).setLoading(true, false); + } + + @Test + public void test_loadWhenQuotaOnAndVolumeInfoLoadedButAppsMissing() { + View fakeView = mock(View.class, RETURNS_DEEP_STUBS); + RecyclerView fakeRecyclerView = mock(RecyclerView.class, RETURNS_DEEP_STUBS); + when(fakeView.findViewById(anyInt())).thenReturn(fakeView); + mFragment = spy(mFragment); + when(mFragment.getView()).thenReturn(fakeView); + when(mFragment.getListView()).thenReturn(fakeRecyclerView); + + PrivateStorageInfo info = new PrivateStorageInfo(0, 0); + mFragment.setPrivateStorageInfo(info); + + mFragment.maybeSetLoading(true); + + verify(mFragment).setLoading(true, false); + } + + @Test + public void test_loadWhenQuotaOnAndAppsLoadedButVolumeInfoMissing() { + View fakeView = mock(View.class, RETURNS_DEEP_STUBS); + RecyclerView fakeRecyclerView = mock(RecyclerView.class, RETURNS_DEEP_STUBS); + when(fakeView.findViewById(anyInt())).thenReturn(fakeView); + mFragment = spy(mFragment); + when(mFragment.getView()).thenReturn(fakeView); + when(mFragment.getListView()).thenReturn(fakeRecyclerView); + mFragment.setAppsStorageResult(new SparseArray<>()); + + mFragment.maybeSetLoading(true); + + verify(mFragment).setLoading(true, false); + } + + @Test + public void test_dontLoadWhenQuotaOnAndAllLoaded() { + View fakeView = mock(View.class, RETURNS_DEEP_STUBS); + RecyclerView fakeRecyclerView = mock(RecyclerView.class, RETURNS_DEEP_STUBS); + when(fakeView.findViewById(anyInt())).thenReturn(fakeView); + mFragment = spy(mFragment); + when(mFragment.getView()).thenReturn(fakeView); + when(mFragment.getListView()).thenReturn(fakeRecyclerView); + + mFragment.setAppsStorageResult(new SparseArray<>()); + PrivateStorageInfo storageInfo = new PrivateStorageInfo(0, 0); + mFragment.setPrivateStorageInfo(storageInfo); + + mFragment.maybeSetLoading(true); + + verify(mFragment, never()).setLoading(true, false); + } + @Test public void testSearchIndexProvider_shouldIndexResource() { final List indexRes = diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java index a871c1963f3..f0683979b2d 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java @@ -36,7 +36,7 @@ import android.util.SparseArray; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.UserManagerWrapper; +import com.android.settings.wrapper.UserManagerWrapper; import com.android.settingslib.R; import com.android.settingslib.applications.StorageStatsSource; import com.android.settingslib.core.AbstractPreferenceController; diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java index d3b5cbbea29..ddd3d475115 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java @@ -16,6 +16,7 @@ package com.android.settings.deviceinfo.storage; +import static com.android.settings.applications.ManageApplications.EXTRA_WORK_ID; import static com.android.settings.applications.ManageApplications.EXTRA_WORK_ONLY; import static com.android.settings.utils.FileSizeFormatter.MEGABYTE_IN_BYTES; import static com.google.common.truth.Truth.assertThat; @@ -193,6 +194,10 @@ public class StorageItemPreferenceControllerTest { intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS) .getBoolean(EXTRA_WORK_ONLY)) .isTrue(); + assertThat( + intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS) + .getInt(EXTRA_WORK_ID)) + .isEqualTo(0); } @Test diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/UserProfileControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/UserProfileControllerTest.java index a2e57b95e96..8da52608838 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/storage/UserProfileControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/UserProfileControllerTest.java @@ -37,8 +37,8 @@ import com.android.settings.SettingsActivity; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.SubSettings; import com.android.settings.TestConfig; -import com.android.settings.applications.UserManagerWrapper; import com.android.settings.deviceinfo.StorageProfileFragment; +import com.android.settings.wrapper.UserManagerWrapper; import com.android.settingslib.R; import com.android.settingslib.applications.StorageStatsSource; import com.android.settingslib.drawable.UserIconDrawable; diff --git a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java index d35adef7640..66bdba1decb 100644 --- a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java @@ -32,6 +32,7 @@ import android.support.v7.preference.PreferenceScreen; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settings.wrapper.PowerManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java index 899ff5c66db..1ea2567b58f 100644 --- a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java @@ -31,8 +31,9 @@ import android.text.SpannableStringBuilder; import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; -import com.android.settings.vpn2.ConnectivityManagerWrapper; +import com.android.settings.wrapper.ConnectivityManagerWrapper; +import com.android.settings.wrapper.DevicePolicyManagerWrapper; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java b/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java index ad52bf6026e..6e58b13278e 100644 --- a/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java +++ b/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java @@ -33,11 +33,11 @@ import android.widget.Button; import com.android.settings.R; import com.android.settings.TestConfig; import com.android.settings.password.ChooseLockSettingsHelper; -import com.android.settings.password.IFingerprintManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.ShadowEventLogWriter; import com.android.settings.testutils.shadow.ShadowUtils; +import com.android.settings.wrapper.FingerprintManagerWrapper; import org.junit.After; import org.junit.Before; @@ -66,7 +66,7 @@ import org.robolectric.shadows.ShadowActivity.IntentForResult; public class FingerprintEnrollFindSensorTest { @Mock - private IFingerprintManager mFingerprintManager; + private FingerprintManagerWrapper mFingerprintManager; private FingerprintEnrollFindSensor mActivity; diff --git a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollFindSensorTest.java b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollFindSensorTest.java index ce31328edb8..b2ef65b58d2 100644 --- a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollFindSensorTest.java +++ b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollFindSensorTest.java @@ -27,11 +27,11 @@ import android.widget.Button; import com.android.settings.R; import com.android.settings.TestConfig; import com.android.settings.password.ChooseLockSettingsHelper; -import com.android.settings.password.IFingerprintManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.ShadowEventLogWriter; import com.android.settings.testutils.shadow.ShadowUtils; +import com.android.settings.wrapper.FingerprintManagerWrapper; import org.junit.After; import org.junit.Before; @@ -58,7 +58,7 @@ import org.robolectric.shadows.ShadowAlertDialog; public class SetupFingerprintEnrollFindSensorTest { @Mock - private IFingerprintManager mFingerprintManager; + private FingerprintManagerWrapper mFingerprintManager; private SetupFingerprintEnrollFindSensor mActivity; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AppButtonsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AppButtonsPreferenceControllerTest.java index 6214cf2e139..ad5f5b0820d 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AppButtonsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AppButtonsPreferenceControllerTest.java @@ -43,10 +43,10 @@ import android.os.UserManager; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.TestConfig; -import com.android.settings.enterprise.DevicePolicyManagerWrapper; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.widget.ActionButtonPreference; import com.android.settings.widget.ActionButtonPreferenceTest; +import com.android.settings.wrapper.DevicePolicyManagerWrapper; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.instantapps.InstantAppDataProvider; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java index 86836f9f3f4..4353b54a8c7 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java @@ -38,7 +38,7 @@ import android.widget.Button; import com.android.settings.R; import com.android.settings.TestConfig; -import com.android.settings.enterprise.DevicePolicyManagerWrapper; +import com.android.settings.wrapper.DevicePolicyManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicyTest.java index 169cba8e9bf..9bbc9bd7be6 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicyTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDetectionPolicyTest.java @@ -30,6 +30,7 @@ import android.util.KeyValueListParser; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settings.wrapper.KeyValueListParserWrapper; import org.junit.Before; import org.junit.Test; @@ -54,7 +55,7 @@ public class AnomalyDetectionPolicyTest { public void setUp() { mContext = RuntimeEnvironment.application; mKeyValueListParserWrapper = spy( - new KeyValueListParserWrapperImpl(new KeyValueListParser(','))); + new KeyValueListParserWrapper(new KeyValueListParser(','))); } @Test @@ -84,7 +85,7 @@ public class AnomalyDetectionPolicyTest { assertThat(anomalyDetectionPolicy.anomalyDetectionEnabled).isTrue(); assertThat(anomalyDetectionPolicy.wakeLockDetectionEnabled).isTrue(); assertThat(anomalyDetectionPolicy.wakeLockThreshold).isEqualTo(DateUtils.HOUR_IN_MILLIS); - assertThat(anomalyDetectionPolicy.wakeupAlarmDetectionEnabled).isTrue(); + assertThat(anomalyDetectionPolicy.wakeupAlarmDetectionEnabled).isFalse(); assertThat(anomalyDetectionPolicy.wakeupAlarmThreshold).isEqualTo(60); assertThat(anomalyDetectionPolicy.bluetoothScanDetectionEnabled).isTrue(); assertThat(anomalyDetectionPolicy.bluetoothScanThreshold).isEqualTo( @@ -112,7 +113,7 @@ public class AnomalyDetectionPolicyTest { doReturn(false).when(mKeyValueListParserWrapper).getBoolean( AnomalyDetectionPolicy.KEY_WAKELOCK_DETECTION_ENABLED, true); doReturn(true).when(mKeyValueListParserWrapper).getBoolean( - AnomalyDetectionPolicy.KEY_WAKEUP_ALARM_DETECTION_ENABLED, true); + AnomalyDetectionPolicy.KEY_WAKEUP_ALARM_DETECTION_ENABLED, false); doReturn(true).when(mKeyValueListParserWrapper).getBoolean( AnomalyDetectionPolicy.KEY_BLUETOOTH_SCAN_DETECTION_ENABLED, true); diff --git a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java index 809fb3ae521..5c6e777395d 100644 --- a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java +++ b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java @@ -43,6 +43,7 @@ import android.view.textservice.TextServicesManager; import com.android.settings.R; import com.android.settings.TestConfig; +import com.android.settings.dashboard.ProgressiveDisclosureMixin; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.XmlTestUtils; @@ -59,6 +60,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.List; @@ -101,6 +103,9 @@ public class LanguageAndInputSettingsTest { @Test public void testGetPreferenceScreenResId() { + ProgressiveDisclosureMixin progessiveMixin = mock(ProgressiveDisclosureMixin.class); + when(progessiveMixin.isEnabled()).thenReturn(true); + ReflectionHelpers.setField(mFragment, "mProgressiveDisclosureMixin", progessiveMixin); assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(R.xml.language_and_input); } @@ -167,7 +172,10 @@ public class LanguageAndInputSettingsTest { .getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys); final List niks = LanguageAndInputSettings.SEARCH_INDEX_DATA_PROVIDER .getNonIndexableKeys(context); - final int xmlId = (new LanguageAndInputSettings()).getPreferenceScreenResId(); + LanguageAndInputSettings settings = new LanguageAndInputSettings(); + ReflectionHelpers.setField(settings, "mProgressiveDisclosureMixin", + mock(ProgressiveDisclosureMixin.class)); + final int xmlId = settings.getPreferenceScreenResId(); final List keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId); @@ -178,6 +186,8 @@ public class LanguageAndInputSettingsTest { public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() { final Context context = RuntimeEnvironment.application; final LanguageAndInputSettings fragment = new LanguageAndInputSettings(); + ReflectionHelpers.setField(fragment, "mProgressiveDisclosureMixin", + mock(ProgressiveDisclosureMixin.class)); final List preferenceScreenKeys = XmlTestUtils.getKeysFromPreferenceXml(context, fragment.getPreferenceScreenResId()); final List preferenceKeys = new ArrayList<>(); diff --git a/tests/robotests/src/com/android/settings/network/NetworkScorerPickerPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/NetworkScorerPickerPreferenceControllerTest.java index 0b1586e2c9b..7ed7f3f0e0e 100644 --- a/tests/robotests/src/com/android/settings/network/NetworkScorerPickerPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/NetworkScorerPickerPreferenceControllerTest.java @@ -30,6 +30,7 @@ import android.support.v7.preference.Preference; import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settings.wrapper.NetworkScoreManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/network/NetworkScorerPickerTest.java b/tests/robotests/src/com/android/settings/network/NetworkScorerPickerTest.java index 9885bdf684f..7cfced870d5 100644 --- a/tests/robotests/src/com/android/settings/network/NetworkScorerPickerTest.java +++ b/tests/robotests/src/com/android/settings/network/NetworkScorerPickerTest.java @@ -33,6 +33,8 @@ import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.widget.RadioButtonPreference; +import com.android.settings.wrapper.NetworkScoreManagerWrapper; + import com.google.android.collect.Lists; import org.junit.Before; import org.junit.Test; @@ -45,7 +47,6 @@ import org.robolectric.annotation.Config; import java.util.ArrayList; - @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class NetworkScorerPickerTest { diff --git a/tests/robotests/src/com/android/settings/notification/SoundSettingsTest.java b/tests/robotests/src/com/android/settings/notification/SoundSettingsTest.java index 59b70785e26..bd386468bc9 100644 --- a/tests/robotests/src/com/android/settings/notification/SoundSettingsTest.java +++ b/tests/robotests/src/com/android/settings/notification/SoundSettingsTest.java @@ -21,6 +21,7 @@ import android.content.Context; import android.media.AudioManager; import android.os.UserManager; import com.android.settings.R; +import com.android.settings.dashboard.ProgressiveDisclosureMixin; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.XmlTestUtils; @@ -30,6 +31,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; import java.util.List; @@ -59,7 +61,10 @@ public class SoundSettingsTest { final List niks = SoundSettings.SEARCH_INDEX_DATA_PROVIDER .getNonIndexableKeys(context); - final int xmlId = (new SoundSettings()).getPreferenceScreenResId(); + SoundSettings settings = new SoundSettings(); + ReflectionHelpers.setField(settings, "mProgressiveDisclosureMixin", + mock(ProgressiveDisclosureMixin.class)); + final int xmlId = settings.getPreferenceScreenResId(); final List keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId); keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(context, R.xml.zen_mode_settings)); diff --git a/tests/robotests/src/com/android/settings/password/SetNewPasswordControllerTest.java b/tests/robotests/src/com/android/settings/password/SetNewPasswordControllerTest.java index 96775addb8c..52678fbab29 100644 --- a/tests/robotests/src/com/android/settings/password/SetNewPasswordControllerTest.java +++ b/tests/robotests/src/com/android/settings/password/SetNewPasswordControllerTest.java @@ -43,6 +43,7 @@ import android.os.Bundle; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settings.wrapper.FingerprintManagerWrapper; import org.junit.Before; import org.junit.Test; @@ -52,7 +53,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; - /** * Tests for {@link SetNewPasswordController}. */ @@ -63,7 +63,7 @@ public final class SetNewPasswordControllerTest { private static final long FINGERPRINT_CHALLENGE = -9876512313131L; @Mock PackageManager mPackageManager; - @Mock IFingerprintManager mFingerprintManager; + @Mock FingerprintManagerWrapper mFingerprintManager; @Mock DevicePolicyManager mDevicePolicyManager; @Mock private SetNewPasswordController.Ui mUi; diff --git a/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java b/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java index db4aff7a13d..420fae9117e 100644 --- a/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java +++ b/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java @@ -27,7 +27,6 @@ import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.content.ContentValues; @@ -287,6 +286,7 @@ public class DatabaseIndexingManagerTest { @Test public void testLocaleUpdated_afterFullIndexing_localeAdded() { mManager.performIndexing(); + assertThat(IndexDatabaseHelper.isLocaleAlreadyIndexed(mContext, localeStr)).isTrue(); } @@ -302,8 +302,6 @@ public class DatabaseIndexingManagerTest { // Locale assertThat(cursor.getString(0)).isEqualTo(localeStr); - // Data Rank - assertThat(cursor.getInt(1)).isEqualTo(rank); // Data Title assertThat(cursor.getString(2)).isEqualTo(updatedTitle); // Normalized Title @@ -312,10 +310,6 @@ public class DatabaseIndexingManagerTest { assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn); // Summary On Normalized assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn); - // Summary Off - assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff); - // Summary off normalized - assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff); // Entries assertThat(cursor.getString(8)).isEqualTo(entries); // Keywords diff --git a/tests/robotests/src/com/android/settings/search/DatabaseResultLoaderTest.java b/tests/robotests/src/com/android/settings/search/DatabaseResultLoaderTest.java index 90f6e87907e..dd7b7a97f9d 100644 --- a/tests/robotests/src/com/android/settings/search/DatabaseResultLoaderTest.java +++ b/tests/robotests/src/com/android/settings/search/DatabaseResultLoaderTest.java @@ -24,6 +24,7 @@ import android.database.sqlite.SQLiteDatabase; import com.android.settings.TestConfig; import com.android.settings.dashboard.SiteMapManager; +import com.android.settings.search.indexing.IndexData; import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -227,8 +228,8 @@ public class DatabaseResultLoaderTest { } private void insertSpecialCase(String specialCase) { - String normalized = DatabaseIndexingUtils.normalizeHyphen(specialCase); - normalized = DatabaseIndexingUtils.normalizeString(normalized); + String normalized = IndexData.normalizeHyphen(specialCase); + normalized = IndexData.normalizeString(normalized); final ResultPayload payload = new ResultPayload(new Intent()); ContentValues values = new ContentValues(); diff --git a/tests/robotests/src/com/android/settings/search/InstalledAppResultLoaderTest.java b/tests/robotests/src/com/android/settings/search/InstalledAppResultLoaderTest.java index 19854fcf09e..f1a25a12002 100644 --- a/tests/robotests/src/com/android/settings/search/InstalledAppResultLoaderTest.java +++ b/tests/robotests/src/com/android/settings/search/InstalledAppResultLoaderTest.java @@ -41,11 +41,11 @@ import android.os.UserManager; import com.android.settings.R; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.dashboard.SiteMapManager; import com.android.settings.testutils.ApplicationTestUtils; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java b/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java index 89aa62ec2c6..ca04d2c6826 100644 --- a/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java +++ b/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java @@ -54,7 +54,6 @@ public class IndexDataConverterTest { private final String localeStr = "en_US"; - private final int rank = 8; private final String title = "title\u2011title"; private final String updatedTitle = "title-title"; private final String normalizedTitle = "titletitle"; @@ -128,8 +127,6 @@ public class IndexDataConverterTest { // Locale assertThat(cursor.getString(0)).isEqualTo(localeStr); - // Data Rank - assertThat(cursor.getInt(1)).isEqualTo(raw.rank); // Data Title assertThat(cursor.getString(2)).isEqualTo(updatedTitle); // Normalized Title @@ -138,10 +135,6 @@ public class IndexDataConverterTest { assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn); // Summary On Normalized assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn); - // Summary Off - assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff); - // Summary off normalized - assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff); // Entries assertThat(cursor.getString(8)).isEqualTo(raw.entries); // Keywords @@ -225,8 +218,6 @@ public class IndexDataConverterTest { // Locale assertThat(cursor.getString(0)).isEqualTo(localeStr); - // Data Rank - assertThat(cursor.getInt(1)).isEqualTo(rank); // Data Title assertThat(cursor.getString(2)).isEqualTo("App info"); // Normalized Title @@ -235,10 +226,6 @@ public class IndexDataConverterTest { assertThat(cursor.getString(4)).isEqualTo("Manage apps, set up quick launch shortcuts"); // Summary On Normalized assertThat(cursor.getString(5)).isEqualTo("manage apps, set up quick launch shortcuts"); - // Summary Off - only on for checkbox preferences - assertThat(cursor.getString(6)).isEmpty(); - // Summary off normalized - only on for checkbox preferences - assertThat(cursor.getString(7)).isEmpty(); // Entries - only on for list preferences assertThat(cursor.getString(8)).isNull(); // Keywords @@ -285,8 +272,6 @@ public class IndexDataConverterTest { // Locale assertThat(cursor.getString(0)).isEqualTo(localeStr); - // Data Rank - assertThat(cursor.getInt(1)).isEqualTo(rank); // Data Title assertThat(cursor.getString(2)).isEqualTo(prefTitle); // Normalized Title @@ -295,10 +280,6 @@ public class IndexDataConverterTest { assertThat(cursor.getString(4)).isEqualTo(prefSummary); // Summary On Normalized assertThat(cursor.getString(5)).isEqualTo(prefSummary.toLowerCase()); - // Summary Off - only on for checkbox preferences - assertThat(cursor.getString(6)).isEmpty(); - // Summary off normalized - only on for checkbox preferences - assertThat(cursor.getString(7)).isEmpty(); // Entries - only on for list preferences assertThat(cursor.getString(8)).isNull(); // Keywords @@ -343,8 +324,6 @@ public class IndexDataConverterTest { cursor.moveToPosition(0); // Locale assertThat(cursor.getString(0)).isEqualTo(localeStr); - // Data Rank - assertThat(cursor.getInt(1)).isEqualTo(rank); // Data Title assertThat(cursor.getString(2)).isEqualTo("Advanced settings"); // Normalized Title @@ -353,10 +332,6 @@ public class IndexDataConverterTest { assertThat(cursor.getString(4)).isEqualTo("Enable more settings options"); // Summary On Normalized assertThat(cursor.getString(5)).isEqualTo("enable more settings options"); - // Summary Off - assertThat(cursor.getString(6)).isEqualTo("Enable more settings options"); - // Summary Off - assertThat(cursor.getString(7)).isEqualTo("enable more settings options"); // Entries - only on for list preferences assertThat(cursor.getString(8)).isNull(); // Keywords @@ -397,8 +372,6 @@ public class IndexDataConverterTest { cursor.moveToPosition(3); // Locale assertThat(cursor.getString(0)).isEqualTo(localeStr); - // Data Rank - assertThat(cursor.getInt(1)).isEqualTo(rank); // Data Title assertThat(cursor.getString(2)).isEqualTo("Preferred install location"); // Normalized Title @@ -409,10 +382,6 @@ public class IndexDataConverterTest { // Summary On Normalized assertThat(cursor.getString(5)).isEqualTo( "change the preferred installation location for new apps"); - // Summary Off - only on for checkbox preferences - assertThat(cursor.getString(6)).isEmpty(); - // Summary off normalized - only on for checkbox preferences - assertThat(cursor.getString(7)).isEmpty(); // Entries - only on for list preferences assertThat(cursor.getString(8)).isEqualTo("Internal device storage|Removable SD card|" + "Let the system decide|"); @@ -483,8 +452,6 @@ public class IndexDataConverterTest { // Locale assertThat(cursor.getString(0)).isEqualTo(localeStr); - // Data Rank - assertThat(cursor.getInt(1)).isEqualTo(0); // Data Title assertThat(cursor.getString(2)).isEqualTo("Display size"); // Normalized Title @@ -493,10 +460,6 @@ public class IndexDataConverterTest { assertThat(cursor.getString(4)).isEmpty(); // Summary On Normalized assertThat(cursor.getString(5)).isEmpty(); - // Summary Off - only on for checkbox preferences - assertThat(cursor.getString(6)).isEmpty(); - // Summary off normalized - only on for checkbox preferences - assertThat(cursor.getString(7)).isEmpty(); // Entries - only on for list preferences assertThat(cursor.getString(8)).isNull(); // Keywords @@ -550,8 +513,6 @@ public class IndexDataConverterTest { // Locale assertThat(cursor.getString(0)).isEqualTo(localeStr); - // Data Rank - assertThat(cursor.getInt(1)).isEqualTo(0); // Data Title assertThat(cursor.getString(2)).isEqualTo("Display size"); // Normalized Title @@ -560,10 +521,6 @@ public class IndexDataConverterTest { assertThat(cursor.getString(4)).isEmpty(); // Summary On Normalized assertThat(cursor.getString(5)).isEmpty(); - // Summary Off - only on for checkbox preferences - assertThat(cursor.getString(6)).isEmpty(); - // Summary off normalized - only on for checkbox preferences - assertThat(cursor.getString(7)).isEmpty(); // Entries - only on for list preferences assertThat(cursor.getString(8)).isNull(); // Keywords @@ -646,7 +603,6 @@ public class IndexDataConverterTest { private SearchIndexableRaw getFakeRaw(String localeStr) { SearchIndexableRaw data = new SearchIndexableRaw(mContext); data.locale = new Locale(localeStr); - data.rank = rank; data.title = title; data.summaryOn = summaryOn; data.summaryOff = summaryOff; @@ -667,7 +623,6 @@ public class IndexDataConverterTest { private SearchIndexableResource getFakeResource(int xml) { SearchIndexableResource sir = new SearchIndexableResource(mContext); - sir.rank = rank; sir.xmlResId = xml; sir.className = className; sir.packageName = packageName; diff --git a/tests/robotests/src/com/android/settings/search/indexing/IndexDataTest.java b/tests/robotests/src/com/android/settings/search/indexing/IndexDataTest.java index 40be4f2a98b..ae9d99842c4 100644 --- a/tests/robotests/src/com/android/settings/search/indexing/IndexDataTest.java +++ b/tests/robotests/src/com/android/settings/search/indexing/IndexDataTest.java @@ -41,17 +41,16 @@ public class IndexDataTest { private IndexData.Builder mBuilder; private static final String LOCALE = "locale"; - private static final String UPDATED_TITLE = "updated title"; - private static final String NORMALIZED_TITLE = "normal title"; - private static final String UPDATED_SUMMARY_ON = "updated summary on"; - private static final String NORMALIZED_SUMMARY_ON = "normalized summary on"; - private static final String UPDATED_SUMMARY_OFF = "updated summary off"; - private static final String NORMALIZED_SUMMARY_OFF = "normalized summary off"; + private static final String TITLE = "updated-title"; + private static final String NORM_TITLE = "updatedtitle"; + private static final String SUMMARY_ON = "updated-summary-on"; + private static final String NORM_SUMMARY_ON = "updatedsummaryon"; + private static final String SUMMARY_OFF = "updated-summary-off"; + private static final String NORM_SUMMARY_OFF = "updatedsummaryoff"; private static final String ENTRIES = "entries"; private static final String CLASS_NAME = "class name"; private static final String SCREEN_TITLE = "screen title"; private static final int ICON_RES_ID = 0xff; - private static final int RANK = 1; private static final String SPACE_DELIMITED_KEYWORDS = "keywords"; private static final String INTENT_ACTION = "intent action"; private static final String INTENT_TARGET_PACKAGE = "target package"; @@ -79,17 +78,14 @@ public class IndexDataTest { IndexData row = generateRow(); assertThat(row.locale).isEqualTo(LOCALE); - assertThat(row.updatedTitle).isEqualTo(UPDATED_TITLE); - assertThat(row.normalizedTitle).isEqualTo(NORMALIZED_TITLE); - assertThat(row.updatedSummaryOn).isEqualTo(UPDATED_SUMMARY_ON); - assertThat(row.normalizedSummaryOn).isEqualTo(NORMALIZED_SUMMARY_ON); - assertThat(row.updatedSummaryOff).isEqualTo(UPDATED_SUMMARY_OFF); - assertThat(row.normalizedSummaryOff).isEqualTo(NORMALIZED_SUMMARY_OFF); + assertThat(row.updatedTitle).isEqualTo(TITLE); + assertThat(row.normalizedTitle).isEqualTo(NORM_TITLE); + assertThat(row.updatedSummaryOn).isEqualTo(SUMMARY_ON); + assertThat(row.normalizedSummaryOn).isEqualTo(NORM_SUMMARY_ON); assertThat(row.entries).isEqualTo(ENTRIES); assertThat(row.className).isEqualTo(CLASS_NAME); assertThat(row.screenTitle).isEqualTo(SCREEN_TITLE); assertThat(row.iconResId).isEqualTo(ICON_RES_ID); - assertThat(row.rank).isEqualTo(RANK); assertThat(row.spaceDelimitedKeywords).isEqualTo(SPACE_DELIMITED_KEYWORDS); assertThat(row.intentAction).isEqualTo(INTENT_ACTION); assertThat(row.intentTargetClass).isEqualTo(INTENT_TARGET_CLASS); @@ -153,18 +149,13 @@ public class IndexDataTest { private IndexData.Builder createBuilder() { mBuilder = new IndexData.Builder(); mBuilder.setLocale(LOCALE) - .setUpdatedTitle(UPDATED_TITLE) - .setNormalizedTitle(NORMALIZED_TITLE) - .setUpdatedSummaryOn(UPDATED_SUMMARY_ON) - .setNormalizedSummaryOn(NORMALIZED_SUMMARY_ON) - .setUpdatedSummaryOff(UPDATED_SUMMARY_OFF) - .setNormalizedSummaryOff(NORMALIZED_SUMMARY_OFF) + .setTitle(TITLE) + .setSummaryOn(SUMMARY_ON) .setEntries(ENTRIES) .setClassName(CLASS_NAME) .setScreenTitle(SCREEN_TITLE) .setIconResId(ICON_RES_ID) - .setRank(RANK) - .setSpaceDelimitedKeywords(SPACE_DELIMITED_KEYWORDS) + .setKeywords(SPACE_DELIMITED_KEYWORDS) .setIntentAction(INTENT_ACTION) .setIntentTargetPackage(INTENT_TARGET_PACKAGE) .setIntentTargetClass(INTENT_TARGET_CLASS) diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManagerWrapperImpl.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManagerWrapperImpl.java index 95d5de5e5b9..22a1c047f25 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManagerWrapperImpl.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManagerWrapperImpl.java @@ -16,7 +16,7 @@ package com.android.settings.testutils.shadow; -import com.android.settings.applications.AccessibilityManagerWrapperImpl; +import com.android.settings.wrapper.AccessibilityManagerWrapper; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; @@ -24,7 +24,7 @@ import org.robolectric.annotation.Implements; /** * This class provides shadow for API that is not supported in current roboletric */ -@Implements(AccessibilityManagerWrapperImpl.class) +@Implements(AccessibilityManagerWrapper.class) public class ShadowAccessibilityManagerWrapperImpl { @Implementation diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityServiceInfoWrapperImpl.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityServiceInfoWrapperImpl.java index a6cb5d07bd6..dd4b2ee940e 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityServiceInfoWrapperImpl.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityServiceInfoWrapperImpl.java @@ -18,11 +18,11 @@ package com.android.settings.testutils.shadow; import android.content.ComponentName; -import com.android.settings.applications.AccessibilityServiceInfoWrapperImpl; +import com.android.settings.wrapper.AccessibilityServiceInfoWrapper; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; -@Implements(AccessibilityServiceInfoWrapperImpl.class) +@Implements(AccessibilityServiceInfoWrapper.class) public class ShadowAccessibilityServiceInfoWrapperImpl { private static ComponentName sComponentName; diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowKeyValueListParserWrapperImpl.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowKeyValueListParserWrapperImpl.java index 0af9c304942..05c6139c2cc 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowKeyValueListParserWrapperImpl.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowKeyValueListParserWrapperImpl.java @@ -1,6 +1,6 @@ package com.android.settings.testutils.shadow; -import com.android.settings.fuelgauge.anomaly.KeyValueListParserWrapperImpl; +import com.android.settings.wrapper.KeyValueListParserWrapper; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; @@ -10,7 +10,7 @@ import org.robolectric.annotation.Implements; * {@link #getBoolean(String, boolean)} that doesn't support in the current * robolectric */ -@Implements(KeyValueListParserWrapperImpl.class) +@Implements(KeyValueListParserWrapper.class) public class ShadowKeyValueListParserWrapperImpl { @Implementation diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPowerManagerWrapper.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPowerManagerWrapper.java index 7aa28fae00b..b1e62b068fd 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPowerManagerWrapper.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPowerManagerWrapper.java @@ -17,7 +17,7 @@ package com.android.settings.testutils.shadow; -import com.android.settings.display.PowerManagerWrapper; +import com.android.settings.wrapper.PowerManagerWrapper; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowRestrictedLockUtilsWrapper.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowRestrictedLockUtilsWrapper.java index 0e0adce7bff..58fc67a4b4f 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowRestrictedLockUtilsWrapper.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowRestrictedLockUtilsWrapper.java @@ -1,7 +1,7 @@ package com.android.settings.testutils.shadow; import android.content.Context; -import com.android.settings.network.RestrictedLockUtilsWrapper; +import com.android.settings.wrapper.RestrictedLockUtilsWrapper; import org.robolectric.annotation.Implements; /** diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUtils.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUtils.java index 271ffa8e8e3..bfeb3c7a3fe 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUtils.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUtils.java @@ -22,7 +22,7 @@ import android.os.UserHandle; import android.os.UserManager; import com.android.settings.Utils; -import com.android.settings.password.IFingerprintManager; +import com.android.settings.wrapper.FingerprintManagerWrapper; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; @@ -30,7 +30,7 @@ import org.robolectric.annotation.Implements; @Implements(Utils.class) public class ShadowUtils { - private static IFingerprintManager sFingerprintManager = null; + private static FingerprintManagerWrapper sFingerprintManager = null; private static boolean sIsUserAMonkey; private static boolean sIsDemoUser; private static ComponentName sDeviceOwnerComponentName; @@ -41,11 +41,11 @@ public class ShadowUtils { } @Implementation - public static IFingerprintManager getFingerprintManagerWrapperOrNull(Context context) { + public static FingerprintManagerWrapper getFingerprintManagerWrapperOrNull(Context context) { return sFingerprintManager; } - public static void setFingerprintManager(IFingerprintManager fingerprintManager) { + public static void setFingerprintManager(FingerprintManagerWrapper fingerprintManager) { sFingerprintManager = fingerprintManager; } diff --git a/tests/robotests/src/com/android/settings/vpn2/VpnUtilsTest.java b/tests/robotests/src/com/android/settings/vpn2/VpnUtilsTest.java index 29267274505..9442892956f 100644 --- a/tests/robotests/src/com/android/settings/vpn2/VpnUtilsTest.java +++ b/tests/robotests/src/com/android/settings/vpn2/VpnUtilsTest.java @@ -18,6 +18,7 @@ package com.android.settings.vpn2; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settings.wrapper.ConnectivityManagerWrapper; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java index e5354456edb..2a53ab6cd72 100644 --- a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java +++ b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java @@ -28,11 +28,12 @@ import android.os.UserManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.applications.defaultapps.DefaultAppInfo; import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.widget.RadioButtonPreference; +import com.android.settings.wrapper.UserPackageWrapper; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/wifi/UseOpenWifiPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/UseOpenWifiPreferenceControllerTest.java index a76b82a1f14..297054d6769 100644 --- a/tests/robotests/src/com/android/settings/wifi/UseOpenWifiPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/UseOpenWifiPreferenceControllerTest.java @@ -38,8 +38,8 @@ import android.support.v7.preference.Preference; import com.android.settings.R; import com.android.settings.TestConfig; -import com.android.settings.network.NetworkScoreManagerWrapper; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.wrapper.NetworkScoreManagerWrapper; import com.android.settingslib.core.lifecycle.Lifecycle; import com.google.common.collect.Lists; diff --git a/tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java index c7647ba2bee..63f89e62c5c 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java @@ -24,6 +24,7 @@ import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.widget.SwitchWidgetController; +import com.android.settings.wrapper.ConnectivityManagerWrapper; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java index 306b297c69f..0435b7eaef5 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java @@ -31,10 +31,10 @@ import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; import com.android.settings.R; -import com.android.settings.network.NetworkScoreManagerWrapper; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.shadow.SettingsShadowResources; +import com.android.settings.wrapper.NetworkScoreManagerWrapper; import com.android.settingslib.core.lifecycle.Lifecycle; import org.junit.After; diff --git a/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java b/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java index 41b71ada45c..5e10e0fc1f3 100644 --- a/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java @@ -27,6 +27,7 @@ import android.view.inputmethod.InputMethodManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.shadow.ShadowNfcAdapter; +import com.android.settings.wrapper.WifiManagerWrapper; import org.junit.After; import org.junit.Before; diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java index 1c2ddb4ac10..aa21a190639 100644 --- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java @@ -64,11 +64,11 @@ import com.android.settings.applications.LayoutPreference; import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowEntityHeaderController; -import com.android.settings.vpn2.ConnectivityManagerWrapperImpl; import com.android.settings.widget.ActionButtonPreference; import com.android.settings.widget.ActionButtonPreferenceTest; import com.android.settings.widget.EntityHeaderController; import com.android.settings.wifi.WifiDetailPreference; +import com.android.settings.wrapper.ConnectivityManagerWrapper; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.wifi.AccessPoint; @@ -108,7 +108,7 @@ public class WifiDetailPreferenceControllerTest { @Mock private AccessPoint mockAccessPoint; @Mock private Activity mockActivity; @Mock private ConnectivityManager mockConnectivityManager; - @Mock private ConnectivityManagerWrapperImpl mockConnectivityManagerWrapper; + @Mock private ConnectivityManagerWrapper mockConnectivityManagerWrapper; @Mock private Network mockNetwork; @Mock private NetworkInfo mockNetworkInfo; @Mock private WifiConfiguration mockWifiConfig; diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java index a23347abbbc..ff3f47e6cfa 100644 --- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java @@ -175,20 +175,29 @@ public class WifiTetherPreferenceControllerTest { } @Test - public void testReceiver_apStateChangedToEnablingOrEnabled_shouldNotUpdatePreferenceSummary() { + public void testReceiver_apStateChangedToEnabling_shouldUpdatePreferenceSummary() { + mController.displayPreference(mScreen); + receiveApStateChangedBroadcast(WifiManager.WIFI_AP_STATE_ENABLING); + assertThat(mPreference.getSummary().toString()).isEqualTo( + RuntimeEnvironment.application.getString(R.string.wifi_tether_starting)); + } + + @Test + public void testReceiver_apStateChangedToEnabled_shouldNotUpdatePreferenceSummary() { mController.displayPreference(mScreen); receiveApStateChangedBroadcast(WifiManager.WIFI_AP_STATE_DISABLED); assertThat(mPreference.getSummary().toString()).isEqualTo( RuntimeEnvironment.application.getString(R.string.wifi_hotspot_off_subtext)); - // When turning on the hotspot, we receive STATE_ENABLING followed by STATE_ENABLED. Neither - // of these should change the summary. + // When turning on the hotspot, we receive STATE_ENABLING followed by STATE_ENABLED. The + // first should change the status to wifi_tether_starting, and the second should not change + // this. receiveApStateChangedBroadcast(WifiManager.WIFI_AP_STATE_ENABLING); assertThat(mPreference.getSummary().toString()).isEqualTo( - RuntimeEnvironment.application.getString(R.string.wifi_hotspot_off_subtext)); + RuntimeEnvironment.application.getString(R.string.wifi_tether_starting)); receiveApStateChangedBroadcast(WifiManager.WIFI_AP_STATE_ENABLED); assertThat(mPreference.getSummary().toString()).isEqualTo( - RuntimeEnvironment.application.getString(R.string.wifi_hotspot_off_subtext)); + RuntimeEnvironment.application.getString(R.string.wifi_tether_starting)); } @Test diff --git a/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java b/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java index 5a3569c2248..f622804c04a 100644 --- a/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java +++ b/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java @@ -35,9 +35,9 @@ import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.util.SparseArray; -import com.android.settings.applications.PackageManagerWrapper; -import com.android.settings.applications.UserManagerWrapper; +import com.android.settings.wrapper.UserManagerWrapper; import com.android.settingslib.applications.StorageStatsSource; +import com.android.settingslib.wrapper.PackageManagerWrapper; import org.junit.Before; import org.junit.Test;