diff --git a/AndroidManifest.xml b/AndroidManifest.xml index eb3be0e37d1..1bd458a66e8 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1463,7 +1463,7 @@ android:exported="false" android:permission="android.permission.MANAGE_USERS" android:resizeableActivity="false" - android:theme="@android:style/Theme.NoDisplay"> + android:theme="@android:style/Theme.Translucent.NoTitleBar"> @@ -1598,6 +1598,11 @@ + + - - - + android:layout_height="wrap_content"> + - + + + android:layout_height="wrap_content" + android:orientation="vertical" + android:descendantFocusability="blocksDescendants"> - + - - + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 3a6371692d3..f15eeb2292e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6462,7 +6462,7 @@ Delete yourself? - Remove this user? + Delete this user? Remove this profile? @@ -6500,7 +6500,7 @@ Turn on phone calls & SMS - Remove user + Delete user Turn on phone calls? @@ -7112,7 +7112,7 @@ Default alarm sound - Also vibrate for calls + Vibrate for calls Other sounds @@ -10268,7 +10268,12 @@ Choose device + + No devices found. Make sure the device is turned on and available to connect. + + Scan again + %1$d device connected %1$d devices connected diff --git a/src/com/android/settings/applications/UsageAccessDetails.java b/src/com/android/settings/applications/UsageAccessDetails.java index 62ce08e0a77..0a01896f879 100644 --- a/src/com/android/settings/applications/UsageAccessDetails.java +++ b/src/com/android/settings/applications/UsageAccessDetails.java @@ -36,6 +36,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.applications.AppStateUsageBridge.UsageState; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenceChangeListener, OnPreferenceClickListener { @@ -113,8 +114,14 @@ public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenc void logSpecialPermissionChange(boolean newState, String packageName) { int logCategory = newState ? MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW : MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY; - FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action(getContext(), - logCategory, packageName); + final MetricsFeatureProvider metricsFeatureProvider = + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider(); + metricsFeatureProvider.action( + metricsFeatureProvider.getAttribution(getActivity()), + logCategory, + getMetricsCategory(), + packageName, + 0); } @Override diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java index 12c4d9d7f2c..6d726b9eed9 100644 --- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java @@ -51,6 +51,7 @@ import com.android.settings.Utils; import com.android.settings.applications.ApplicationFeatureProvider; import com.android.settings.applications.specialaccess.deviceadmin.DeviceAdminAdd; import com.android.settings.core.BasePreferenceController; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.overlay.FeatureFactory; import com.android.settings.widget.ActionButtonPreference; @@ -106,7 +107,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp private final UserManager mUserManager; private final PackageManager mPm; private final SettingsActivity mActivity; - private final Fragment mFragment; + private final InstrumentedPreferenceFragment mFragment; private final MetricsFeatureProvider mMetricsFeatureProvider; private final ApplicationFeatureProvider mApplicationFeatureProvider; private final int mUserId; @@ -119,7 +120,8 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp private boolean mFinishing = false; private boolean mAppsControlDisallowedBySystem; - public AppButtonsPreferenceController(SettingsActivity activity, Fragment fragment, + public AppButtonsPreferenceController(SettingsActivity activity, + InstrumentedPreferenceFragment fragment, Lifecycle lifecycle, String packageName, ApplicationsState state, int requestUninstall, int requestRemoveDeviceAdmin) { super(activity, KEY_ACTION_BUTTONS); @@ -517,8 +519,12 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp @VisibleForTesting void forceStopPackage(String pkgName) { - FeatureFactory.getFactory(mContext).getMetricsFeatureProvider().action(mContext, - MetricsProto.MetricsEvent.ACTION_APP_FORCE_STOP, pkgName); + mMetricsFeatureProvider.action( + mMetricsFeatureProvider.getAttribution(mActivity), + MetricsProto.MetricsEvent.ACTION_APP_FORCE_STOP, + mFragment.getMetricsCategory(), + pkgName, + 0); ActivityManager am = (ActivityManager) mActivity.getSystemService( Context.ACTIVITY_SERVICE); Log.d(TAG, "Stopping package " + pkgName); diff --git a/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java b/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java index 8405c618dc4..f0d1068fd58 100644 --- a/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java +++ b/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java @@ -42,6 +42,7 @@ import com.android.settings.applications.AppStateOverlayBridge; import com.android.settings.applications.AppStateOverlayBridge.OverlayState; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.applications.ApplicationsState.AppEntry; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenceChangeListener, OnPreferenceClickListener { @@ -129,8 +130,14 @@ public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenc void logSpecialPermissionChange(boolean newState, String packageName) { int logCategory = newState ? MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_ALLOW : MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_DENY; - FeatureFactory.getFactory(getContext()) - .getMetricsFeatureProvider().action(getContext(), logCategory, packageName); + final MetricsFeatureProvider metricsFeatureProvider = + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider(); + metricsFeatureProvider.action( + metricsFeatureProvider.getAttribution(getActivity()), + logCategory, + getMetricsCategory(), + packageName, + 0); } @Override diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java index 9a337a5943f..14bf1ef82d4 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java +++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java @@ -17,12 +17,12 @@ package com.android.settings.applications.defaultapps; import android.app.Dialog; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.DialogInterface; import android.content.pm.PackageManager; import android.os.Bundle; import android.text.TextUtils; -import android.util.Pair; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; @@ -69,11 +69,12 @@ public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment @Override protected void onRadioButtonConfirmed(String selectedKey) { - mMetricsFeatureProvider.action(getContext(), + mMetricsFeatureProvider.action( + mMetricsFeatureProvider.getAttribution(getActivity()), MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP, + getMetricsCategory(), selectedKey, - Pair.create(MetricsEvent.FIELD_CONTEXT, getMetricsCategory())); - + 0 /* value */); super.onRadioButtonConfirmed(selectedKey); } diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java index 7c05bab1d20..a260f678db5 100644 --- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java +++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java @@ -23,6 +23,7 @@ import android.app.Dialog; import android.app.admin.DeviceAdminInfo; import android.app.admin.DeviceAdminReceiver; import android.app.admin.DevicePolicyManager; +import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; @@ -489,7 +490,12 @@ public class DeviceAdminAdd extends Activity { void logSpecialPermissionChange(boolean allow, String packageName) { int logCategory = allow ? MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_ALLOW : MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY; - FeatureFactory.getFactory(this).getMetricsFeatureProvider().action(this, logCategory, packageName); + FeatureFactory.getFactory(this).getMetricsFeatureProvider().action( + SettingsEnums.PAGE_UNKNOWN, + logCategory, + SettingsEnums.PAGE_UNKNOWN, + packageName, + 0); } @Override diff --git a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java index 33a779fd9e7..c36c97ad34e 100644 --- a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java +++ b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java @@ -33,6 +33,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.applications.AppInfoWithHeader; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; public class PictureInPictureDetails extends AppInfoWithHeader implements OnPreferenceChangeListener { @@ -99,7 +100,7 @@ public class PictureInPictureDetails extends AppInfoWithHeader /** * @return whether the app associated with the given {@param packageName} is allowed to enter - * picture-in-picture. + * picture-in-picture. */ static boolean getEnterPipStateForPackage(Context context, int uid, String packageName) { final AppOpsManager appOps = context.getSystemService(AppOpsManager.class); @@ -108,7 +109,7 @@ public class PictureInPictureDetails extends AppInfoWithHeader /** * @return the summary for the current state of whether the app associated with the given - * {@param packageName} is allowed to enter picture-in-picture. + * {@param packageName} is allowed to enter picture-in-picture. */ public static int getPreferenceSummary(Context context, int uid, String packageName) { final boolean enabled = PictureInPictureDetails.getEnterPipStateForPackage(context, uid, @@ -122,7 +123,13 @@ public class PictureInPictureDetails extends AppInfoWithHeader int logCategory = newState ? MetricsEvent.APP_PICTURE_IN_PICTURE_ALLOW : MetricsEvent.APP_PICTURE_IN_PICTURE_DENY; - FeatureFactory.getFactory(getContext()) - .getMetricsFeatureProvider().action(getContext(), logCategory, packageName); + final MetricsFeatureProvider metricsFeatureProvider = + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider(); + metricsFeatureProvider.action( + metricsFeatureProvider.getAttribution(getActivity()), + logCategory, + getMetricsCategory(), + packageName, + 0); } } diff --git a/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java b/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java index 5c0d4b145aa..2ccf64ff5e1 100644 --- a/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java +++ b/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java @@ -44,6 +44,7 @@ import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.ApplicationsState.Callbacks; import com.android.settingslib.applications.ApplicationsState.Session; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.FooterPreference; @@ -126,8 +127,15 @@ public class PremiumSmsAccess extends EmptyTextSettings break; } if (category != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) { - FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action( - getContext(), category, packageName); + // TODO(117860032): Category is wrong. It should be defined in SettingsEnums. + final MetricsFeatureProvider metricsFeatureProvider = + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider(); + metricsFeatureProvider.action( + metricsFeatureProvider.getAttribution(getActivity()), + category, + getMetricsCategory(), + packageName, + smsState); } } @@ -214,7 +222,7 @@ public class PremiumSmsAccess extends EmptyTextSettings setIcon(mAppEntry.icon); } setEntries(R.array.security_settings_premium_sms_values); - setEntryValues(new CharSequence[] { + setEntryValues(new CharSequence[]{ String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER), String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW), String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW), diff --git a/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettings.java b/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettings.java index cad59571c58..b0c745dae6a 100644 --- a/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettings.java +++ b/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettings.java @@ -29,6 +29,7 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.utils.ManagedServiceSettings; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; @@ -73,8 +74,14 @@ public class VrListenerSettings extends ManagedServiceSettings { void logSpecialPermissionChange(boolean enable, String packageName) { int logCategory = enable ? MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_ALLOW : MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_DENY; - FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action(getContext(), - logCategory, packageName); + final MetricsFeatureProvider metricsFeatureProvider = + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider(); + metricsFeatureProvider.action( + metricsFeatureProvider.getAttribution(getActivity()), + logCategory, + getMetricsCategory(), + packageName, + 0); } public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = diff --git a/src/com/android/settings/core/instrumentation/StatsLogWriter.java b/src/com/android/settings/core/instrumentation/StatsLogWriter.java index 2617259235d..b6644c677fa 100644 --- a/src/com/android/settings/core/instrumentation/StatsLogWriter.java +++ b/src/com/android/settings/core/instrumentation/StatsLogWriter.java @@ -18,8 +18,8 @@ package com.android.settings.core.instrumentation; import android.app.settings.SettingsEnums; import android.content.Context; -import android.util.Pair; import android.util.StatsLog; +import android.util.Pair; import com.android.settingslib.core.instrumentation.LogWriter; @@ -45,7 +45,7 @@ public class StatsLogWriter implements LogWriter { 0 /* changedPreferenceIntValue */); } - @Override + @Override public void action(Context context, int action, Pair... taggedData) { action(SettingsEnums.PAGE_UNKNOWN /* attribution */, action, @@ -73,8 +73,7 @@ public class StatsLogWriter implements LogWriter { } @Override - public void action(Context context, int action, String pkg, - Pair... taggedData) { + public void action(Context context, int action, String pkg) { action(SettingsEnums.PAGE_UNKNOWN /* attribution */, action, SettingsEnums.PAGE_UNKNOWN /* pageId */, diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java index 00111770104..b755ba7861a 100644 --- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java +++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java @@ -19,12 +19,9 @@ package com.android.settings.dashboard.suggestions; import android.content.ComponentName; import android.content.Context; import android.content.SharedPreferences; -import android.service.settings.suggestions.Suggestion; import androidx.annotation.NonNull; -import com.android.settingslib.suggestions.SuggestionControllerMixinCompat; - /** Interface should be implemented if you have added new suggestions */ public interface SuggestionFeatureProvider { @@ -45,10 +42,4 @@ public interface SuggestionFeatureProvider { * Returns the {@link SharedPreferences} that holds metadata for suggestions. */ SharedPreferences getSharedPrefs(Context context); - - /** - * Dismisses a suggestion. - */ - void dismissSuggestion(Context context, SuggestionControllerMixinCompat suggestionMixin, - Suggestion suggestion); } diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java index 39d0299c0f5..bfa44e5216e 100644 --- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java @@ -20,12 +20,9 @@ import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; import android.content.SharedPreferences; -import android.service.settings.suggestions.Suggestion; -import android.util.Log; import androidx.annotation.NonNull; -import com.android.internal.logging.nano.MetricsProto; import com.android.settings.Settings.NightDisplaySuggestionActivity; import com.android.settings.biometrics.fingerprint.FingerprintEnrollSuggestionActivity; import com.android.settings.biometrics.fingerprint.FingerprintSuggestionActivity; @@ -37,10 +34,6 @@ import com.android.settings.password.ScreenLockSuggestionActivity; import com.android.settings.wallpaper.WallpaperSuggestionActivity; import com.android.settings.wifi.calling.WifiCallingSuggestionActivity; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; -import com.android.settingslib.drawer.Tile; -import com.android.settingslib.suggestions.SuggestionControllerMixinCompat; - -import java.util.List; public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider { @@ -95,16 +88,4 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider mMetricsFeatureProvider = FeatureFactory.getFactory(appContext) .getMetricsFeatureProvider(); } - - @Override - public void dismissSuggestion(Context context, SuggestionControllerMixinCompat mixin, - Suggestion suggestion) { - if (mixin == null || suggestion == null || context == null) { - return; - } - mMetricsFeatureProvider.action( - context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION, - suggestion.getId()); - mixin.dismissSuggestion(suggestion); - } } diff --git a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java index 6256e23dcde..65492d5b054 100644 --- a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java +++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java @@ -26,16 +26,15 @@ import android.os.UserHandle; import android.os.UserManager; import android.text.BidiFormatter; import android.text.TextUtils; -import android.util.Pair; import android.widget.Toast; -import androidx.fragment.app.Fragment; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.Utils; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ChooseLockSettingsHelper; @@ -57,7 +56,7 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle private static final String KEY_BUILD_NUMBER = "build_number"; private final Activity mActivity; - private final Fragment mFragment; + private final InstrumentedPreferenceFragment mFragment; private final UserManager mUm; private final MetricsFeatureProvider mMetricsFeatureProvider; @@ -67,8 +66,8 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle private int mDevHitCountdown; private boolean mProcessingLastDevHit; - public BuildNumberPreferenceController(Context context, Activity activity, Fragment fragment, - Lifecycle lifecycle) { + public BuildNumberPreferenceController(Context context, Activity activity, + InstrumentedPreferenceFragment fragment, Lifecycle lifecycle) { super(context); mActivity = activity; mFragment = fragment; @@ -145,7 +144,7 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle .setPackage(componentName.getPackageName()) .setAction("com.android.settings.action.REQUEST_DEBUG_FEATURES"); final ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity( - requestDebugFeatures, 0); + requestDebugFeatures, 0); if (resolveInfo != null) { mContext.startActivity(requestDebugFeatures); return false; @@ -176,9 +175,11 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle enableDevelopmentSettings(); } mMetricsFeatureProvider.action( - mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF, - Pair.create(MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED, - mProcessingLastDevHit ? 0 : 1)); + mMetricsFeatureProvider.getAttribution(mActivity), + MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED, + mFragment.getMetricsCategory(), + null, + mProcessingLastDevHit ? 0 : 1); } else if (mDevHitCountdown > 0 && mDevHitCountdown < (TAPS_TO_BE_A_DEVELOPER - 2)) { if (mDevHitToast != null) { @@ -191,10 +192,13 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle Toast.LENGTH_SHORT); mDevHitToast.show(); } + mMetricsFeatureProvider.action( - mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF, - Pair.create(MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED, - 0)); + mMetricsFeatureProvider.getAttribution(mActivity), + MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED, + mFragment.getMetricsCategory(), + null, + 0); } else if (mDevHitCountdown < 0) { if (mDevHitToast != null) { mDevHitToast.cancel(); @@ -203,9 +207,11 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle Toast.LENGTH_LONG); mDevHitToast.show(); mMetricsFeatureProvider.action( - mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF, - Pair.create(MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED, - 1)); + mMetricsFeatureProvider.getAttribution(mActivity), + MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED, + mFragment.getMetricsCategory(), + null, + 1); } return true; } diff --git a/src/com/android/settings/display/NightDisplayActivationPreferenceController.java b/src/com/android/settings/display/NightDisplayActivationPreferenceController.java index 6421ebdbd4e..706ac8539c8 100644 --- a/src/com/android/settings/display/NightDisplayActivationPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayActivationPreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.display; import android.content.Context; +import android.hardware.display.ColorDisplayManager; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; @@ -53,7 +54,8 @@ public class NightDisplayActivationPreferenceController extends TogglePreference @Override public int getAvailabilityStatus() { - return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; } @Override diff --git a/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java b/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java index cfe17915fd6..8ad5e630e2b 100644 --- a/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java +++ b/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java @@ -18,6 +18,8 @@ package com.android.settings.display; import android.content.Context; +import android.hardware.display.ColorDisplayManager; + import androidx.preference.DropDownPreference; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; @@ -39,7 +41,8 @@ public class NightDisplayAutoModePreferenceController extends BasePreferenceCont @Override public int getAvailabilityStatus() { - return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; } @Override diff --git a/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java b/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java index e2abe1b24c8..f7a5425f48b 100644 --- a/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java +++ b/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java @@ -20,6 +20,8 @@ import android.content.Context; import androidx.preference.Preference; +import android.hardware.display.ColorDisplayManager; + import com.android.internal.app.ColorDisplayController; import com.android.settings.core.BasePreferenceController; @@ -37,7 +39,8 @@ public class NightDisplayCustomEndTimePreferenceController extends BasePreferenc @Override public int getAvailabilityStatus() { - return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; } @Override diff --git a/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java b/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java index 255003c7011..346ddd6725a 100644 --- a/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java +++ b/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java @@ -20,6 +20,8 @@ import android.content.Context; import androidx.preference.Preference; +import android.hardware.display.ColorDisplayManager; + import com.android.internal.app.ColorDisplayController; import com.android.settings.core.BasePreferenceController; @@ -37,7 +39,8 @@ public class NightDisplayCustomStartTimePreferenceController extends BasePrefere @Override public int getAvailabilityStatus() { - return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; } @Override diff --git a/src/com/android/settings/display/NightDisplayFooterPreferenceController.java b/src/com/android/settings/display/NightDisplayFooterPreferenceController.java index bb598590bc5..e0c12c3fcc0 100644 --- a/src/com/android/settings/display/NightDisplayFooterPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayFooterPreferenceController.java @@ -20,7 +20,8 @@ import android.content.Context; import androidx.preference.Preference; -import com.android.internal.app.ColorDisplayController; +import android.hardware.display.ColorDisplayManager; + import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settingslib.widget.FooterPreference; @@ -33,7 +34,8 @@ public class NightDisplayFooterPreferenceController extends BasePreferenceContro @Override public int getAvailabilityStatus() { - return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; } @Override diff --git a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java index db053a596ff..6adaf23990d 100644 --- a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.display; import android.content.Context; +import android.hardware.display.ColorDisplayManager; import android.text.TextUtils; import androidx.preference.Preference; @@ -37,7 +38,7 @@ public class NightDisplayIntensityPreferenceController extends SliderPreferenceC @Override public int getAvailabilityStatus() { - if (!ColorDisplayController.isAvailable(mContext)) { + if (!ColorDisplayManager.isNightDisplayAvailable(mContext)) { return UNSUPPORTED_ON_DEVICE; } else if (!mController.isActivated()) { return DISABLED_DEPENDENT_SETTING; @@ -54,7 +55,7 @@ public class NightDisplayIntensityPreferenceController extends SliderPreferenceC public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); final SeekBarPreference preference = (SeekBarPreference) screen.findPreference( - getPreferenceKey()); + getPreferenceKey()); preference.setContinuousUpdates(true); preference.setMax(getMaxSteps()); } diff --git a/src/com/android/settings/display/NightDisplayPreferenceController.java b/src/com/android/settings/display/NightDisplayPreferenceController.java index 3cb57e0272b..678e4d36cfe 100644 --- a/src/com/android/settings/display/NightDisplayPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayPreferenceController.java @@ -15,6 +15,7 @@ package com.android.settings.display; import android.content.Context; +import android.hardware.display.ColorDisplayManager; import com.android.internal.app.ColorDisplayController; import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; @@ -42,7 +43,7 @@ public class NightDisplayPreferenceController extends AbstractPreferenceControll @Override public boolean isAvailable() { - return ColorDisplayController.isAvailable(mContext); + return ColorDisplayManager.isNightDisplayAvailable(mContext); } @Override diff --git a/src/com/android/settings/display/NightDisplaySettings.java b/src/com/android/settings/display/NightDisplaySettings.java index fbd5d3ef3a0..7e7741520c8 100644 --- a/src/com/android/settings/display/NightDisplaySettings.java +++ b/src/com/android/settings/display/NightDisplaySettings.java @@ -19,6 +19,7 @@ package com.android.settings.display; import android.app.Dialog; import android.app.TimePickerDialog; import android.content.Context; +import android.hardware.display.ColorDisplayManager; import android.os.Bundle; import android.provider.SearchIndexableResource; @@ -178,7 +179,7 @@ public class NightDisplaySettings extends DashboardFragment return buildPreferenceControllers(context); } - private static List buildPreferenceControllers(Context context) { + private static List buildPreferenceControllers(Context context) { final List controllers = new ArrayList<>(1); controllers.add(new NightDisplayFooterPreferenceController(context)); return controllers; @@ -198,12 +199,12 @@ public class NightDisplaySettings extends DashboardFragment @Override protected boolean isPageSearchEnabled(Context context) { - return ColorDisplayController.isAvailable(context); + return ColorDisplayManager.isNightDisplayAvailable(context); } @Override public List createPreferenceControllers( - Context context) { + Context context) { return buildPreferenceControllers(context); } }; diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java index b3be061dd7a..2534d083b4c 100644 --- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java +++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java @@ -26,6 +26,7 @@ import android.app.job.JobParameters; import android.app.job.JobScheduler; import android.app.job.JobService; import android.app.job.JobWorkItem; +import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; @@ -35,7 +36,6 @@ import android.os.StatsDimensionsValue; import android.os.UserManager; import android.provider.Settings; import android.util.Log; -import android.util.Pair; import androidx.annotation.GuardedBy; import androidx.annotation.VisibleForTesting; @@ -146,20 +146,18 @@ public class AnomalyDetectionJobService extends JobService { final int uid = extractUidFromStatsDimensionsValue(intentDimsValue); final boolean autoFeatureOn = powerUsageFeatureProvider.isSmartBatterySupported() ? Settings.Global.getInt(contentResolver, - Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, ON) == ON + Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, ON) == ON : Settings.Global.getInt(contentResolver, Settings.Global.APP_AUTO_RESTRICTION_ENABLED, ON) == ON; final String packageName = batteryUtils.getPackageName(uid); final long versionCode = batteryUtils.getAppLongVersionCode(packageName); - + final String versionedPackage = packageName + "/" + versionCode; if (batteryUtils.shouldHideAnomaly(powerWhitelistBackend, uid, anomalyInfo)) { - metricsFeatureProvider.action(context, + metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED, - packageName, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, - anomalyInfo.anomalyType), - Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, - versionCode)); + SettingsEnums.PAGE_UNKNOWN, + versionedPackage, + anomalyInfo.anomalyType); } else { if (autoFeatureOn && anomalyInfo.autoRestriction) { // Auto restrict this app @@ -173,13 +171,11 @@ public class AnomalyDetectionJobService extends JobService { AnomalyDatabaseHelper.State.NEW, timeMs); } - metricsFeatureProvider.action(context, + metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED, - packageName, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, - anomalyInfo.anomalyType), - Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, - versionCode)); + SettingsEnums.PAGE_UNKNOWN, + versionedPackage, + anomalyInfo.anomalyType); } } catch (NullPointerException | IndexOutOfBoundsException e) { diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java index ac946df571d..d52a9676c23 100644 --- a/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java +++ b/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java @@ -17,8 +17,8 @@ package com.android.settings.fuelgauge.batterytip.actions; import android.app.AppOpsManager; +import android.app.settings.SettingsEnums; import android.content.Context; -import android.util.Pair; import androidx.annotation.VisibleForTesting; @@ -64,15 +64,18 @@ public class RestrictAppAction extends BatteryTipAction { AppOpsManager.MODE_IGNORED); if (CollectionUtils.isEmpty(appInfo.anomalyTypes)) { // Only log context if there is no anomaly type - mMetricsFeatureProvider.action(mContext, - MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, packageName, - Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey)); + mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, + metricsKey, + packageName, + 0); } else { for (int type : appInfo.anomalyTypes) { - mMetricsFeatureProvider.action(mContext, - MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, packageName, - Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey), - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, type)); + mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, + metricsKey, + packageName, + type); } } } diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java index 419e0431345..db882e5bac7 100644 --- a/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java +++ b/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java @@ -17,8 +17,8 @@ package com.android.settings.fuelgauge.batterytip.actions; import android.app.AppOpsManager; +import android.app.settings.SettingsEnums; import android.content.Context; -import android.util.Pair; import androidx.annotation.VisibleForTesting; @@ -50,8 +50,11 @@ public class UnrestrictAppAction extends BatteryTipAction { // Clear force app standby, then app can run in the background mBatteryUtils.setForceAppStandby(appInfo.uid, appInfo.packageName, AppOpsManager.MODE_ALLOWED); - mMetricsFeatureProvider.action(mContext, - MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, appInfo.packageName, - Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey)); + mMetricsFeatureProvider.action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, + metricsKey, + appInfo.packageName, + 0); } } diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java index 4ff0d28cd6f..f16673484ec 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java @@ -16,11 +16,11 @@ package com.android.settings.fuelgauge.batterytip.tips; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.res.Resources; import android.icu.text.ListFormatter; import android.os.Parcel; -import android.util.Pair; import androidx.annotation.VisibleForTesting; @@ -126,12 +126,12 @@ public class RestrictAppTip extends BatteryTip { for (int i = 0, size = mRestrictAppList.size(); i < size; i++) { final AppInfo appInfo = mRestrictAppList.get(i); for (Integer anomalyType : appInfo.anomalyTypes) { - metricsFeatureProvider.action(context, + metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST, + SettingsEnums.PAGE_UNKNOWN, appInfo.packageName, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, anomalyType)); + anomalyType); } - } } } diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java index db05abb69b3..8bb8b4dd86a 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java @@ -29,6 +29,7 @@ import android.widget.BaseAdapter; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import androidx.loader.app.LoaderManager; import androidx.loader.content.Loader; @@ -109,9 +110,12 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo } } - //TODO(b/111822376): implement sorting mechanism. - private void sortCards(List cards) { + @VisibleForTesting + List sortCards(List cards) { //take mContextualCards as the source and do the ranking based on the rule. + return cards.stream() + .sorted((c1, c2) -> Double.compare(c2.getRankingScore(), c1.getRankingScore())) + .collect(Collectors.toList()); } @Override @@ -127,10 +131,9 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo allCards.addAll( updateList.values().stream().flatMap(List::stream).collect(Collectors.toList())); - sortCards(allCards); //replace with the new data mContextualCards.clear(); - mContextualCards.addAll(allCards); + mContextualCards.addAll(sortCards(allCards)); loadCardControllers(); diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java index 81219c33010..4f92534cc18 100644 --- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java +++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java @@ -16,6 +16,8 @@ package com.android.settings.homepage.contextualcards.conditional; +import androidx.annotation.VisibleForTesting; + import com.android.settings.homepage.contextualcards.ContextualCard; /** @@ -26,6 +28,9 @@ import com.android.settings.homepage.contextualcards.ContextualCard; */ public class ConditionalContextualCard extends ContextualCard { + @VisibleForTesting + static final double UNSUPPORTED_RANKING_SCORE = -100.0; + private final long mConditionId; private final int mMetricsConstant; private final CharSequence mActionText; @@ -83,6 +88,7 @@ public class ConditionalContextualCard extends ContextualCard { } public ConditionalContextualCard build() { + setRankingScore(UNSUPPORTED_RANKING_SCORE); return new ConditionalContextualCard(this); } } diff --git a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java index a4e7d2ad541..322fdc432d0 100644 --- a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java +++ b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java @@ -22,12 +22,16 @@ import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME import static android.system.OsConstants.AF_INET; import static android.system.OsConstants.AF_INET6; +import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; + import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.NetworkUtils; +import android.os.UserHandle; +import android.os.UserManager; import android.provider.Settings; import android.system.Os; import android.text.Editable; @@ -43,6 +47,7 @@ import android.widget.TextView; import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AlertDialog; +import androidx.preference.PreferenceViewHolder; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; @@ -50,6 +55,8 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.utils.AnnotationSpan; import com.android.settingslib.CustomDialogPreferenceCompat; import com.android.settingslib.HelpUtils; +import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.RestrictedLockUtilsInternal; import java.util.HashMap; import java.util.Map; @@ -99,19 +106,23 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat public PrivateDnsModeDialogPreference(Context context) { super(context); + initialize(); } public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs) { super(context, attrs); + initialize(); } public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + initialize(); } public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); + initialize(); } private final AnnotationSpan.LinkInfo mUrlLinkInfo = new AnnotationSpan.LinkInfo( @@ -129,6 +140,30 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat } }); + private void initialize() { + // Add the "Restricted" icon resource so that if the preference is disabled by the + // admin, an information button will be shown. + setWidgetLayoutResource(R.layout.restricted_icon); + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + if (isDisabledByAdmin()) { + // If the preference is disabled by the admin, set the inner item as enabled so + // it could act as a click target. The preference itself will have been disabled + // by the controller. + holder.itemView.setEnabled(true); + } + + final View restrictedIcon = holder.findViewById(R.id.restricted_icon); + if (restrictedIcon != null) { + // Show the "Restricted" icon if, and only if, the preference was disabled by + // the admin. + restrictedIcon.setVisibility(isDisabledByAdmin() ? View.VISIBLE : View.GONE); + } + } + @Override protected void onBindDialogView(View view) { final Context context = getContext(); @@ -202,6 +237,28 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat updateDialogInfo(); } + @Override + public void performClick() { + EnforcedAdmin enforcedAdmin = getEnforcedAdmin(); + + if (enforcedAdmin == null) { + // If the restriction is not restricted by admin, continue as usual. + super.performClick(); + } else { + // Show a dialog explaining to the user why they cannot change the preference. + RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(), enforcedAdmin); + } + } + + private EnforcedAdmin getEnforcedAdmin() { + return RestrictedLockUtilsInternal.checkIfRestrictionEnforced( + getContext(), UserManager.DISALLOW_CONFIG_PRIVATE_DNS, UserHandle.myUserId()); + } + + private boolean isDisabledByAdmin() { + return getEnforcedAdmin() != null; + } + private Button getSaveButton() { final AlertDialog dialog = (AlertDialog) getDialog(); if (dialog == null) { diff --git a/src/com/android/settings/network/PrivateDnsPreferenceController.java b/src/com/android/settings/network/PrivateDnsPreferenceController.java index 8b3bfa0bf72..37adea72b87 100644 --- a/src/com/android/settings/network/PrivateDnsPreferenceController.java +++ b/src/com/android/settings/network/PrivateDnsPreferenceController.java @@ -143,7 +143,6 @@ public class PrivateDnsPreferenceController extends BasePreferenceController @Override public void updateState(Preference preference) { super.updateState(preference); - //TODO(b/112982691): Add policy transparency explaining why this setting is disabled. preference.setEnabled(!isManagedByAdmin()); } diff --git a/src/com/android/settings/password/BiometricFragment.java b/src/com/android/settings/password/BiometricFragment.java index 6e1ae10d841..3a12bacfd8a 100644 --- a/src/com/android/settings/password/BiometricFragment.java +++ b/src/com/android/settings/password/BiometricFragment.java @@ -50,6 +50,9 @@ public class BiometricFragment extends InstrumentedFragment { private Executor mClientExecutor; private AuthenticationCallback mClientCallback; + // Re-settable by the application. + private int mUserId; + // Created/Initialized once and retained private final Handler mHandler = new Handler(Looper.getMainLooper()); private PromptInfo mPromptInfo; @@ -96,6 +99,10 @@ public class BiometricFragment extends InstrumentedFragment { mClientCallback = callback; } + public void setUser(int userId) { + mUserId = userId; + } + public void cancel() { if (mCancellationSignal != null) { mCancellationSignal.cancel(); @@ -126,8 +133,8 @@ public class BiometricFragment extends InstrumentedFragment { mCancellationSignal = new CancellationSignal(); // TODO: CC doesn't use crypto for now - mBiometricPrompt.authenticate(mCancellationSignal, mClientExecutor, - mAuthenticationCallback); + mBiometricPrompt.authenticateUser(mCancellationSignal, mClientExecutor, + mAuthenticationCallback, mUserId); } @Override diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java index f68c04ad298..5eb1f322c27 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java @@ -20,9 +20,9 @@ package com.android.settings.password; import android.app.Activity; import android.app.KeyguardManager; import android.app.admin.DevicePolicyManager; +import android.app.trust.TrustManager; import android.content.Context; import android.content.Intent; -import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricPrompt; import android.hardware.biometrics.BiometricPrompt.AuthenticationCallback; @@ -84,13 +84,13 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { private DevicePolicyManager mDevicePolicyManager; private LockPatternUtils mLockPatternUtils; private UserManager mUserManager; + private TrustManager mTrustManager; private ChooseLockSettingsHelper mChooseLockSettingsHelper; private Handler mHandler = new Handler(Looper.getMainLooper()); private String mTitle; private String mDetails; private int mUserId; - private int mEffectiveUserId; private int mCredentialMode; private boolean mGoingToBackground; @@ -108,10 +108,16 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { showConfirmCredentials(); } } - } public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) { + mTrustManager.setDeviceLockedForUser(mUserId, false); + + ConfirmDeviceCredentialUtils.reportSuccessfulAttempt(mLockPatternUtils, mUserManager, + mUserId); + ConfirmDeviceCredentialUtils.checkForPendingIntent( + ConfirmDeviceCredentialActivity.this); + setResult(Activity.RESULT_OK); finish(); } @@ -124,6 +130,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { mBiometricManager = getSystemService(BiometricManager.class); mDevicePolicyManager = getSystemService(DevicePolicyManager.class); mUserManager = UserManager.get(this); + mTrustManager = getSystemService(TrustManager.class); mLockPatternUtils = new LockPatternUtils(this); Intent intent = getIntent(); @@ -134,7 +141,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { boolean frp = KeyguardManager.ACTION_CONFIRM_FRP_CREDENTIAL.equals(intent.getAction()); mUserId = UserHandle.myUserId(); - mEffectiveUserId = mUserManager.getCredentialOwnerProfile(mUserId); + final int effectiveUserId = mUserManager.getCredentialOwnerProfile(mUserId); if (isInternalActivity()) { try { mUserId = Utils.getUserIdFromBundle(this, intent.getExtras()); @@ -162,21 +169,23 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { } else if (isManagedProfile && isInternalActivity() && !lockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) { mCredentialMode = CREDENTIAL_MANAGED; - if (isBiometricAllowed()) { + if (isBiometricAllowed(effectiveUserId)) { showBiometricPrompt(); launchedBiometric = true; } else { showConfirmCredentials(); + launchedCDC = true; } } else { mCredentialMode = CREDENTIAL_NORMAL; - if (isBiometricAllowed()) { + if (isBiometricAllowed(effectiveUserId)) { // Don't need to check if biometrics / pin/pattern/pass are enrolled. It will go to // onAuthenticationError and do the right thing automatically. showBiometricPrompt(); launchedBiometric = true; } else { showConfirmCredentials(); + launchedCDC = true; } } @@ -217,19 +226,20 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { // credential. Otherwise, biometric can't unlock fbe/keystore through // verifyTiedProfileChallenge. In such case, we also wanna show the user message that // biometric is disabled due to device restart. - private boolean isStrongAuthRequired() { - return !mLockPatternUtils.isBiometricAllowedForUser(mEffectiveUserId) + private boolean isStrongAuthRequired(int effectiveUserId) { + return !mLockPatternUtils.isBiometricAllowedForUser(effectiveUserId) || !mUserManager.isUserUnlocked(mUserId); } - private boolean isBiometricDisabledByAdmin() { + private boolean isBiometricDisabledByAdmin(int effectiveUserId) { final int disabledFeatures = - mDevicePolicyManager.getKeyguardDisabledFeatures(null, mEffectiveUserId); + mDevicePolicyManager.getKeyguardDisabledFeatures(null, effectiveUserId); return (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_BIOMETRICS) != 0; } - private boolean isBiometricAllowed() { - return !isStrongAuthRequired() && !isBiometricDisabledByAdmin(); + private boolean isBiometricAllowed(int effectiveUserId) { + return !isStrongAuthRequired(effectiveUserId) + && !isBiometricDisabledByAdmin(effectiveUserId); } private void showBiometricPrompt() { @@ -250,6 +260,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { newFragment = true; } mBiometricFragment.setCallbacks(mExecutor, mAuthenticationCallback); + mBiometricFragment.setUser(mUserId); if (newFragment) { getSupportFragmentManager().beginTransaction() diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java index 9b677aa4ace..2de7625b9ed 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java @@ -18,17 +18,12 @@ package com.android.settings.password; import android.annotation.Nullable; -import android.app.ActivityManager; -import android.app.ActivityOptions; import android.app.Dialog; -import android.app.IActivityManager; import android.app.KeyguardManager; import android.app.admin.DevicePolicyManager; -import android.app.trust.TrustManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.IntentSender; import android.content.pm.UserInfo; import android.graphics.Point; import android.graphics.PorterDuff; @@ -36,7 +31,6 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; -import android.os.RemoteException; import android.os.UserManager; import android.text.TextUtils; import android.view.View; @@ -199,29 +193,6 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr public void startEnterAnimation() { } - protected void checkForPendingIntent() { - int taskId = getActivity().getIntent().getIntExtra(Intent.EXTRA_TASK_ID, -1); - if (taskId != -1) { - try { - IActivityManager activityManager = ActivityManager.getService(); - final ActivityOptions options = ActivityOptions.makeBasic(); - activityManager.startActivityFromRecents(taskId, options.toBundle()); - return; - } catch (RemoteException e) { - // Do nothing. - } - } - IntentSender intentSender = getActivity().getIntent() - .getParcelableExtra(Intent.EXTRA_INTENT); - if (intentSender != null) { - try { - getActivity().startIntentSenderForResult(intentSender, -1, null, 0, 0, 0); - } catch (IntentSender.SendIntentException e) { - /* ignore */ - } - } - } - private void setWorkChallengeBackground(View baseView, int userId) { View mainContent = getActivity().findViewById(com.android.settings.R.id.main_content); if (mainContent != null) { @@ -246,15 +217,6 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr } } - protected void reportSuccessfulAttempt() { - mLockPatternUtils.reportSuccessfulPasswordAttempt(mEffectiveUserId); - if (mUserManager.isManagedProfile(mEffectiveUserId)) { - // Keyguard is responsible to disable StrongAuth for primary user. Disable StrongAuth - // for work challenge only here. - mLockPatternUtils.userPresent(mEffectiveUserId); - } - } - protected void reportFailedAttempt() { updateErrorMessage( mLockPatternUtils.getCurrentFailedPasswordAttempts(mEffectiveUserId) + 1); diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java b/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java new file mode 100644 index 00000000000..11d69246206 --- /dev/null +++ b/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2018 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.app.Activity; +import android.app.ActivityManager; +import android.app.ActivityOptions; +import android.app.IActivityManager; +import android.content.Intent; +import android.content.IntentSender; +import android.os.RemoteException; +import android.os.UserManager; + +import com.android.internal.widget.LockPatternUtils; + +/** Class containing methods shared between CDCA and CDCBA */ +public class ConfirmDeviceCredentialUtils { + + public static void checkForPendingIntent(Activity activity) { + // See Change-Id I52c203735fa9b53fd2f7df971824747eeb930f36 for context + int taskId = activity.getIntent().getIntExtra(Intent.EXTRA_TASK_ID, -1); + if (taskId != -1) { + try { + IActivityManager activityManager = ActivityManager.getService(); + final ActivityOptions options = ActivityOptions.makeBasic(); + activityManager.startActivityFromRecents(taskId, options.toBundle()); + return; + } catch (RemoteException e) { + // Do nothing. + } + } + IntentSender intentSender = activity.getIntent().getParcelableExtra(Intent.EXTRA_INTENT); + if (intentSender != null) { + try { + activity.startIntentSenderForResult(intentSender, -1, null, 0, 0, 0); + } catch (IntentSender.SendIntentException e) { + /* ignore */ + } + } + } + + public static void reportSuccessfulAttempt(LockPatternUtils utils, UserManager userManager, + int userId) { + utils.reportSuccessfulPasswordAttempt(userId); + if (userManager.isManagedProfile(userId)) { + // Keyguard is responsible to disable StrongAuth for primary user. Disable StrongAuth + // for work challenge only here. + utils.userPresent(userId); + } + } +} diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java index d380fc966ab..45b8129e31f 100644 --- a/src/com/android/settings/password/ConfirmLockPassword.java +++ b/src/com/android/settings/password/ConfirmLockPassword.java @@ -434,10 +434,11 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { mPasswordEntryInputDisabler.setInputEnabled(true); if (matched) { if (newResult) { - reportSuccessfulAttempt(); + ConfirmDeviceCredentialUtils.reportSuccessfulAttempt(mLockPatternUtils, + mUserManager, mEffectiveUserId); } startDisappearAnimation(intent); - checkForPendingIntent(); + ConfirmDeviceCredentialUtils.checkForPendingIntent(getActivity()); } else { if (timeoutMs > 0) { refreshLockScreen(); diff --git a/src/com/android/settings/password/ConfirmLockPattern.java b/src/com/android/settings/password/ConfirmLockPattern.java index 95a0aca4fdd..83141ea3d68 100644 --- a/src/com/android/settings/password/ConfirmLockPattern.java +++ b/src/com/android/settings/password/ConfirmLockPattern.java @@ -487,10 +487,11 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity { mLockPatternView.setEnabled(true); if (matched) { if (newResult) { - reportSuccessfulAttempt(); + ConfirmDeviceCredentialUtils.reportSuccessfulAttempt(mLockPatternUtils, + mUserManager, mEffectiveUserId); } startDisappearAnimation(intent); - checkForPendingIntent(); + ConfirmDeviceCredentialUtils.checkForPendingIntent(getActivity()); } else { if (timeoutMs > 0) { refreshLockScreen(); diff --git a/src/com/android/settings/slices/SliceBroadcastReceiver.java b/src/com/android/settings/slices/SliceBroadcastReceiver.java index 4b86f336332..2860e9a7544 100644 --- a/src/com/android/settings/slices/SliceBroadcastReceiver.java +++ b/src/com/android/settings/slices/SliceBroadcastReceiver.java @@ -17,24 +17,20 @@ package com.android.settings.slices; import static com.android.settings.bluetooth.BluetoothSliceBuilder.ACTION_BLUETOOTH_SLICE_CHANGED; -import static com.android.settings.flashlight.FlashlightSliceBuilder - .ACTION_FLASHLIGHT_SLICE_CHANGED; -import static com.android.settings.network.telephony.Enhanced4gLteSliceHelper - .ACTION_ENHANCED_4G_LTE_CHANGED; +import static com.android.settings.flashlight.FlashlightSliceBuilder.ACTION_FLASHLIGHT_SLICE_CHANGED; +import static com.android.settings.network.telephony.Enhanced4gLteSliceHelper.ACTION_ENHANCED_4G_LTE_CHANGED; import static com.android.settings.notification.ZenModeSliceBuilder.ACTION_ZEN_MODE_SLICE_CHANGED; +import static com.android.settings.slices.SettingsSliceProvider.ACTION_COPY; import static com.android.settings.slices.SettingsSliceProvider.ACTION_SLIDER_CHANGED; import static com.android.settings.slices.SettingsSliceProvider.ACTION_TOGGLE_CHANGED; -import static com.android.settings.slices.SettingsSliceProvider.ACTION_COPY; import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_KEY; import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_PLATFORM_DEFINED; import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_CHANGED; -import static com.android.settings.wifi.calling.WifiCallingSliceHelper - .ACTION_WIFI_CALLING_PREFERENCE_CELLULAR_PREFERRED; -import static com.android.settings.wifi.calling.WifiCallingSliceHelper - .ACTION_WIFI_CALLING_PREFERENCE_WIFI_ONLY; -import static com.android.settings.wifi.calling.WifiCallingSliceHelper - .ACTION_WIFI_CALLING_PREFERENCE_WIFI_PREFERRED; +import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_PREFERENCE_CELLULAR_PREFERRED; +import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_PREFERENCE_WIFI_ONLY; +import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_PREFERENCE_WIFI_PREFERRED; +import android.app.settings.SettingsEnums; import android.app.slice.Slice; import android.content.BroadcastReceiver; import android.content.ContentResolver; @@ -44,7 +40,6 @@ import android.net.Uri; import android.provider.SettingsSlicesContract; import android.text.TextUtils; import android.util.Log; -import android.util.Pair; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.bluetooth.BluetoothSliceBuilder; @@ -216,12 +211,11 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { * follows the pattern in SharedPreferenceLogger. */ private void logSliceValueChange(Context context, String sliceKey, int newValue) { - final Pair namePair = Pair.create( - MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceKey); - final Pair valuePair = Pair.create( - MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE, newValue); FeatureFactory.getFactory(context).getMetricsFeatureProvider() - .action(context, MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED, namePair, valuePair); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED, + SettingsEnums.PAGE_UNKNOWN, + sliceKey, newValue); } private BasePreferenceController getPreferenceController(Context context, String key) { diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java index f6cc57f4f0e..f18225ade27 100644 --- a/src/com/android/settings/slices/SliceBuilderUtils.java +++ b/src/com/android/settings/slices/SliceBuilderUtils.java @@ -22,6 +22,7 @@ import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_PLAT import android.annotation.ColorInt; import android.app.PendingIntent; +import android.app.settings.SettingsEnums; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -77,12 +78,12 @@ public class SliceBuilderUtils { public static Slice buildSlice(Context context, SliceData sliceData) { Log.d(TAG, "Creating slice for: " + sliceData.getPreferenceController()); final BasePreferenceController controller = getPreferenceController(context, sliceData); - final Pair sliceNamePair = - Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceData.getKey()); - // Log Slice requests using the same schema as SharedPreferenceLogger (but with a different - // action name). FeatureFactory.getFactory(context).getMetricsFeatureProvider() - .action(context, MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, sliceNamePair); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, + SettingsEnums.PAGE_UNKNOWN, + sliceData.getKey(), + 0); if (!controller.isAvailable()) { // Cannot guarantee setting page is accessible, let the presenter handle error case. diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java index 9aac5090e92..c58ff579110 100644 --- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java +++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java @@ -19,6 +19,8 @@ package com.android.settings.wifi; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.os.Handler; +import android.os.Message; import androidx.appcompat.app.AlertDialog; import android.os.Bundle; import android.view.LayoutInflater; @@ -37,14 +39,16 @@ import java.util.List; public class NetworkRequestDialogFragment extends InstrumentedDialogFragment implements DialogInterface.OnClickListener { + /** Message sent to us to stop scanning wifi and pop up timeout dialog. */ + private static final int MESSAGE_STOP_SCAN_WIFI_LIST = 0; + + /** Delayed time to stop scanning wifi. */ + private static final int DELAY_TIME_STOP_SCAN_MS = 30*1000; + private List mAccessPointList; - public static NetworkRequestDialogFragment newInstance(int uid, String packageName) { - Bundle args = new Bundle(); - args.putInt("uid", uid); - args.putString("packageName", packageName); + public static NetworkRequestDialogFragment newInstance() { NetworkRequestDialogFragment dialogFragment = new NetworkRequestDialogFragment(); - dialogFragment.setArguments(args); return dialogFragment; } @@ -84,6 +88,44 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp public void onClick(DialogInterface dialog, int which) { } + @Override + public void onPause() { + super.onPause(); + + mHandler.removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST); + } + + @Override + public void onResume() { + super.onResume(); + + // TODO(b/117399926): Starts to scan current WiFi. + + // Sets time-out to stop scanning. + mHandler.sendEmptyMessageDelayed(MESSAGE_STOP_SCAN_WIFI_LIST, DELAY_TIME_STOP_SCAN_MS); + } + + private Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MESSAGE_STOP_SCAN_WIFI_LIST: + removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST); + stopScanningAndPopTimeoutDialog(); + break; + default: + // Do nothing. + break; + } + } + }; + + protected void stopScanningAndPopTimeoutDialog() { + dismiss(); + NetworkRequestTimeoutDialogFragment fragment = NetworkRequestTimeoutDialogFragment.newInstance(); + fragment.show(getActivity().getSupportFragmentManager(), null); + } + @Override public int getMetricsCategory() { return MetricsProto.MetricsEvent.WIFI_SCANNING_NEEDED_DIALOG; diff --git a/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragment.java new file mode 100644 index 00000000000..08f285b0b8c --- /dev/null +++ b/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragment.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.wifi; + +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import androidx.appcompat.app.AlertDialog; +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.core.instrumentation.InstrumentedDialogFragment; + +public class NetworkRequestTimeoutDialogFragment extends InstrumentedDialogFragment implements + DialogInterface.OnClickListener { + + public static NetworkRequestTimeoutDialogFragment newInstance() { + NetworkRequestTimeoutDialogFragment fragment = new NetworkRequestTimeoutDialogFragment(); + return fragment; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()) + .setMessage(R.string.network_connection_timeout_dialog_message) + .setPositiveButton(R.string.network_connection_timeout_dialog_ok, this) + .setNegativeButton(R.string.cancel, null); + return builder.create(); + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.WIFI_SCANNING_NEEDED_DIALOG; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + startScanningDialog(); + break; + case DialogInterface.BUTTON_NEGATIVE: + default: + // Do nothing. + break; + } + } + + protected void startScanningDialog() { + NetworkRequestDialogFragment fragment = NetworkRequestDialogFragment.newInstance(); + fragment.show(getActivity().getSupportFragmentManager(), null); + } +} diff --git a/tests/robotests/src/com/android/settings/applications/UsageAccessDetailsTest.java b/tests/robotests/src/com/android/settings/applications/UsageAccessDetailsTest.java index f9cb01b9881..183468905c5 100644 --- a/tests/robotests/src/com/android/settings/applications/UsageAccessDetailsTest.java +++ b/tests/robotests/src/com/android/settings/applications/UsageAccessDetailsTest.java @@ -18,12 +18,10 @@ package com.android.settings.applications; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.nullable; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import android.content.Context; +import android.app.settings.SettingsEnums; import android.os.Bundle; import com.android.internal.logging.nano.MetricsProto; @@ -54,12 +52,20 @@ public class UsageAccessDetailsTest { @Test public void logSpecialPermissionChange() { mFragment.logSpecialPermissionChange(true, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW, + mFragment.getMetricsCategory(), + "app", + 0); mFragment.logSpecialPermissionChange(false, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY, + mFragment.getMetricsCategory(), + "app", + 0); } @Test diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java index 44ace780c82..f7b27003aa8 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java @@ -35,6 +35,7 @@ import static org.mockito.Mockito.when; import android.app.ActivityManager; import android.app.Application; import android.app.admin.DevicePolicyManager; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -42,10 +43,9 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.UserManager; -import androidx.fragment.app.Fragment; - import com.android.settings.R; import com.android.settings.SettingsActivity; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.widget.ActionButtonPreference; @@ -377,12 +377,17 @@ public class AppButtonsPreferenceControllerTest { * The test fragment which implements * {@link ButtonActionDialogFragment.AppButtonsDialogListener} */ - public static class TestFragment extends Fragment + public static class TestFragment extends InstrumentedPreferenceFragment implements ButtonActionDialogFragment.AppButtonsDialogListener { @Override public void handleDialogClick(int type) { // Do nothing } + + @Override + public int getMetricsCategory() { + return SettingsEnums.PAGE_UNKNOWN; + } } } diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java index 1b25286cef8..4093cba68de 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java @@ -19,12 +19,10 @@ package com.android.settings.applications.appinfo; import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import static org.junit.Assert.assertEquals; -import static org.mockito.Matchers.eq; -import static org.mockito.Matchers.nullable; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.content.Context; +import android.app.settings.SettingsEnums; import android.view.Window; import android.view.WindowManager.LayoutParams; @@ -75,12 +73,14 @@ public class DrawOverlayDetailsTest { when(mFragment.getContext()).thenReturn(RuntimeEnvironment.application); mFragment.logSpecialPermissionChange(true, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_ALLOW), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_ALLOW, + mFragment.getMetricsCategory(), "app", 0); mFragment.logSpecialPermissionChange(false, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_DENY), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_DENY, + mFragment.getMetricsCategory(), "app", 0); } @Test diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java index 541954b7822..de602badec1 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java @@ -17,15 +17,14 @@ package com.android.settings.applications.defaultapps; import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.settings.SettingsEnums; import android.content.Context; import android.os.UserManager; -import android.util.Pair; import androidx.fragment.app.FragmentActivity; import androidx.preference.PreferenceScreen; @@ -89,10 +88,12 @@ public class DefaultAppPickerFragmentTest { mFragment.onAttach((Context) mActivity); mFragment.onRadioButtonConfirmed("test_pkg"); - verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class), - eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP), - eq("test_pkg"), - any(Pair.class)); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP, + mFragment.getMetricsCategory(), + "test_pkg", + 0); } public static class TestFragment extends DefaultAppPickerFragment { diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java index 6bc143ca25b..eaccdc0ac4b 100644 --- a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java +++ b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java @@ -16,10 +16,8 @@ package com.android.settings.applications.specialaccess.deviceadmin; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; @@ -29,7 +27,7 @@ import static org.mockito.Mockito.when; import android.app.AppOpsManager; import android.app.admin.DeviceAdminInfo; -import android.content.Context; +import android.app.settings.SettingsEnums; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.fuelgauge.BatteryUtils; @@ -73,12 +71,20 @@ public class DeviceAdminAddTest { @Test public void logSpecialPermissionChange() { mDeviceAdminAdd.logSpecialPermissionChange(true, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_ALLOW), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_ALLOW, + SettingsEnums.PAGE_UNKNOWN, + "app", + 0); mDeviceAdminAdd.logSpecialPermissionChange(false, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY, + SettingsEnums.PAGE_UNKNOWN, + "app", + 0); } @Test diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetailsTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetailsTest.java index 9d53f956103..b3d695849f4 100644 --- a/tests/robotests/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetailsTest.java +++ b/tests/robotests/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetailsTest.java @@ -18,11 +18,9 @@ package com.android.settings.applications.specialaccess.pictureinpicture; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.nullable; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; -import android.content.Context; +import android.app.settings.SettingsEnums; import android.content.pm.ActivityInfo; import com.android.internal.logging.nano.MetricsProto; @@ -75,12 +73,20 @@ public class PictureInPictureDetailsTest { @Test public void logSpecialPermissionChange() { mFragment.logSpecialPermissionChange(true, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_ALLOW), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_ALLOW, + mFragment.getMetricsCategory(), + "app", + 0); mFragment.logSpecialPermissionChange(false, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_DENY), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_DENY, + mFragment.getMetricsCategory(), + "app", + 0); } private boolean checkPackageHasPictureInPictureActivities(String packageName, diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccessTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccessTest.java index 3978825474e..1f32b18da0e 100644 --- a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccessTest.java +++ b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccessTest.java @@ -16,11 +16,9 @@ package com.android.settings.applications.specialaccess.premiumsms; -import static org.mockito.ArgumentMatchers.nullable; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; -import android.content.Context; +import android.app.settings.SettingsEnums; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.telephony.SmsUsageMonitor; @@ -51,18 +49,29 @@ public class PremiumSmsAccessTest { public void logSpecialPermissionChange() { mFragment.logSpecialPermissionChange(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ASK), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ASK, + mFragment.getMetricsCategory(), + "app", + SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER); mFragment.logSpecialPermissionChange(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_DENY), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_DENY, + mFragment.getMetricsCategory(), + "app", + SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW); mFragment.logSpecialPermissionChange(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ALWAYS_ALLOW), - eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ALWAYS_ALLOW, + mFragment.getMetricsCategory(), + "app", + SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW); } } diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettingsTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettingsTest.java index 4f5b2bbed1d..3f0bc1d3895 100644 --- a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettingsTest.java +++ b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettingsTest.java @@ -16,11 +16,7 @@ package com.android.settings.applications.specialaccess.vrlistener; -import static org.mockito.ArgumentMatchers.nullable; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.verify; - -import android.content.Context; +import android.app.settings.SettingsEnums; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.testutils.FakeFeatureFactory; @@ -47,11 +43,19 @@ public class VrListenerSettingsTest { @Test public void logSpecialPermissionChange() { mFragment.logSpecialPermissionChange(true, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_ALLOW), eq("app")); + mFeatureFactory.metricsFeatureProvider.action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_ALLOW, + SettingsEnums.PAGE_UNKNOWN, + "app", + 0); mFragment.logSpecialPermissionChange(false, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_DENY), eq("app")); + mFeatureFactory.metricsFeatureProvider.action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_DENY, + SettingsEnums.PAGE_UNKNOWN, + "app", + 0); } } 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 f9a737942a2..3c97f489360 100644 --- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java @@ -18,10 +18,6 @@ package com.android.settings.dashboard.suggestions; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.app.ActivityManager; @@ -31,13 +27,10 @@ import android.content.pm.PackageManager; import android.hardware.fingerprint.FingerprintManager; import android.service.settings.suggestions.Suggestion; -import com.android.internal.logging.nano.MetricsProto; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.ShadowSecureSettings; -import com.android.settingslib.drawer.CategoryKey; -import com.android.settingslib.drawer.Tile; import com.android.settingslib.suggestions.SuggestionControllerMixinCompat; import org.junit.After; @@ -49,9 +42,6 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; -import java.util.ArrayList; -import java.util.List; - @RunWith(SettingsRobolectricTestRunner.class) @Config(shadows = ShadowSecureSettings.class) public class SuggestionFeatureProviderImplTest { @@ -111,36 +101,8 @@ public class SuggestionFeatureProviderImplTest { } @Test - public void isSuggestionV2Enabled_isNotLowMemoryDevice_shouldReturnTrue() { + public void isSuggestionEnabled_isNotLowMemoryDevice_shouldReturnTrue() { when(mActivityManager.isLowRamDevice()).thenReturn(false); assertThat(mProvider.isSuggestionEnabled(mContext)).isTrue(); } - - @Test - public void dismissSuggestion_noControllerOrSuggestion_noop() { - mProvider.dismissSuggestion(mContext, null, null); - mProvider.dismissSuggestion(mContext, mSuggestionControllerMixin, null); - mProvider.dismissSuggestion(mContext, null, new Suggestion.Builder("id").build()); - - verifyZeroInteractions(mFactory.metricsFeatureProvider); - verifyZeroInteractions(mSuggestionControllerMixin); - } - - @Test - public void dismissSuggestion_noContext_shouldDoNothing() { - mProvider.dismissSuggestion(null, mSuggestionControllerMixin, mSuggestion); - - verifyZeroInteractions(mFactory.metricsFeatureProvider); - } - - @Test - public void dismissSuggestion_shouldLogAndDismiss() { - mProvider.dismissSuggestion(mContext, mSuggestionControllerMixin, mSuggestion); - - verify(mFactory.metricsFeatureProvider).action( - eq(mContext), - eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION), - anyString()); - verify(mSuggestionControllerMixin).dismissSuggestion(mSuggestion); - } } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java index c88237d7b7c..9bec78d2bcd 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java @@ -33,12 +33,12 @@ import android.os.UserManager; import android.provider.Settings; import android.text.BidiFormatter; -import androidx.fragment.app.Fragment; import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowUtils; @@ -64,7 +64,7 @@ public class BuildNumberPreferenceControllerTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Activity mActivity; @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private Fragment mFragment; + private InstrumentedPreferenceFragment mFragment; @Mock(answer = RETURNS_DEEP_STUBS) private PreferenceScreen mScreen; diff --git a/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java index 9c4c539c2d9..3822f73cbfa 100644 --- a/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java @@ -3,17 +3,14 @@ package com.android.settings.display; import static com.google.common.truth.Truth.assertThat; import android.app.Application; -import android.content.ComponentName; import android.provider.Settings.Secure; import com.android.internal.app.ColorDisplayController; import com.android.settings.R; -import com.android.settings.Settings.NightDisplaySuggestionActivity; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.SettingsShadowResources; import org.junit.After; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; @@ -25,16 +22,8 @@ import org.robolectric.annotation.Config; }) public class NightDisplayPreferenceControllerTest { - private NightDisplayPreferenceController mPreferenceController; - - @Before - public void setUp() { - mPreferenceController = new NightDisplayPreferenceController(RuntimeEnvironment.application); - } - @After public void tearDown() { - mPreferenceController = null; SettingsShadowResources.reset(); } @@ -43,9 +32,7 @@ public class NightDisplayPreferenceControllerTest { final Application context = RuntimeEnvironment.application; Secure.putInt(context.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_DISABLED); - final ComponentName componentName = - new ComponentName(context, NightDisplaySuggestionActivity.class); - assertThat(mPreferenceController.isSuggestionComplete(context)).isFalse(); + assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isFalse(); } @Test @@ -53,9 +40,7 @@ public class NightDisplayPreferenceControllerTest { final Application context = RuntimeEnvironment.application; Secure.putInt(context.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_CUSTOM); - final ComponentName componentName = - new ComponentName(context, NightDisplaySuggestionActivity.class); - assertThat(mPreferenceController.isSuggestionComplete(context)).isTrue(); + assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue(); } @Test @@ -63,9 +48,7 @@ public class NightDisplayPreferenceControllerTest { final Application context = RuntimeEnvironment.application; Secure.putInt(context.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_TWILIGHT); - final ComponentName componentName = - new ComponentName(context, NightDisplaySuggestionActivity.class); - assertThat(mPreferenceController.isSuggestionComplete(context)).isTrue(); + assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue(); } @Test @@ -74,9 +57,6 @@ public class NightDisplayPreferenceControllerTest { Secure.putInt(context.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_DISABLED); SettingsShadowResources.overrideResource(R.bool.config_night_light_suggestion_enabled, false); - - final ComponentName componentName = - new ComponentName(context, NightDisplaySuggestionActivity.class); - assertThat(mPreferenceController.isSuggestionComplete(context)).isTrue(); + assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue(); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java index 8622e658c10..11b22ddc3e6 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java @@ -43,13 +43,13 @@ import android.app.job.JobInfo; import android.app.job.JobParameters; import android.app.job.JobScheduler; import android.app.job.JobWorkItem; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Process; import android.os.StatsDimensionsValue; import android.os.UserManager; -import android.util.Pair; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; @@ -174,11 +174,11 @@ public class AnomalyDetectionJobServiceTest { verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(), anyInt(), anyLong()); - verify(mFeatureFactory.metricsFeatureProvider).action(mContext, + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED, - SYSTEM_PACKAGE, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE), - Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, VERSION_CODE)); + SettingsEnums.PAGE_UNKNOWN, + SYSTEM_PACKAGE + "/" + VERSION_CODE, + ANOMALY_TYPE); } @Test @@ -229,11 +229,11 @@ public class AnomalyDetectionJobServiceTest { verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6), eq(AnomalyDatabaseHelper.State.AUTO_HANDLED), anyLong()); - verify(mFeatureFactory.metricsFeatureProvider).action(mContext, + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED, - SYSTEM_PACKAGE, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE), - Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, VERSION_CODE)); + SettingsEnums.PAGE_UNKNOWN, + SYSTEM_PACKAGE + "/" + VERSION_CODE, + ANOMALY_TYPE); } @Test @@ -254,11 +254,11 @@ public class AnomalyDetectionJobServiceTest { verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6), eq(AnomalyDatabaseHelper.State.NEW), anyLong()); - verify(mFeatureFactory.metricsFeatureProvider).action(mContext, + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED, - SYSTEM_PACKAGE, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE), - Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, VERSION_CODE)); + SettingsEnums.PAGE_UNKNOWN, + SYSTEM_PACKAGE + "/" + VERSION_CODE, + ANOMALY_TYPE); } @Test diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java index 0d6f9c55ba6..86c6714ef83 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java @@ -18,7 +18,7 @@ package com.android.settings.fuelgauge.batterytip.actions; import static org.mockito.Mockito.verify; import android.app.AppOpsManager; -import android.util.Pair; +import android.app.settings.SettingsEnums; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.fuelgauge.BatteryUtils; @@ -91,16 +91,13 @@ public class RestrictAppActionTest { .setForceAppStandby(UID_1, PACKAGE_NAME_1, AppOpsManager.MODE_IGNORED); verify(mBatteryUtils) .setForceAppStandby(UID_2, PACKAGE_NAME_2, AppOpsManager.MODE_IGNORED); - verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application, - MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_1, Pair.create( - MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY)); - verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application, - MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_2, - Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY), - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKEUP)); - verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application, - MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_2, - Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY), - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_BT)); + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_1, 0); + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_2, + ANOMALY_WAKEUP); + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_2, + ANOMALY_BT); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java index c44ae786bf3..f57284a05e9 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java @@ -18,7 +18,7 @@ package com.android.settings.fuelgauge.batterytip.actions; import static org.mockito.Mockito.verify; import android.app.AppOpsManager; -import android.util.Pair; +import android.app.settings.SettingsEnums; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.fuelgauge.BatteryUtils; @@ -75,8 +75,11 @@ public class UnrestrictAppActionTest { verify(mBatteryUtils) .setForceAppStandby(UID_1, PACKAGE_NAME_1, AppOpsManager.MODE_ALLOWED); - verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application, - MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, PACKAGE_NAME_1, Pair.create( - MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY)); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, + METRICS_KEY, + PACKAGE_NAME_1, + 0); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java index 317e4266431..d4a10bce476 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java @@ -17,7 +17,6 @@ package com.android.settings.fuelgauge.batterytip.tips; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doReturn; @@ -26,11 +25,11 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Parcel; -import android.util.Pair; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; @@ -99,7 +98,8 @@ public class RestrictAppTipTest { mUsageAppList.add(mAppInfo); mNewBatteryTip = new RestrictAppTip(BatteryTip.StateType.NEW, mUsageAppList); mHandledBatteryTip = new RestrictAppTip(BatteryTip.StateType.HANDLED, mUsageAppList); - mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>()); + mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE, + new ArrayList<>()); } @After @@ -142,7 +142,7 @@ public class RestrictAppTipTest { @Test public void getSummary_stateNew_showRestrictSummary() { assertThat(mNewBatteryTip.getSummary(mContext)) - .isEqualTo("app has high background battery usage"); + .isEqualTo("app has high background battery usage"); } @Test @@ -226,14 +226,16 @@ public class RestrictAppTipTest { verify(mMetricsFeatureProvider).action(mContext, MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.NEW); - verify(mMetricsFeatureProvider).action(mContext, + verify(mMetricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST, + SettingsEnums.PAGE_UNKNOWN, PACKAGE_NAME, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKEUP)); - verify(mMetricsFeatureProvider).action(mContext, + ANOMALY_WAKEUP); + verify(mMetricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST, + SettingsEnums.PAGE_UNKNOWN, PACKAGE_NAME, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKELOCK)); + ANOMALY_WAKELOCK); } @Test @@ -242,7 +244,8 @@ public class RestrictAppTipTest { verify(mMetricsFeatureProvider).action(mContext, MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.HANDLED); - verify(mMetricsFeatureProvider, never()).action(any(), anyInt(), anyString(), any()); + verify(mMetricsFeatureProvider, never()).action( + anyInt(), anyInt(), anyInt(), anyString(), anyInt()); } } diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java index 598e23f6f7c..f9eda497cb2 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java @@ -38,7 +38,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadows.ShadowContentResolver; -import org.robolectric.shadows.ShadowLog; import java.util.ArrayList; import java.util.Arrays; diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java new file mode 100644 index 00000000000..091a51b1d4c --- /dev/null +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2018 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.homepage.contextualcards; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.net.Uri; + +import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RuntimeEnvironment; + +import java.util.ArrayList; +import java.util.List; + +@RunWith(SettingsRobolectricTestRunner.class) +public class ContextualCardManagerTest { + + private Context mContext; + private ContextualCardManager mManager; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + final ContextualCardsFragment fragment = new ContextualCardsFragment(); + mManager = new ContextualCardManager(mContext, fragment.getSettingsLifecycle()); + } + + @Test + public void sortCards_hasConditionalAndSliceCards_conditionalShouldAlwaysBeTheLast() { + final String sliceUri = "content://com.android.settings.slices/action/flashlight"; + final List cards = new ArrayList<>(); + cards.add(new ConditionalContextualCard.Builder().build()); + cards.add(buildContextualCard(sliceUri)); + + final List sortedCards = mManager.sortCards(cards); + + assertThat(sortedCards.get(cards.size() - 1).getCardType()) + .isEqualTo(ContextualCard.CardType.CONDITIONAL); + } + + private ContextualCard buildContextualCard(String sliceUri) { + return new ContextualCard.Builder() + .setName("test_name") + .setSliceUri(Uri.parse(sliceUri)) + .build(); + } +} diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ConditionalContextualCardTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java similarity index 74% rename from tests/robotests/src/com/android/settings/homepage/contextualcards/ConditionalContextualCardTest.java rename to tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java index 74e88d7eebf..1c74ef32bcc 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ConditionalContextualCardTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java @@ -14,10 +14,14 @@ * limitations under the License. */ -package com.android.settings.homepage.contextualcards; +package com.android.settings.homepage.contextualcards.conditional; + +import static com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard + .UNSUPPORTED_RANKING_SCORE; import static com.google.common.truth.Truth.assertThat; +import com.android.settings.homepage.contextualcards.ContextualCard; import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -39,4 +43,10 @@ public class ConditionalContextualCardTest { assertThat(new ConditionalContextualCard.Builder().build().getCardType()) .isEqualTo(ContextualCard.CardType.CONDITIONAL); } + + @Test + public void getRankingScore_shouldAlwaysBeUnsupportedScore() { + assertThat(new ConditionalContextualCard.Builder().build().getRankingScore()) + .isEqualTo(UNSUPPORTED_RANKING_SCORE); + } } diff --git a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java index 4e09632c9b2..bd59179b2b6 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java @@ -28,6 +28,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.settings.SettingsEnums; import android.app.slice.Slice; import android.content.ContentResolver; import android.content.ContentValues; @@ -37,7 +38,6 @@ import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.provider.Settings; import android.provider.SettingsSlicesContract; -import android.util.Pair; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.core.BasePreferenceController; @@ -54,7 +54,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; import org.robolectric.RuntimeEnvironment; @RunWith(SettingsRobolectricTestRunner.class) @@ -72,8 +71,6 @@ public class SliceBroadcastReceiverTest { private SliceBroadcastReceiver mReceiver; private SearchFeatureProvider mSearchFeatureProvider; private FakeFeatureFactory mFakeFeatureFactory; - private ArgumentCaptor> mLoggingNameArgumentCatpor; - private ArgumentCaptor> mLoggingValueArgumentCatpor; @Before public void setUp() { @@ -88,8 +85,6 @@ public class SliceBroadcastReceiverTest { CustomSliceManager manager = new CustomSliceManager(mContext); when(mFakeFeatureFactory.slicesFeatureProvider.getCustomSliceManager(any())) .thenReturn(manager); - mLoggingNameArgumentCatpor = ArgumentCaptor.forClass(Pair.class); - mLoggingValueArgumentCatpor = ArgumentCaptor.forClass(Pair.class); } @After @@ -123,20 +118,12 @@ public class SliceBroadcastReceiverTest { assertThat(fakeToggleController.isChecked()).isFalse(); verify(mFakeFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), - eq(MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED), - mLoggingNameArgumentCatpor.capture(), - mLoggingValueArgumentCatpor.capture()); - - final Pair namePair = mLoggingNameArgumentCatpor.getValue(); - final Pair valuePair = mLoggingValueArgumentCatpor.getValue(); - assertThat(namePair.first).isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(namePair.second).isEqualTo(fakeToggleController.getPreferenceKey()); - + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED, + SettingsEnums.PAGE_UNKNOWN, + fakeToggleController.getPreferenceKey(), + 0); verify(resolver).notifyChange(uri, null); - assertThat(valuePair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE); - assertThat(valuePair.second).isEqualTo(0); } @Test @@ -229,20 +216,13 @@ public class SliceBroadcastReceiverTest { assertThat(fakeSliderController.getSliderPosition()).isEqualTo(position); verify(mFakeFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), - eq(MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED), - mLoggingNameArgumentCatpor.capture(), - mLoggingValueArgumentCatpor.capture()); - - final Pair namePair = mLoggingNameArgumentCatpor.getValue(); - final Pair valuePair = mLoggingValueArgumentCatpor.getValue(); - assertThat(namePair.first).isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(namePair.second).isEqualTo(key); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED, + SettingsEnums.PAGE_UNKNOWN, + key, + position); verify(resolver).notifyChange(uri, null); - assertThat(valuePair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE); - assertThat(valuePair.second).isEqualTo(position); } @Test(expected = IllegalArgumentException.class) diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java index 43712788312..2e2104be7c0 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java @@ -18,11 +18,11 @@ package com.android.settings.slices; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import android.app.settings.SettingsEnums; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -52,7 +52,6 @@ import com.android.settings.testutils.SliceTester; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; import org.robolectric.RuntimeEnvironment; @RunWith(SettingsRobolectricTestRunner.class) @@ -77,14 +76,11 @@ public class SliceBuilderUtilsTest { private Context mContext; private FakeFeatureFactory mFeatureFactory; - private ArgumentCaptor> mLoggingArgumentCatpor; @Before public void setUp() { mContext = RuntimeEnvironment.application; mFeatureFactory = FakeFeatureFactory.setupForTest(); - mLoggingArgumentCatpor = ArgumentCaptor.forClass(Pair.class); - // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); } @@ -103,14 +99,11 @@ public class SliceBuilderUtilsTest { final Slice slice = SliceBuilderUtils.buildSlice(mContext, dummyData); verify(mFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED), - mLoggingArgumentCatpor.capture()); - final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue(); - - assertThat(capturedLoggingPair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(capturedLoggingPair.second) - .isEqualTo(dummyData.getKey()); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, + SettingsEnums.PAGE_UNKNOWN, + dummyData.getKey(), + 0); SliceTester.testSettingsToggleSlice(mContext, slice, dummyData); } @@ -120,14 +113,11 @@ public class SliceBuilderUtilsTest { final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); verify(mFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED), - mLoggingArgumentCatpor.capture()); - final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue(); - - assertThat(capturedLoggingPair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(capturedLoggingPair.second) - .isEqualTo(data.getKey()); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, + SettingsEnums.PAGE_UNKNOWN, + data.getKey(), + 0); SliceTester.testSettingsSliderSlice(mContext, slice, data); } @@ -137,14 +127,11 @@ public class SliceBuilderUtilsTest { final Slice slice = SliceBuilderUtils.buildSlice(mContext, dummyData); verify(mFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED), - mLoggingArgumentCatpor.capture()); - final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue(); - - assertThat(capturedLoggingPair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(capturedLoggingPair.second) - .isEqualTo(dummyData.getKey()); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, + SettingsEnums.PAGE_UNKNOWN, + dummyData.getKey(), + 0); SliceTester.testSettingsCopyableSlice(mContext, slice, dummyData); } @@ -390,14 +377,12 @@ public class SliceBuilderUtilsTest { final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); verify(mFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED), - mLoggingArgumentCatpor.capture()); - final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue(); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, + SettingsEnums.PAGE_UNKNOWN, + data.getKey(), + 0); - assertThat(capturedLoggingPair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(capturedLoggingPair.second) - .isEqualTo(data.getKey()); SliceTester.testSettingsUnavailableSlice(mContext, slice, data); } @@ -412,16 +397,11 @@ public class SliceBuilderUtilsTest { final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); verify(mFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED), - mLoggingArgumentCatpor.capture()); - - final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue(); - - assertThat(capturedLoggingPair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(capturedLoggingPair.second) - .isEqualTo(data.getKey()); - assertThat(slice).isNull(); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, + SettingsEnums.PAGE_UNKNOWN, + data.getKey(), + 0); } @Test diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java index f987f404021..17718a692c7 100644 --- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java @@ -18,8 +18,6 @@ package com.android.settings.wifi; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; - import android.content.DialogInterface; import android.widget.Button; import androidx.appcompat.app.AlertDialog; @@ -33,6 +31,7 @@ import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.annotation.Config; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; +import org.robolectric.shadows.ShadowLooper; @RunWith(SettingsRobolectricTestRunner.class) @Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class}) @@ -44,7 +43,7 @@ public class NetworkRequestDialogFragmentTest { @Before public void setUp() { mActivity = Robolectric.setupActivity(FragmentActivity.class); - networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance(-1, null)); + networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance()); } @Test @@ -67,4 +66,26 @@ public class NetworkRequestDialogFragmentTest { positiveButton.performClick(); assertThat(alertDialog.isShowing()).isFalse(); } + + @Test + public void onResumeAndWaitTimeout_shouldCallTimeoutDialog() { + FakeNetworkRequestDialogFragment fakeFragment = new FakeNetworkRequestDialogFragment(); + FakeNetworkRequestDialogFragment spyFakeFragment = spy(fakeFragment); + spyFakeFragment.show(mActivity.getSupportFragmentManager(), null); + + assertThat(fakeFragment.bCalledStopAndPop).isFalse(); + + ShadowLooper.getShadowMainLooper().runToEndOfTasks(); + + assertThat(fakeFragment.bCalledStopAndPop).isTrue(); + } + + class FakeNetworkRequestDialogFragment extends NetworkRequestDialogFragment { + boolean bCalledStopAndPop = false; + + @Override + public void stopScanningAndPopTimeoutDialog() { + bCalledStopAndPop = true; + } + } } diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragmentTest.java new file mode 100644 index 00000000000..ed28e60c0a1 --- /dev/null +++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragmentTest.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.wifi; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.internal.verification.VerificationModeFactory.times; + +import android.content.DialogInterface; +import android.widget.Button; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.FragmentActivity; +import com.android.settings.R; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Robolectric; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class}) +public class NetworkRequestTimeoutDialogFragmentTest { + + private FragmentActivity mActivity; + private NetworkRequestTimeoutDialogFragment mFragment; + + @Before + public void setUp() { + mActivity = Robolectric.setupActivity(FragmentActivity.class); + mFragment = spy(NetworkRequestTimeoutDialogFragment.newInstance()); + mFragment.show(mActivity.getSupportFragmentManager(), null); + } + + @Test + public void display_shouldShowTheDialog() { + AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + + assertThat(alertDialog).isNotNull(); + assertThat(alertDialog.isShowing()).isTrue(); + + ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog); + assertThat(RuntimeEnvironment.application + .getString(R.string.network_connection_timeout_dialog_message)) + .isEqualTo(shadowAlertDialog.getMessage()); + } + + @Test + public void clickPositiveButton_shouldCallStartScanningDialog() { + AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(alertDialog.isShowing()).isTrue(); + + Button positiveButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); + assertThat(positiveButton).isNotNull(); + + positiveButton.performClick(); + verify(mFragment, times(1)).startScanningDialog(); + } + + @Test + public void clickNegativeButton_shouldCloseTheDialog() { + AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(alertDialog.isShowing()).isTrue(); + + Button negativeButton = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE); + assertThat(negativeButton).isNotNull(); + + negativeButton.performClick(); + assertThat(alertDialog.isShowing()).isFalse(); + } +}