diff --git a/res/layout/ownerinfo.xml b/res/layout/ownerinfo.xml index 29e08402158..18ac461ee24 100644 --- a/res/layout/ownerinfo.xml +++ b/res/layout/ownerinfo.xml @@ -28,8 +28,9 @@ android:minHeight="@dimen/min_tap_target_size" android:gravity="top" android:hint="@string/owner_info_settings_edit_text_hint" - android:inputType="textMultiLine|textCapSentences" - /> + android:inputType="textMultiLine|textCapSentences"> + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 22ec007b53a..41b3a806e2c 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2112,8 +2112,6 @@ All passwords for this network will be deleted - - Saved networks 1 network @@ -5945,8 +5943,8 @@ Data usage - - App data usage + + Mobile data & Wi\u2011Fi Carrier data accounting may differ from your device. diff --git a/res/values/themes.xml b/res/values/themes.xml index b3de0ae5a9b..3bf36ba9323 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -17,7 +17,7 @@ - diff --git a/res/xml/app_info_settings.xml b/res/xml/app_info_settings.xml index 9d77e865692..684d0325417 100644 --- a/res/xml/app_info_settings.xml +++ b/res/xml/app_info_settings.xml @@ -63,7 +63,7 @@ diff --git a/res/xml/auto_brightness_detail.xml b/res/xml/auto_brightness_detail.xml index 8b683f1bb16..b10f1ad04b0 100644 --- a/res/xml/auto_brightness_detail.xml +++ b/res/xml/auto_brightness_detail.xml @@ -23,8 +23,10 @@ + settings:preview="@drawable/aab_brightness" + settings:controller="com.android.settings.widget.VideoPreferenceController"/> + settings:preview="@drawable/auto_awesome_battery" + settings:controller="com.android.settings.widget.VideoPreferenceController"/> - + + + diff --git a/src/com/android/settings/AllowBindAppWidgetActivity.java b/src/com/android/settings/AllowBindAppWidgetActivity.java index 52e7870e2b0..7557d975b14 100644 --- a/src/com/android/settings/AllowBindAppWidgetActivity.java +++ b/src/com/android/settings/AllowBindAppWidgetActivity.java @@ -16,7 +16,6 @@ package com.android.settings; -import android.app.AlertDialog; import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Context; @@ -33,6 +32,8 @@ import android.widget.CheckBox; import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertController; +import androidx.appcompat.app.AlertDialog; + /** * This activity is displayed when an app launches the BIND_APPWIDGET intent. This allows apps * that don't have the BIND_APPWIDGET permission to bind specific widgets. diff --git a/src/com/android/settings/BandMode.java b/src/com/android/settings/BandMode.java index b1302952429..9728a5f8ebb 100644 --- a/src/com/android/settings/BandMode.java +++ b/src/com/android/settings/BandMode.java @@ -1,7 +1,6 @@ package com.android.settings; import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; import android.os.AsyncResult; import android.os.Bundle; @@ -18,6 +17,7 @@ import android.widget.ListView; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneFactory; +import androidx.appcompat.app.AlertDialog; /** * Radio Band Mode Selection Class diff --git a/src/com/android/settings/CredentialStorage.java b/src/com/android/settings/CredentialStorage.java index 7b39e4f7bf0..03a9203040f 100644 --- a/src/com/android/settings/CredentialStorage.java +++ b/src/com/android/settings/CredentialStorage.java @@ -17,7 +17,6 @@ package com.android.settings; import android.app.Activity; -import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.DialogInterface; @@ -49,6 +48,7 @@ import com.android.settings.vpn2.VpnUtils; import java.io.ByteArrayInputStream; import java.io.IOException; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; import sun.security.util.ObjectIdentifier; import sun.security.x509.AlgorithmId; diff --git a/src/com/android/settings/EncryptionInterstitial.java b/src/com/android/settings/EncryptionInterstitial.java index 9558d75bc2d..f710852b3dd 100644 --- a/src/com/android/settings/EncryptionInterstitial.java +++ b/src/com/android/settings/EncryptionInterstitial.java @@ -18,7 +18,6 @@ package com.android.settings; import android.accessibilityservice.AccessibilityServiceInfo; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.content.Context; @@ -42,6 +41,8 @@ import com.android.setupwizardlib.GlifLayout; import java.util.List; +import androidx.appcompat.app.AlertDialog; + public class EncryptionInterstitial extends SettingsActivity { private static final String TAG = EncryptionInterstitial.class.getSimpleName(); diff --git a/src/com/android/settings/MonitoringCertInfoActivity.java b/src/com/android/settings/MonitoringCertInfoActivity.java index aea2a37eb42..d181f7ade9e 100644 --- a/src/com/android/settings/MonitoringCertInfoActivity.java +++ b/src/com/android/settings/MonitoringCertInfoActivity.java @@ -17,7 +17,6 @@ package com.android.settings; import android.app.Activity; -import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; @@ -29,6 +28,8 @@ import android.provider.Settings; import com.android.settingslib.RestrictedLockUtils; +import androidx.appcompat.app.AlertDialog; + /** * Activity that shows a dialog explaining that a CA cert is allowing someone to monitor network * traffic. This activity should be launched for the user into which the CA cert is installed diff --git a/src/com/android/settings/ProxySelector.java b/src/com/android/settings/ProxySelector.java index 1c51a98f6a1..a681b94ae90 100644 --- a/src/com/android/settings/ProxySelector.java +++ b/src/com/android/settings/ProxySelector.java @@ -17,7 +17,6 @@ package com.android.settings; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.content.Context; @@ -43,6 +42,8 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment; import com.android.settings.core.InstrumentedFragment; +import androidx.appcompat.app.AlertDialog; + public class ProxySelector extends InstrumentedFragment implements DialogCreatable { private static final String TAG = "ProxySelector"; diff --git a/src/com/android/settings/RadioInfo.java b/src/com/android/settings/RadioInfo.java index ee20c586e9b..3db99359d61 100644 --- a/src/com/android/settings/RadioInfo.java +++ b/src/com/android/settings/RadioInfo.java @@ -20,7 +20,6 @@ import static android.net.ConnectivityManager.NetworkCallback; import static android.provider.Settings.Global.PREFERRED_NETWORK_MODE; import android.app.Activity; -import android.app.AlertDialog; import android.app.QueuedWork; import android.content.ComponentName; import android.content.Context; @@ -91,6 +90,8 @@ import java.net.HttpURLConnection; import java.net.URL; import java.util.List; +import androidx.appcompat.app.AlertDialog; + public class RadioInfo extends Activity { private static final String TAG = "RadioInfo"; diff --git a/src/com/android/settings/RegulatoryInfoDisplayActivity.java b/src/com/android/settings/RegulatoryInfoDisplayActivity.java index 2b47c86b73d..6430a135699 100644 --- a/src/com/android/settings/RegulatoryInfoDisplayActivity.java +++ b/src/com/android/settings/RegulatoryInfoDisplayActivity.java @@ -17,7 +17,6 @@ package com.android.settings; import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; import android.content.res.Resources; import android.graphics.Bitmap; @@ -34,6 +33,7 @@ import android.widget.TextView; import java.util.Locale; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; /** * {@link Activity} that displays regulatory information for the "Regulatory information" diff --git a/src/com/android/settings/RemoteBugreportActivity.java b/src/com/android/settings/RemoteBugreportActivity.java index 7069175bfcc..2c88ec329d4 100644 --- a/src/com/android/settings/RemoteBugreportActivity.java +++ b/src/com/android/settings/RemoteBugreportActivity.java @@ -17,7 +17,6 @@ package com.android.settings; import android.annotation.Nullable; import android.app.Activity; -import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; import android.content.DialogInterface; import android.content.Intent; @@ -25,6 +24,8 @@ import android.os.Bundle; import android.os.UserHandle; import android.util.Log; +import androidx.appcompat.app.AlertDialog; + /** * UI for the remote bugreport dialog. Shows one of 3 possible dialogs: *
    diff --git a/src/com/android/settings/ResetNetworkConfirm.java b/src/com/android/settings/ResetNetworkConfirm.java index 53be36a2a13..88a704962a0 100644 --- a/src/com/android/settings/ResetNetworkConfirm.java +++ b/src/com/android/settings/ResetNetworkConfirm.java @@ -18,7 +18,6 @@ package com.android.settings; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; -import android.app.AlertDialog; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothManager; import android.content.ContentResolver; @@ -50,6 +49,7 @@ import com.android.settings.network.ApnSettings; import com.android.settingslib.RestrictedLockUtils; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; /** * Confirm and execute a reset of the network settings to a clean "just out of the box" diff --git a/src/com/android/settings/RestrictedListPreference.java b/src/com/android/settings/RestrictedListPreference.java index a5d241c9849..e79f03ef454 100644 --- a/src/com/android/settings/RestrictedListPreference.java +++ b/src/com/android/settings/RestrictedListPreference.java @@ -18,7 +18,6 @@ package com.android.settings; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; -import android.app.AlertDialog; import android.app.KeyguardManager; import android.content.Context; import android.content.DialogInterface; @@ -41,6 +40,7 @@ import com.android.settingslib.RestrictedPreferenceHelper; import java.util.ArrayList; import java.util.List; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog.Builder; import androidx.preference.ListPreferenceDialogFragmentCompat; import androidx.preference.PreferenceViewHolder; diff --git a/src/com/android/settings/RestrictedSettingsFragment.java b/src/com/android/settings/RestrictedSettingsFragment.java index 3bf9f85fdcc..28943666fd7 100644 --- a/src/com/android/settings/RestrictedSettingsFragment.java +++ b/src/com/android/settings/RestrictedSettingsFragment.java @@ -19,7 +19,6 @@ package com.android.settings; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.app.Activity; -import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -37,6 +36,7 @@ import com.android.settings.enterprise.ActionDisabledByAdminDialogHelper; import com.android.settingslib.RestrictedLockUtils; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; /** * Base class for settings screens that should be pin protected when in restricted mode or diff --git a/src/com/android/settings/TrustedCredentialsDialogBuilder.java b/src/com/android/settings/TrustedCredentialsDialogBuilder.java index 03414bdc2e1..76bf8617439 100644 --- a/src/com/android/settings/TrustedCredentialsDialogBuilder.java +++ b/src/com/android/settings/TrustedCredentialsDialogBuilder.java @@ -17,7 +17,6 @@ package com.android.settings; import android.annotation.NonNull; import android.app.Activity; -import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; import android.content.DialogInterface; import android.content.pm.UserInfo; @@ -41,6 +40,8 @@ import java.util.ArrayList; import java.util.List; import java.util.function.IntConsumer; +import androidx.appcompat.app.AlertDialog; + class TrustedCredentialsDialogBuilder extends AlertDialog.Builder { public interface DelegateInterface { List getX509CertsFromCertHolder(CertHolder certHolder); diff --git a/src/com/android/settings/UserCredentialsSettings.java b/src/com/android/settings/UserCredentialsSettings.java index 20defb3f546..06d0be67cf6 100644 --- a/src/com/android/settings/UserCredentialsSettings.java +++ b/src/com/android/settings/UserCredentialsSettings.java @@ -18,7 +18,6 @@ package com.android.settings; import android.annotation.LayoutRes; import android.annotation.Nullable; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -57,6 +56,7 @@ import java.util.List; import java.util.SortedMap; import java.util.TreeMap; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index 55ec1596093..9d5f96fef39 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -389,9 +389,7 @@ public final class Utils extends com.android.settingslib.Utils { */ public static UserHandle getManagedProfile(UserManager userManager) { List userProfiles = userManager.getUserProfiles(); - final int count = userProfiles.size(); - for (int i = 0; i < count; i++) { - final UserHandle profile = userProfiles.get(i); + for (UserHandle profile : userProfiles) { if (profile.getIdentifier() == userManager.getUserHandle()) { continue; } diff --git a/src/com/android/settings/accessibility/AccessibilityServiceWarning.java b/src/com/android/settings/accessibility/AccessibilityServiceWarning.java index 4890011d2ff..95e1643b3a8 100644 --- a/src/com/android/settings/accessibility/AccessibilityServiceWarning.java +++ b/src/com/android/settings/accessibility/AccessibilityServiceWarning.java @@ -20,7 +20,6 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYST import android.accessibilityservice.AccessibilityServiceInfo; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -41,6 +40,8 @@ import com.android.settings.R; import java.util.List; import java.util.Locale; +import androidx.appcompat.app.AlertDialog; + /** * Utility class for creating the dialog that asks users for explicit permission to grant * all of the requested capabilities to an accessibility service before the service is enabled diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java index b345e05e9cc..6738736afb8 100644 --- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java @@ -18,7 +18,6 @@ package com.android.settings.accessibility; import android.accessibilityservice.AccessibilityServiceInfo; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; @@ -46,6 +45,8 @@ import com.android.settingslib.accessibility.AccessibilityUtils; import java.util.List; +import androidx.appcompat.app.AlertDialog; + public class ToggleAccessibilityServicePreferenceFragment extends ToggleFeaturePreferenceFragment implements DialogInterface.OnClickListener { diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java index f90c3c68991..58624cd3d51 100644 --- a/src/com/android/settings/accounts/AccountSyncSettings.java +++ b/src/com/android/settings/accounts/AccountSyncSettings.java @@ -19,7 +19,6 @@ package com.android.settings.accounts; import android.accounts.Account; import android.accounts.AccountManager; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.content.ContentResolver; import android.content.Context; @@ -53,6 +52,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; public class AccountSyncSettings extends AccountPreferenceBase { diff --git a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java index 8df485c42fe..35201168f85 100644 --- a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java +++ b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java @@ -22,7 +22,6 @@ import android.accounts.AccountManagerFuture; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -45,6 +44,7 @@ import com.android.settingslib.core.AbstractPreferenceController; import java.io.IOException; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.preference.PreferenceScreen; diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java index 4ee2fd8e56e..0acb046bcbe 100644 --- a/src/com/android/settings/applications/AppInfoBase.java +++ b/src/com/android/settings/applications/AppInfoBase.java @@ -19,7 +19,6 @@ package com.android.settings.applications; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; @@ -51,6 +50,7 @@ import com.android.settingslib.applications.ApplicationsState.AppEntry; import java.util.ArrayList; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; diff --git a/src/com/android/settings/applications/AppLaunchSettings.java b/src/com/android/settings/applications/AppLaunchSettings.java index 6b527a7886b..82ac1b06ac0 100644 --- a/src/com/android/settings/applications/AppLaunchSettings.java +++ b/src/com/android/settings/applications/AppLaunchSettings.java @@ -21,7 +21,6 @@ import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATIO import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER; import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; -import android.app.AlertDialog; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; @@ -42,6 +41,7 @@ import com.android.settings.Utils; import java.util.List; +import androidx.appcompat.app.AlertDialog; import androidx.preference.DropDownPreference; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceChangeListener; diff --git a/src/com/android/settings/applications/AppStorageSettings.java b/src/com/android/settings/applications/AppStorageSettings.java index 897cbc7a59e..ed5397a0f7e 100644 --- a/src/com/android/settings/applications/AppStorageSettings.java +++ b/src/com/android/settings/applications/AppStorageSettings.java @@ -22,7 +22,6 @@ import static android.os.storage.StorageVolume.ScopedAccessProviderContract.AUTH import static android.os.storage.StorageVolume.ScopedAccessProviderContract.TABLE_PERMISSIONS; import android.app.ActivityManager; -import android.app.AlertDialog; import android.app.AppGlobals; import android.app.GrantedUriPermission; import android.content.ContentResolver; @@ -64,6 +63,7 @@ import java.util.Objects; import java.util.TreeMap; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.loader.app.LoaderManager; import androidx.loader.content.Loader; import androidx.preference.Preference; diff --git a/src/com/android/settings/applications/DirectoryAccessDetails.java b/src/com/android/settings/applications/DirectoryAccessDetails.java index 02c33c060ef..8325f0d63ac 100644 --- a/src/com/android/settings/applications/DirectoryAccessDetails.java +++ b/src/com/android/settings/applications/DirectoryAccessDetails.java @@ -34,7 +34,6 @@ import static com.android.settings.applications.AppStateDirectoryAccessBridge.VE import android.annotation.Nullable; import android.app.Activity; -import android.app.AlertDialog; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; @@ -60,6 +59,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; diff --git a/src/com/android/settings/applications/ProcessStatsDetail.java b/src/com/android/settings/applications/ProcessStatsDetail.java index 3331b1ca828..e57808f865a 100644 --- a/src/com/android/settings/applications/ProcessStatsDetail.java +++ b/src/com/android/settings/applications/ProcessStatsDetail.java @@ -21,7 +21,6 @@ import static com.android.settings.widget.EntityHeaderController.ActionType; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RunningServiceInfo; -import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; @@ -59,6 +58,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; diff --git a/src/com/android/settings/applications/RunningServiceDetails.java b/src/com/android/settings/applications/RunningServiceDetails.java index 0461343872c..66fdb088e93 100644 --- a/src/com/android/settings/applications/RunningServiceDetails.java +++ b/src/com/android/settings/applications/RunningServiceDetails.java @@ -2,7 +2,6 @@ package com.android.settings.applications; import android.app.Activity; import android.app.ActivityManager; -import android.app.AlertDialog; import android.app.ApplicationErrorReport; import android.app.Dialog; import android.app.PendingIntent; @@ -44,6 +43,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; public class RunningServiceDetails extends InstrumentedFragment diff --git a/src/com/android/settings/applications/UsageAccessDetails.java b/src/com/android/settings/applications/UsageAccessDetails.java index 8c76e715adb..c14ddbc047d 100644 --- a/src/com/android/settings/applications/UsageAccessDetails.java +++ b/src/com/android/settings/applications/UsageAccessDetails.java @@ -15,7 +15,6 @@ */ package com.android.settings.applications; -import android.app.AlertDialog; import android.app.AppOpsManager; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; @@ -32,6 +31,7 @@ import com.android.settings.applications.AppStateUsageBridge.UsageState; import com.android.settings.overlay.FeatureFactory; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceChangeListener; import androidx.preference.Preference.OnPreferenceClickListener; diff --git a/src/com/android/settings/applications/appinfo/ButtonActionDialogFragment.java b/src/com/android/settings/applications/appinfo/ButtonActionDialogFragment.java index f6e0472a30e..eeeb205f0fe 100644 --- a/src/com/android/settings/applications/appinfo/ButtonActionDialogFragment.java +++ b/src/com/android/settings/applications/appinfo/ButtonActionDialogFragment.java @@ -15,7 +15,6 @@ */ package com.android.settings.applications.appinfo; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -30,6 +29,7 @@ import java.lang.annotation.RetentionPolicy; import androidx.annotation.IntDef; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; /** * Fragment to show the dialog for uninstall or forcestop. This fragment uses function in diff --git a/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java b/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java index 94111cfe1a6..8c572af024b 100644 --- a/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java +++ b/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java @@ -17,7 +17,6 @@ package com.android.settings.applications.appinfo; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; -import android.app.AlertDialog; import android.app.AppOpsManager; import android.content.Context; import android.content.Intent; @@ -38,6 +37,7 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.applications.ApplicationsState.AppEntry; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceChangeListener; import androidx.preference.Preference.OnPreferenceClickListener; diff --git a/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java b/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java index dc9ab7e01da..224072c9885 100644 --- a/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java +++ b/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java @@ -18,7 +18,6 @@ package com.android.settings.applications.appinfo; import static android.app.Activity.RESULT_CANCELED; import static android.app.Activity.RESULT_OK; -import android.app.AlertDialog; import android.app.AppOpsManager; import android.content.Context; import android.os.Bundle; @@ -34,6 +33,7 @@ import com.android.settings.applications.AppStateInstallAppsBridge.InstallAppsSt import com.android.settingslib.RestrictedSwitchPreference; import com.android.settingslib.applications.ApplicationsState.AppEntry; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceChangeListener; diff --git a/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragment.java b/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragment.java index 2e668ef4662..683a764f7e0 100644 --- a/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragment.java +++ b/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragment.java @@ -15,7 +15,6 @@ */ package com.android.settings.applications.appinfo; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -28,6 +27,8 @@ import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.overlay.FeatureFactory; +import androidx.appcompat.app.AlertDialog; + /** * Fragment to show the dialog for clearing the instant app. */ diff --git a/src/com/android/settings/applications/appinfo/WriteSettingsDetails.java b/src/com/android/settings/applications/appinfo/WriteSettingsDetails.java index 7f9f3599fa4..aed263fbb3f 100644 --- a/src/com/android/settings/applications/appinfo/WriteSettingsDetails.java +++ b/src/com/android/settings/applications/appinfo/WriteSettingsDetails.java @@ -15,7 +15,6 @@ */ package com.android.settings.applications.appinfo; -import android.app.AlertDialog; import android.app.AppOpsManager; import android.content.Context; import android.content.Intent; @@ -33,6 +32,7 @@ import com.android.settings.applications.AppStateWriteSettingsBridge.WriteSettin import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.applications.ApplicationsState.AppEntry; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceChangeListener; import androidx.preference.Preference.OnPreferenceClickListener; diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java index 3838d299575..395ea64d13f 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java +++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java @@ -16,7 +16,6 @@ package com.android.settings.applications.defaultapps; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -34,6 +33,7 @@ import com.android.settings.widget.RadioButtonPreference; import com.android.settingslib.applications.DefaultAppInfo; import com.android.settingslib.widget.CandidateInfo; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index de4558e2fb7..a64f4611963 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -54,6 +54,7 @@ import android.os.UserManager; import android.preference.PreferenceFrameLayout; import android.text.TextUtils; import android.util.ArraySet; +import android.util.IconDrawableFactory; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -862,6 +863,7 @@ public class ManageApplications extends InstrumentedFragment private final Context mContext; private final AppStateBaseBridge mExtraInfoBridge; private final LoadingViewController mLoadingViewController; + private final IconDrawableFactory mIconDrawableFactory; private AppFilterItem mAppFilter; private ArrayList mEntries; @@ -894,6 +896,7 @@ public class ManageApplications extends InstrumentedFragment mManageApplications.mListContainer ); mContext = manageApplications.getActivity(); + mIconDrawableFactory = IconDrawableFactory.newInstance(mContext); mAppFilter = appFilter; if (mManageApplications.mListType == LIST_TYPE_NOTIFICATION) { mExtraInfoBridge = new AppStateNotificationBridge(mContext, mState, this, @@ -1318,8 +1321,7 @@ public class ManageApplications extends InstrumentedFragment ApplicationsState.AppEntry entry = mEntries.get(position); synchronized (entry) { holder.setTitle(entry.label); - mState.ensureIcon(entry); - holder.setIcon(entry.icon); + holder.setIcon(mIconDrawableFactory.getBadgedIcon(entry.info)); updateSummary(holder, entry); updateSwitch(holder, entry); holder.updateDisableView(entry.info); diff --git a/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java b/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java index 686e027928e..4e38f4e57f6 100644 --- a/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java +++ b/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java @@ -19,7 +19,6 @@ import static android.net.NetworkPolicyManager.POLICY_NONE; import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; import android.app.ActivityManager; -import android.app.AlertDialog; import android.app.AppOpsManager; import android.app.INotificationManager; import android.content.Context; @@ -39,6 +38,8 @@ import com.android.settings.R; import java.util.List; +import androidx.appcompat.app.AlertDialog; + public class ResetAppsHelper implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener { diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java index 04757348e88..c7e93b80b4e 100644 --- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java +++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java @@ -18,7 +18,6 @@ package com.android.settings.applications.specialaccess.deviceadmin; import android.app.Activity; import android.app.ActivityManager; -import android.app.AlertDialog; import android.app.AppOpsManager; import android.app.Dialog; import android.app.admin.DeviceAdminInfo; @@ -74,6 +73,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import androidx.appcompat.app.AlertDialog; + public class DeviceAdminAdd extends Activity { static final String TAG = "DeviceAdminAdd"; diff --git a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java index 6af4f81b3f6..79606ee81b8 100644 --- a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java +++ b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java @@ -19,7 +19,6 @@ import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.MODE_ERRORED; import static android.app.AppOpsManager.OP_PICTURE_IN_PICTURE; -import android.app.AlertDialog; import android.app.AppOpsManager; import android.content.Context; import android.os.Bundle; @@ -30,6 +29,7 @@ import com.android.settings.applications.AppInfoWithHeader; import com.android.settings.overlay.FeatureFactory; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceChangeListener; import androidx.preference.SwitchPreference; diff --git a/src/com/android/settings/backup/ToggleBackupSettingFragment.java b/src/com/android/settings/backup/ToggleBackupSettingFragment.java index 0d1c33e493e..fb24542359f 100644 --- a/src/com/android/settings/backup/ToggleBackupSettingFragment.java +++ b/src/com/android/settings/backup/ToggleBackupSettingFragment.java @@ -1,6 +1,5 @@ package com.android.settings.backup; -import android.app.AlertDialog; import android.app.Dialog; import android.app.backup.IBackupManager; import android.content.Context; @@ -20,6 +19,7 @@ import com.android.settings.SettingsPreferenceFragment; import com.android.settings.widget.SwitchBar; import com.android.settings.widget.ToggleSwitch; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceViewHolder; diff --git a/src/com/android/settings/biometrics/BiometricErrorDialog.java b/src/com/android/settings/biometrics/BiometricErrorDialog.java index 4e073f138e0..5c4e891bb13 100644 --- a/src/com/android/settings/biometrics/BiometricErrorDialog.java +++ b/src/com/android/settings/biometrics/BiometricErrorDialog.java @@ -20,7 +20,6 @@ import static com.android.settings.biometrics.BiometricSettings.RESULT_FINISHED; import static com.android.settings.biometrics.BiometricSettings.RESULT_TIMEOUT; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.hardware.biometrics.BiometricConstants; @@ -28,6 +27,8 @@ import android.os.Bundle; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; + /** * Abstract dialog, shown when an error occurs during biometric enrollment. */ diff --git a/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java b/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java index ec7d12084c6..f10103877da 100644 --- a/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java @@ -109,7 +109,8 @@ public abstract class BiometricsEnrollEnrolling extends BiometricEnrollBase .findFragmentByTag(TAG_SIDECAR); if (mSidecar == null) { mSidecar = getSidecar(); - getSupportFragmentManager().beginTransaction().add(mSidecar, TAG_SIDECAR).commit(); + getSupportFragmentManager().beginTransaction().add(mSidecar, TAG_SIDECAR) + .commitAllowingStateLoss(); } mSidecar.setListener(this); } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index 56d96ce7edd..38ef2c1b7f4 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -18,7 +18,6 @@ package com.android.settings.biometrics.fingerprint; import android.animation.Animator; import android.animation.ObjectAnimator; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; @@ -47,6 +46,8 @@ import com.android.settings.biometrics.BiometricErrorDialog; import com.android.settings.biometrics.BiometricsEnrollEnrolling; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; + /** * Activity which handles the actual enrolling for fingerprint. */ diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index 76ee78bc0ec..d318fefc544 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -18,7 +18,6 @@ package com.android.settings.biometrics.fingerprint; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.content.Context; @@ -57,6 +56,7 @@ import java.util.HashMap; import java.util.List; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceChangeListener; import androidx.preference.PreferenceGroup; diff --git a/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensor.java index 4529277d5be..febffa69dae 100644 --- a/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensor.java +++ b/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensor.java @@ -17,7 +17,6 @@ package com.android.settings.biometrics.fingerprint; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; @@ -32,6 +31,7 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.password.ChooseLockSettingsHelper; import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentManager; public class SetupFingerprintEnrollFindSensor extends FingerprintEnrollFindSensor { diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java index 85903926afa..eb1cd52ea38 100644 --- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java +++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java @@ -18,7 +18,6 @@ package com.android.settings.bluetooth; import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH; -import android.app.AlertDialog; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.content.DialogInterface; @@ -39,6 +38,7 @@ import com.android.settingslib.bluetooth.BluetoothUtils; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; diff --git a/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java b/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java index 0eb97462887..6f737e015b2 100644 --- a/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java +++ b/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java @@ -16,7 +16,6 @@ package com.android.settings.bluetooth; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -38,6 +37,8 @@ import android.widget.TextView; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; + /** * Dialog fragment for renaming a Bluetooth device. */ diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java b/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java index 580a26f23c6..e5d2aa7b475 100644 --- a/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java @@ -15,7 +15,6 @@ */ package com.android.settings.bluetooth; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -40,6 +39,7 @@ import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; /** * A dialogFragment used by {@link BluetoothPairingDialog} to create an appropriately styled dialog diff --git a/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java index 32edb238a17..e6606915b30 100644 --- a/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java +++ b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java @@ -17,7 +17,6 @@ package com.android.settings.bluetooth; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.bluetooth.BluetoothDevice; import android.content.Context; @@ -31,6 +30,7 @@ import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; /** Implements an AlertDialog for confirming that a user wishes to unpair or "forget" a paired * device*/ diff --git a/src/com/android/settings/bluetooth/RequestPermissionActivity.java b/src/com/android/settings/bluetooth/RequestPermissionActivity.java index 76b897dc56f..5f6fc3959ea 100644 --- a/src/com/android/settings/bluetooth/RequestPermissionActivity.java +++ b/src/com/android/settings/bluetooth/RequestPermissionActivity.java @@ -18,7 +18,6 @@ package com.android.settings.bluetooth; import android.annotation.NonNull; import android.app.Activity; -import android.app.AlertDialog; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; @@ -38,6 +37,8 @@ import com.android.settingslib.bluetooth.BluetoothDiscoverableTimeoutReceiver; import com.android.settingslib.bluetooth.LocalBluetoothAdapter; import com.android.settingslib.bluetooth.LocalBluetoothManager; +import androidx.appcompat.app.AlertDialog; + /** * RequestPermissionActivity asks the user whether to enable discovery. This is * usually started by an application wanted to start bluetooth and or discovery diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java index 96f5da5b298..567aa93d397 100755 --- a/src/com/android/settings/bluetooth/Utils.java +++ b/src/com/android/settings/bluetooth/Utils.java @@ -16,7 +16,6 @@ package com.android.settings.bluetooth; -import android.app.AlertDialog; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; @@ -34,6 +33,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothManager.BluetoothManagerCallback; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; /** * Utils is a helper class that contains constants for various diff --git a/src/com/android/settings/core/SettingsBaseActivity.java b/src/com/android/settings/core/SettingsBaseActivity.java index 2cce467291b..967269476ad 100644 --- a/src/com/android/settings/core/SettingsBaseActivity.java +++ b/src/com/android/settings/core/SettingsBaseActivity.java @@ -35,15 +35,14 @@ import android.view.Window; import android.view.WindowManager.LayoutParams; import android.widget.Toolbar; +import androidx.fragment.app.FragmentActivity; + import com.android.settings.R; import com.android.settingslib.drawer.CategoryManager; -import com.android.settingslib.drawer.TileUtils; import java.util.ArrayList; import java.util.List; -import androidx.fragment.app.FragmentActivity; - public class SettingsBaseActivity extends FragmentActivity { protected static final boolean DEBUG_TIMING = false; @@ -174,7 +173,7 @@ public class SettingsBaseActivity extends FragmentActivity { } public String getSettingPkg() { - return TileUtils.SETTING_PKG; + return CategoryManager.SETTING_PKG; } public interface CategoryListener { diff --git a/src/com/android/settings/dashboard/DashboardData.java b/src/com/android/settings/dashboard/DashboardData.java index 9f66731e245..182d79b6227 100644 --- a/src/com/android/settings/dashboard/DashboardData.java +++ b/src/com/android/settings/dashboard/DashboardData.java @@ -20,6 +20,9 @@ import android.graphics.drawable.Drawable; import android.service.settings.suggestions.Suggestion; import android.text.TextUtils; +import androidx.annotation.VisibleForTesting; +import androidx.recyclerview.widget.DiffUtil; + import com.android.settings.R; import com.android.settings.dashboard.conditional.Condition; import com.android.settingslib.drawer.DashboardCategory; @@ -31,9 +34,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import androidx.annotation.VisibleForTesting; -import androidx.recyclerview.widget.DiffUtil; - /** * Description about data list used in the DashboardAdapter. In the data list each item can be * Condition, suggestion or category tile. @@ -411,16 +411,7 @@ public class DashboardData { && TextUtils.equals(localTile.summary, targetTile.summary); case TYPE_SUGGESTION_CONTAINER: case TYPE_CONDITION_CONTAINER: - // If entity is suggestion and contains remote view, force refresh - final List entities = (List) entity; - if (!entities.isEmpty()) { - Object firstEntity = entities.get(0); - if (firstEntity instanceof Tile - && ((Tile) firstEntity).remoteViews != null) { - return false; - } - } - // Otherwise Fall through to default + // Fall through to default default: return entity == null ? targetItem.entity == null : entity.equals(targetItem.entity); diff --git a/src/com/android/settings/dashboard/RestrictedDashboardFragment.java b/src/com/android/settings/dashboard/RestrictedDashboardFragment.java index 8258678791a..927385b4eaa 100644 --- a/src/com/android/settings/dashboard/RestrictedDashboardFragment.java +++ b/src/com/android/settings/dashboard/RestrictedDashboardFragment.java @@ -19,7 +19,6 @@ package com.android.settings.dashboard; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.app.Activity; -import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -37,6 +36,8 @@ import com.android.settings.RestrictedSettingsFragment; import com.android.settings.enterprise.ActionDisabledByAdminDialogHelper; import com.android.settingslib.RestrictedLockUtils; +import androidx.appcompat.app.AlertDialog; + /** * Base class for settings screens that should be pin protected when in restricted mode or * that will display an admin support message in case an admin has disabled the options. diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java index 2e89e59ca24..1d1ec6d4f3d 100644 --- a/src/com/android/settings/datausage/BillingCycleSettings.java +++ b/src/com/android/settings/datausage/BillingCycleSettings.java @@ -17,7 +17,6 @@ package com.android.settings.datausage; import static android.net.NetworkPolicy.LIMIT_DISABLED; import static android.net.NetworkPolicy.WARNING_DISABLED; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -47,6 +46,7 @@ import java.util.ArrayList; import java.util.List; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.preference.Preference; import androidx.preference.SwitchPreference; diff --git a/src/com/android/settings/deletionhelper/ActivationWarningFragment.java b/src/com/android/settings/deletionhelper/ActivationWarningFragment.java index 1618e2a49be..9bfe0327dc3 100644 --- a/src/com/android/settings/deletionhelper/ActivationWarningFragment.java +++ b/src/com/android/settings/deletionhelper/ActivationWarningFragment.java @@ -16,12 +16,12 @@ package com.android.settings.deletionhelper; -import android.app.AlertDialog; import android.app.Dialog; import android.os.Bundle; import com.android.settings.R; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; /** diff --git a/src/com/android/settings/development/BluetoothA2dpHwOffloadRebootDialog.java b/src/com/android/settings/development/BluetoothA2dpHwOffloadRebootDialog.java index 03e1143545b..ba059107ffe 100644 --- a/src/com/android/settings/development/BluetoothA2dpHwOffloadRebootDialog.java +++ b/src/com/android/settings/development/BluetoothA2dpHwOffloadRebootDialog.java @@ -16,7 +16,6 @@ package com.android.settings.development; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; @@ -26,6 +25,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentManager; public class BluetoothA2dpHwOffloadRebootDialog extends InstrumentedDialogFragment diff --git a/src/com/android/settings/development/ClearAdbKeysWarningDialog.java b/src/com/android/settings/development/ClearAdbKeysWarningDialog.java index e9307590f98..3d81f1a8191 100644 --- a/src/com/android/settings/development/ClearAdbKeysWarningDialog.java +++ b/src/com/android/settings/development/ClearAdbKeysWarningDialog.java @@ -16,7 +16,6 @@ package com.android.settings.development; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; @@ -25,6 +24,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; diff --git a/src/com/android/settings/development/DisableLogPersistWarningDialog.java b/src/com/android/settings/development/DisableLogPersistWarningDialog.java index fbe2b0526b3..b25e5ffb8a2 100644 --- a/src/com/android/settings/development/DisableLogPersistWarningDialog.java +++ b/src/com/android/settings/development/DisableLogPersistWarningDialog.java @@ -16,7 +16,6 @@ package com.android.settings.development; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; @@ -25,6 +24,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; diff --git a/src/com/android/settings/development/EnableAdbWarningDialog.java b/src/com/android/settings/development/EnableAdbWarningDialog.java index e1354ce3056..e191f306aa0 100644 --- a/src/com/android/settings/development/EnableAdbWarningDialog.java +++ b/src/com/android/settings/development/EnableAdbWarningDialog.java @@ -16,7 +16,6 @@ package com.android.settings.development; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; @@ -25,6 +24,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; diff --git a/src/com/android/settings/development/EnableDevelopmentSettingWarningDialog.java b/src/com/android/settings/development/EnableDevelopmentSettingWarningDialog.java index 51532f3281e..ebc195e3b4d 100644 --- a/src/com/android/settings/development/EnableDevelopmentSettingWarningDialog.java +++ b/src/com/android/settings/development/EnableDevelopmentSettingWarningDialog.java @@ -16,7 +16,6 @@ package com.android.settings.development; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; @@ -25,6 +24,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentManager; public class EnableDevelopmentSettingWarningDialog extends InstrumentedDialogFragment diff --git a/src/com/android/settings/development/EnableOemUnlockSettingWarningDialog.java b/src/com/android/settings/development/EnableOemUnlockSettingWarningDialog.java index 09d2ffed97a..cf077ca733b 100644 --- a/src/com/android/settings/development/EnableOemUnlockSettingWarningDialog.java +++ b/src/com/android/settings/development/EnableOemUnlockSettingWarningDialog.java @@ -16,7 +16,6 @@ package com.android.settings.development; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; @@ -25,6 +24,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; diff --git a/src/com/android/settings/development/OemLockInfoDialog.java b/src/com/android/settings/development/OemLockInfoDialog.java index 74babf26f57..f197c6aab3d 100644 --- a/src/com/android/settings/development/OemLockInfoDialog.java +++ b/src/com/android/settings/development/OemLockInfoDialog.java @@ -16,7 +16,6 @@ package com.android.settings.development; -import android.app.AlertDialog; import android.app.Dialog; import android.os.Bundle; @@ -24,6 +23,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; diff --git a/src/com/android/settings/deviceinfo/HardwareInfoDialogFragment.java b/src/com/android/settings/deviceinfo/HardwareInfoDialogFragment.java index 51964a93737..3057fa0dc4e 100644 --- a/src/com/android/settings/deviceinfo/HardwareInfoDialogFragment.java +++ b/src/com/android/settings/deviceinfo/HardwareInfoDialogFragment.java @@ -16,7 +16,6 @@ package com.android.settings.deviceinfo; -import android.app.AlertDialog; import android.app.Dialog; import android.os.Build; import android.os.Bundle; @@ -31,6 +30,7 @@ import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; public class HardwareInfoDialogFragment extends InstrumentedDialogFragment { diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeForget.java b/src/com/android/settings/deviceinfo/PrivateVolumeForget.java index 8c7fa0959d9..ebd976b0ba3 100644 --- a/src/com/android/settings/deviceinfo/PrivateVolumeForget.java +++ b/src/com/android/settings/deviceinfo/PrivateVolumeForget.java @@ -16,7 +16,6 @@ package com.android.settings.deviceinfo; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -38,6 +37,7 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.search.actionbar.SearchMenuController; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; public class PrivateVolumeForget extends InstrumentedFragment { diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java index 8d6714d7c00..997f0d27361 100644 --- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java +++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java @@ -16,7 +16,6 @@ package com.android.settings.deviceinfo; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -65,6 +64,7 @@ import java.util.HashMap; import java.util.List; import java.util.Objects; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java index 90da85c0104..f4ea580de1e 100644 --- a/src/com/android/settings/deviceinfo/StorageSettings.java +++ b/src/com/android/settings/deviceinfo/StorageSettings.java @@ -18,7 +18,6 @@ package com.android.settings.deviceinfo; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -61,6 +60,7 @@ import java.util.List; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; diff --git a/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java b/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java index 85e59293950..e09e89d92ba 100644 --- a/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java +++ b/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java @@ -20,7 +20,6 @@ import static android.os.storage.DiskInfo.EXTRA_DISK_ID; import static com.android.settings.deviceinfo.StorageWizardBase.EXTRA_FORMAT_FORGET_UUID; import static com.android.settings.deviceinfo.StorageWizardBase.EXTRA_FORMAT_PRIVATE; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.Intent; @@ -33,6 +32,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; public class StorageWizardFormatConfirm extends InstrumentedDialogFragment { diff --git a/src/com/android/settings/deviceinfo/aboutphone/DeviceNameWarningDialog.java b/src/com/android/settings/deviceinfo/aboutphone/DeviceNameWarningDialog.java index 45f39d94275..0224040d4fa 100644 --- a/src/com/android/settings/deviceinfo/aboutphone/DeviceNameWarningDialog.java +++ b/src/com/android/settings/deviceinfo/aboutphone/DeviceNameWarningDialog.java @@ -16,7 +16,6 @@ package com.android.settings.deviceinfo.aboutphone; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; @@ -25,6 +24,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentManager; /** diff --git a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java index 17a96920883..9c6075e6fc2 100644 --- a/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java +++ b/src/com/android/settings/deviceinfo/firmwareversion/FirmwareVersionDialogFragment.java @@ -16,7 +16,6 @@ package com.android.settings.deviceinfo.firmwareversion; -import android.app.AlertDialog; import android.app.Dialog; import android.os.Bundle; import android.view.LayoutInflater; @@ -27,6 +26,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogFragment.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogFragment.java index 01fb04a049c..808edd4bec8 100644 --- a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogFragment.java +++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogFragment.java @@ -16,7 +16,6 @@ package com.android.settings.deviceinfo.imei; -import android.app.AlertDialog; import android.app.Dialog; import android.os.Bundle; import android.text.TextUtils; @@ -30,6 +29,7 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogFragment.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogFragment.java index ef5118596ce..2dd378579a1 100644 --- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogFragment.java +++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogFragment.java @@ -16,7 +16,6 @@ package com.android.settings.deviceinfo.simstatus; -import android.app.AlertDialog; import android.app.Dialog; import android.os.Bundle; import android.text.TextUtils; @@ -28,6 +27,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; diff --git a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java index 6de3a92333a..6a4ca92bb30 100644 --- a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java +++ b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java @@ -17,7 +17,6 @@ package com.android.settings.enterprise; import android.app.Activity; -import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; @@ -43,6 +42,7 @@ import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import java.util.Objects; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; /** * Helper class for {@link ActionDisabledByAdminDialog} which sets up the dialog. diff --git a/src/com/android/settings/fuelgauge/HighPowerDetail.java b/src/com/android/settings/fuelgauge/HighPowerDetail.java index 84120d7e68b..f5df452c333 100644 --- a/src/com/android/settings/fuelgauge/HighPowerDetail.java +++ b/src/com/android/settings/fuelgauge/HighPowerDetail.java @@ -16,7 +16,6 @@ package com.android.settings.fuelgauge; -import android.app.AlertDialog; import android.app.AppOpsManager; import android.app.Dialog; import android.content.Context; @@ -38,6 +37,7 @@ import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.fuelgauge.PowerWhitelistBackend; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; public class HighPowerDetail extends InstrumentedDialogFragment implements OnClickListener, diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java index 4b086262a6c..66d9f2cf342 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java @@ -16,7 +16,6 @@ package com.android.settings.fuelgauge.batterytip; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -39,6 +38,7 @@ import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; import java.util.List; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java index 22c90e38845..4bd8cd73c9f 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java @@ -40,6 +40,7 @@ public class BatteryTipPolicy { private static final String KEY_HIGH_USAGE_PERIOD_MS = "high_usage_period_ms"; private static final String KEY_HIGH_USAGE_BATTERY_DRAINING = "high_usage_battery_draining"; private static final String KEY_APP_RESTRICTION_ENABLED = "app_restriction_enabled"; + private static final String KEY_APP_RESTRICTION_ACTIVE_HOUR = "app_restriction_active_hour"; private static final String KEY_REDUCED_BATTERY_ENABLED = "reduced_battery_enabled"; private static final String KEY_REDUCED_BATTERY_PERCENT = "reduced_battery_percent"; private static final String KEY_LOW_BATTERY_ENABLED = "low_battery_enabled"; @@ -118,6 +119,15 @@ public class BatteryTipPolicy { */ public final boolean appRestrictionEnabled; + /** + * Period(hour) to show anomaly apps. If it is 24 hours, it means only show anomaly apps + * happened in last 24 hours. + * + * @see Settings.Global#BATTERY_TIP_CONSTANTS + * @see #KEY_APP_RESTRICTION_ACTIVE_HOUR + */ + public final int appRestrictionActiveHour; + /** * {@code true} if reduced battery tip is enabled * @@ -228,6 +238,7 @@ public class BatteryTipPolicy { Duration.ofHours(2).toMillis()); highUsageBatteryDraining = mParser.getInt(KEY_HIGH_USAGE_BATTERY_DRAINING, 25); appRestrictionEnabled = mParser.getBoolean(KEY_APP_RESTRICTION_ENABLED, true); + appRestrictionActiveHour = mParser.getInt(KEY_APP_RESTRICTION_ACTIVE_HOUR, 24); reducedBatteryEnabled = mParser.getBoolean(KEY_REDUCED_BATTERY_ENABLED, false); reducedBatteryPercent = mParser.getInt(KEY_REDUCED_BATTERY_PERCENT, 50); lowBatteryEnabled = mParser.getBoolean(KEY_LOW_BATTERY_ENABLED, true); diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java index dfb7f974e5f..8debf6bcd4a 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java @@ -136,8 +136,8 @@ public class BatteryTipUtils { final List highUsageApps = BatteryDatabaseManager.getInstance(context) .queryAllAnomalies(timeAfterMs, AnomalyDatabaseHelper.State.NEW); // Remove it if it doesn't have label or been restricted - highUsageApps.removeIf( - new AppLabelPredicate(context).or(new AppRestrictionPredicate(context))); + highUsageApps.removeIf(AppLabelPredicate.getInstance(context) + .or(AppRestrictionPredicate.getInstance(context))); return highUsageApps; } diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java index bda0073ab85..e6c08371cd5 100644 --- a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java +++ b/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java @@ -31,6 +31,7 @@ import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; import androidx.annotation.VisibleForTesting; @@ -53,8 +54,8 @@ public class RestrictAppDetector implements BatteryTipDetector { mContext = context; mPolicy = policy; mBatteryDatabaseManager = BatteryDatabaseManager.getInstance(context); - mAppRestrictionPredicate = new AppRestrictionPredicate(context); - mAppLabelPredicate = new AppLabelPredicate(context); + mAppRestrictionPredicate = AppRestrictionPredicate.getInstance(context); + mAppLabelPredicate = AppLabelPredicate.getInstance(context); } @Override @@ -63,8 +64,8 @@ public class RestrictAppDetector implements BatteryTipDetector { return getFakeData(); } if (mPolicy.appRestrictionEnabled) { - // TODO(b/80192137): hook up the query timestamp to server side - final long oneDayBeforeMs = System.currentTimeMillis() - DateUtils.DAY_IN_MILLIS; + final long oneDayBeforeMs = System.currentTimeMillis() + - TimeUnit.HOURS.toMillis(mPolicy.appRestrictionActiveHour); final List highUsageApps = BatteryTipUtils.detectAnomalies(mContext, oneDayBeforeMs); if (!highUsageApps.isEmpty()) { diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java b/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java index 13a2452bb23..1444b12b4ee 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java @@ -16,7 +16,6 @@ package com.android.settings.fuelgauge.batterytip.tips; -import android.app.AppOpsManager; import android.content.Context; import com.android.settings.Utils; @@ -28,12 +27,20 @@ import java.util.function.Predicate; * {@link Predicate} for {@link AppInfo} to check whether it has label */ public class AppLabelPredicate implements Predicate { - private Context mContext; - private AppOpsManager mAppOpsManager; - public AppLabelPredicate(Context context) { + private static AppLabelPredicate sInstance; + private Context mContext; + + public static AppLabelPredicate getInstance(Context context) { + if (sInstance == null) { + sInstance = new AppLabelPredicate(context.getApplicationContext()); + } + + return sInstance; + } + + private AppLabelPredicate(Context context) { mContext = context; - mAppOpsManager = context.getSystemService(AppOpsManager.class); } @Override diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java b/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java index 3650fe38e2c..43a4d900e28 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java @@ -27,9 +27,19 @@ import java.util.function.Predicate; * {@link Predicate} for {@link AppInfo} to check whether it is restricted. */ public class AppRestrictionPredicate implements Predicate { + + private static AppRestrictionPredicate sInstance; private AppOpsManager mAppOpsManager; - public AppRestrictionPredicate(Context context) { + public static AppRestrictionPredicate getInstance(Context context) { + if (sInstance == null) { + sInstance = new AppRestrictionPredicate(context.getApplicationContext()); + } + + return sInstance; + } + + private AppRestrictionPredicate(Context context) { mAppOpsManager = context.getSystemService(AppOpsManager.class); } diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java index 61a11577e25..1d5143f624a 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java @@ -16,7 +16,6 @@ package com.android.settings.fuelgauge.batterytip.tips; -import android.content.ContentResolver; import android.content.Context; import android.os.Parcel; import android.os.Parcelable; diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java index 8a2d86dd31f..0d91c7437d6 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java @@ -112,7 +112,7 @@ public class RestrictAppTip extends BatteryTip { super.sanityCheck(context); // Set it invisible if there is no valid app - mRestrictAppList.removeIf(new AppLabelPredicate(context)); + mRestrictAppList.removeIf(AppLabelPredicate.getInstance(context)); if (mRestrictAppList.isEmpty()) { mState = StateType.INVISIBLE; } diff --git a/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java b/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java index 1a7fe229cc5..388e16c3817 100644 --- a/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java +++ b/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java @@ -17,7 +17,6 @@ package com.android.settings.inputmethod; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -43,6 +42,7 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import java.util.ArrayList; import java.util.Collections; +import androidx.appcompat.app.AlertDialog; import androidx.loader.app.LoaderManager.LoaderCallbacks; import androidx.loader.content.AsyncTaskLoader; import androidx.loader.content.Loader; diff --git a/src/com/android/settings/inputmethod/SpellCheckersSettings.java b/src/com/android/settings/inputmethod/SpellCheckersSettings.java index 1a828ce506d..c8eb1099295 100644 --- a/src/com/android/settings/inputmethod/SpellCheckersSettings.java +++ b/src/com/android/settings/inputmethod/SpellCheckersSettings.java @@ -16,7 +16,6 @@ package com.android.settings.inputmethod; -import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.pm.ApplicationInfo; @@ -35,6 +34,7 @@ import com.android.settings.SettingsPreferenceFragment; import com.android.settings.widget.SwitchBar; import com.android.settings.widget.SwitchBar.OnSwitchChangeListener; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceChangeListener; import androidx.preference.Preference.OnPreferenceClickListener; diff --git a/src/com/android/settings/localepicker/LocaleListEditor.java b/src/com/android/settings/localepicker/LocaleListEditor.java index cbcb1eb1a07..dada1c88dc8 100644 --- a/src/com/android/settings/localepicker/LocaleListEditor.java +++ b/src/com/android/settings/localepicker/LocaleListEditor.java @@ -19,7 +19,6 @@ package com.android.settings.localepicker; import static android.os.UserManager.DISALLOW_CONFIG_LOCALE; import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; @@ -42,6 +41,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; +import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.RecyclerView; /** diff --git a/src/com/android/settings/location/AppSettingsInjector.java b/src/com/android/settings/location/AppSettingsInjector.java new file mode 100644 index 00000000000..6b79a7e0962 --- /dev/null +++ b/src/com/android/settings/location/AppSettingsInjector.java @@ -0,0 +1,46 @@ +/* + * 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.location; + +import android.content.Context; +import android.text.TextUtils; + +import androidx.preference.Preference; + +import com.android.settings.widget.AppPreference; +import com.android.settings.widget.RestrictedAppPreference; +import com.android.settingslib.location.InjectedSetting; +import com.android.settingslib.location.SettingsInjector; + +import java.util.List; + +/** + * Adds the preferences specified by the {@link InjectedSetting} objects to a preference group. + */ +public class AppSettingsInjector extends SettingsInjector { + + public AppSettingsInjector(Context context) { + super(context); + } + + @Override + protected Preference createPreference(Context prefContext, InjectedSetting setting) { + return TextUtils.isEmpty(setting.userRestriction) + ? new AppPreference(prefContext) + : new RestrictedAppPreference(prefContext, setting.userRestriction); + } +} diff --git a/src/com/android/settings/location/InjectedSetting.java b/src/com/android/settings/location/InjectedSetting.java deleted file mode 100644 index 4877cb4d581..00000000000 --- a/src/com/android/settings/location/InjectedSetting.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (C) 2013 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.location; - -import android.content.Intent; -import android.os.UserHandle; -import android.text.TextUtils; -import android.util.Log; - -import com.android.internal.annotations.Immutable; - -import java.util.Objects; - -/** - * Specifies a setting that is being injected into Settings > Location > Location services. - * - * @see android.location.SettingInjectorService - */ -@Immutable -class InjectedSetting { - - /** - * Package for the subclass of {@link android.location.SettingInjectorService} and for the - * settings activity. - */ - public final String packageName; - - /** - * Class name for the subclass of {@link android.location.SettingInjectorService} that - * specifies dynamic values for the location setting. - */ - public final String className; - - /** - * The {@link androidx.preference.Preference#getTitle()} value. - */ - public final String title; - - /** - * The {@link androidx.preference.Preference#getIcon()} value. - */ - public final int iconId; - - /** - * The user/profile associated with this setting (e.g. managed profile) - */ - public final UserHandle mUserHandle; - - /** - * The activity to launch to allow the user to modify the settings value. Assumed to be in the - * {@link #packageName} package. - */ - public final String settingsActivity; - - /** - * The user restriction associated with this setting. - */ - public final String userRestriction; - - private InjectedSetting(Builder builder) { - this.packageName = builder.mPackageName; - this.className = builder.mClassName; - this.title = builder.mTitle; - this.iconId = builder.mIconId; - this.mUserHandle = builder.mUserHandle; - this.settingsActivity = builder.mSettingsActivity; - this.userRestriction = builder.mUserRestriction; - } - - @Override - public String toString() { - return "InjectedSetting{" + - "mPackageName='" + packageName + '\'' + - ", mClassName='" + className + '\'' + - ", label=" + title + - ", iconId=" + iconId + - ", userId=" + mUserHandle.getIdentifier() + - ", settingsActivity='" + settingsActivity + '\'' + - ", userRestriction='" + userRestriction + - '}'; - } - - /** - * Returns the intent to start the {@link #className} service. - */ - public Intent getServiceIntent() { - Intent intent = new Intent(); - intent.setClassName(packageName, className); - return intent; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof InjectedSetting)) return false; - - InjectedSetting that = (InjectedSetting) o; - - return Objects.equals(packageName, that.packageName) - && Objects.equals(className, that.className) - && Objects.equals(title, that.title) - && Objects.equals(iconId, that.iconId) - && Objects.equals(mUserHandle, that.mUserHandle) - && Objects.equals(settingsActivity, that.settingsActivity) - && Objects.equals(userRestriction, that.userRestriction); - } - - @Override - public int hashCode() { - int result = packageName.hashCode(); - result = 31 * result + className.hashCode(); - result = 31 * result + title.hashCode(); - result = 31 * result + iconId; - result = 31 * result + (mUserHandle == null ? 0 : mUserHandle.hashCode()); - result = 31 * result + settingsActivity.hashCode(); - result = 31 * result + (userRestriction == null ? 0 : userRestriction.hashCode()); - return result; - } - - public static class Builder { - private String mPackageName; - private String mClassName; - private String mTitle; - private int mIconId; - private UserHandle mUserHandle; - private String mSettingsActivity; - private String mUserRestriction; - - public Builder setPackageName(String packageName) { - mPackageName = packageName; - return this; - } - - public Builder setClassName(String className) { - mClassName = className; - return this; - } - - public Builder setTitle(String title) { - mTitle = title; - return this; - } - - public Builder setIconId(int iconId) { - mIconId = iconId; - return this; - } - - public Builder setUserHandle(UserHandle userHandle) { - mUserHandle = userHandle; - return this; - } - - public Builder setSettingsActivity(String settingsActivity) { - mSettingsActivity = settingsActivity; - return this; - } - - public Builder setUserRestriction(String userRestriction) { - mUserRestriction = userRestriction; - return this; - } - - public InjectedSetting build() { - if (mPackageName == null || mClassName == null || TextUtils.isEmpty(mTitle) - || TextUtils.isEmpty(mSettingsActivity)) { - if (Log.isLoggable(SettingsInjector.TAG, Log.WARN)) { - Log.w(SettingsInjector.TAG, "Illegal setting specification: package=" - + mPackageName + ", class=" + mClassName - + ", title=" + mTitle + ", settingsActivity=" + mSettingsActivity); - } - return null; - } - return new InjectedSetting(this); - } - } -} diff --git a/src/com/android/settings/location/LocationServicePreferenceController.java b/src/com/android/settings/location/LocationServicePreferenceController.java index 67ec1526a0d..035faad16c9 100644 --- a/src/com/android/settings/location/LocationServicePreferenceController.java +++ b/src/com/android/settings/location/LocationServicePreferenceController.java @@ -47,19 +47,19 @@ public class LocationServicePreferenceController extends LocationBasePreferenceC private PreferenceCategory mCategoryLocationServices; private final LocationSettings mFragment; - private final SettingsInjector mInjector; + private final AppSettingsInjector mInjector; /** Receives UPDATE_INTENT */ @VisibleForTesting BroadcastReceiver mInjectedSettingsReceiver; public LocationServicePreferenceController(Context context, LocationSettings fragment, Lifecycle lifecycle) { - this(context, fragment, lifecycle, new SettingsInjector(context)); + this(context, fragment, lifecycle, new AppSettingsInjector(context)); } @VisibleForTesting LocationServicePreferenceController(Context context, LocationSettings fragment, - Lifecycle lifecycle, SettingsInjector injector) { + Lifecycle lifecycle, AppSettingsInjector injector) { super(context, lifecycle); mFragment = fragment; mInjector = injector; diff --git a/src/com/android/settings/location/SettingsInjector.java b/src/com/android/settings/location/SettingsInjector.java deleted file mode 100644 index 1206e85c9d5..00000000000 --- a/src/com/android/settings/location/SettingsInjector.java +++ /dev/null @@ -1,577 +0,0 @@ -/* - * Copyright (C) 2013 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.location; - -import android.app.ActivityManager; -import android.content.Context; -import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageItemInfo; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.content.pm.ServiceInfo; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.content.res.XmlResourceParser; -import android.graphics.drawable.Drawable; -import android.location.SettingInjectorService; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.os.Messenger; -import android.os.SystemClock; -import android.os.UserHandle; -import android.os.UserManager; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.util.IconDrawableFactory; -import android.util.Log; -import android.util.Xml; - -import com.android.settings.widget.AppPreference; -import com.android.settings.widget.RestrictedAppPreference; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import androidx.preference.Preference; - -/** - * Adds the preferences specified by the {@link InjectedSetting} objects to a preference group. - * - * Duplicates some code from {@link android.content.pm.RegisteredServicesCache}. We do not use that - * class directly because it is not a good match for our use case: we do not need the caching, and - * so do not want the additional resource hit at app install/upgrade time; and we would have to - * suppress the tie-breaking between multiple services reporting settings with the same name. - * Code-sharing would require extracting {@link - * android.content.pm.RegisteredServicesCache#parseServiceAttributes(android.content.res.Resources, - * String, android.util.AttributeSet)} into an interface, which didn't seem worth it. - */ -class SettingsInjector { - static final String TAG = "SettingsInjector"; - - /** - * If reading the status of a setting takes longer than this, we go ahead and start reading - * the next setting. - */ - private static final long INJECTED_STATUS_UPDATE_TIMEOUT_MILLIS = 1000; - - /** - * {@link Message#what} value for starting to load status values - * in case we aren't already in the process of loading them. - */ - private static final int WHAT_RELOAD = 1; - - /** - * {@link Message#what} value sent after receiving a status message. - */ - private static final int WHAT_RECEIVED_STATUS = 2; - - /** - * {@link Message#what} value sent after the timeout waiting for a status message. - */ - private static final int WHAT_TIMEOUT = 3; - - private final Context mContext; - - /** - * The settings that were injected - */ - private final Set mSettings; - - private final Handler mHandler; - - public SettingsInjector(Context context) { - mContext = context; - mSettings = new HashSet(); - mHandler = new StatusLoadingHandler(); - } - - /** - * Returns a list for a profile with one {@link InjectedSetting} object for each - * {@link android.app.Service} that responds to - * {@link SettingInjectorService#ACTION_SERVICE_INTENT} and provides the expected setting - * metadata. - * - * Duplicates some code from {@link android.content.pm.RegisteredServicesCache}. - * - * TODO: unit test - */ - private List getSettings(final UserHandle userHandle) { - PackageManager pm = mContext.getPackageManager(); - Intent intent = new Intent(SettingInjectorService.ACTION_SERVICE_INTENT); - - final int profileId = userHandle.getIdentifier(); - List resolveInfos = - pm.queryIntentServicesAsUser(intent, PackageManager.GET_META_DATA, profileId); - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Found services for profile id " + profileId + ": " + resolveInfos); - } - List settings = new ArrayList(resolveInfos.size()); - for (ResolveInfo resolveInfo : resolveInfos) { - try { - InjectedSetting setting = parseServiceInfo(resolveInfo, userHandle, pm); - if (setting == null) { - Log.w(TAG, "Unable to load service info " + resolveInfo); - } else { - settings.add(setting); - } - } catch (XmlPullParserException e) { - Log.w(TAG, "Unable to load service info " + resolveInfo, e); - } catch (IOException e) { - Log.w(TAG, "Unable to load service info " + resolveInfo, e); - } - } - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Loaded settings for profile id " + profileId + ": " + settings); - } - - return settings; - } - - /** - * Returns the settings parsed from the attributes of the - * {@link SettingInjectorService#META_DATA_NAME} tag, or null. - * - * Duplicates some code from {@link android.content.pm.RegisteredServicesCache}. - */ - private static InjectedSetting parseServiceInfo(ResolveInfo service, UserHandle userHandle, - PackageManager pm) throws XmlPullParserException, IOException { - - ServiceInfo si = service.serviceInfo; - ApplicationInfo ai = si.applicationInfo; - - if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { - if (Log.isLoggable(TAG, Log.WARN)) { - Log.w(TAG, "Ignoring attempt to inject setting from app not in system image: " - + service); - return null; - } - } - - XmlResourceParser parser = null; - try { - parser = si.loadXmlMetaData(pm, SettingInjectorService.META_DATA_NAME); - if (parser == null) { - throw new XmlPullParserException("No " + SettingInjectorService.META_DATA_NAME - + " meta-data for " + service + ": " + si); - } - - AttributeSet attrs = Xml.asAttributeSet(parser); - - int type; - while ((type = parser.next()) != XmlPullParser.END_DOCUMENT - && type != XmlPullParser.START_TAG) { - } - - String nodeName = parser.getName(); - if (!SettingInjectorService.ATTRIBUTES_NAME.equals(nodeName)) { - throw new XmlPullParserException("Meta-data does not start with " - + SettingInjectorService.ATTRIBUTES_NAME + " tag"); - } - - Resources res = pm.getResourcesForApplicationAsUser(si.packageName, - userHandle.getIdentifier()); - return parseAttributes(si.packageName, si.name, userHandle, res, attrs); - } catch (PackageManager.NameNotFoundException e) { - throw new XmlPullParserException( - "Unable to load resources for package " + si.packageName); - } finally { - if (parser != null) { - parser.close(); - } - } - } - - /** - * Returns an immutable representation of the static attributes for the setting, or null. - */ - private static InjectedSetting parseAttributes(String packageName, String className, - UserHandle userHandle, Resources res, AttributeSet attrs) { - - TypedArray sa = res.obtainAttributes(attrs, android.R.styleable.SettingInjectorService); - try { - // Note that to help guard against malicious string injection, we do not allow dynamic - // specification of the label (setting title) - final String title = sa.getString(android.R.styleable.SettingInjectorService_title); - final int iconId = - sa.getResourceId(android.R.styleable.SettingInjectorService_icon, 0); - final String settingsActivity = - sa.getString(android.R.styleable.SettingInjectorService_settingsActivity); - final String userRestriction = sa.getString( - android.R.styleable.SettingInjectorService_userRestriction); - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "parsed title: " + title + ", iconId: " + iconId - + ", settingsActivity: " + settingsActivity); - } - return new InjectedSetting.Builder() - .setPackageName(packageName) - .setClassName(className) - .setTitle(title) - .setIconId(iconId) - .setUserHandle(userHandle) - .setSettingsActivity(settingsActivity) - .setUserRestriction(userRestriction) - .build(); - } finally { - sa.recycle(); - } - } - - /** - * Gets a list of preferences that other apps have injected. - * - * @param profileId Identifier of the user/profile to obtain the injected settings for or - * UserHandle.USER_CURRENT for all profiles associated with current user. - */ - public List getInjectedSettings(Context prefContext, final int profileId) { - final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); - final List profiles = um.getUserProfiles(); - ArrayList prefs = new ArrayList<>(); - final int profileCount = profiles.size(); - for (int i = 0; i < profileCount; ++i) { - final UserHandle userHandle = profiles.get(i); - if (profileId == UserHandle.USER_CURRENT || profileId == userHandle.getIdentifier()) { - Iterable settings = getSettings(userHandle); - for (InjectedSetting setting : settings) { - Preference pref = addServiceSetting(prefContext, prefs, setting); - mSettings.add(new Setting(setting, pref)); - } - } - } - - reloadStatusMessages(); - - return prefs; - } - - /** - * Checks wheteher there is any preference that other apps have injected. - * - * @param profileId Identifier of the user/profile to obtain the injected settings for or - * UserHandle.USER_CURRENT for all profiles associated with current user. - */ - public boolean hasInjectedSettings(final int profileId) { - final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); - final List profiles = um.getUserProfiles(); - final int profileCount = profiles.size(); - for (int i = 0; i < profileCount; ++i) { - final UserHandle userHandle = profiles.get(i); - if (profileId == UserHandle.USER_CURRENT || profileId == userHandle.getIdentifier()) { - Iterable settings = getSettings(userHandle); - for (InjectedSetting setting : settings) { - return true; - } - } - } - return false; - } - - /** - * Reloads the status messages for all the preference items. - */ - public void reloadStatusMessages() { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "reloadingStatusMessages: " + mSettings); - } - mHandler.sendMessage(mHandler.obtainMessage(WHAT_RELOAD)); - } - - /** - * Adds an injected setting to the root. - */ - private Preference addServiceSetting(Context prefContext, List prefs, - InjectedSetting info) { - final PackageManager pm = mContext.getPackageManager(); - Drawable appIcon = null; - try { - final PackageItemInfo itemInfo = new PackageItemInfo(); - itemInfo.icon = info.iconId; - itemInfo.packageName = info.packageName; - final ApplicationInfo appInfo = pm.getApplicationInfo(info.packageName, - PackageManager.GET_META_DATA); - appIcon = IconDrawableFactory.newInstance(mContext) - .getBadgedIcon(itemInfo, appInfo, info.mUserHandle.getIdentifier()); - } catch (PackageManager.NameNotFoundException e) { - Log.e(TAG, "Can't get ApplicationInfo for " + info.packageName, e); - } - Preference pref = TextUtils.isEmpty(info.userRestriction) - ? new AppPreference(prefContext) - : new RestrictedAppPreference(prefContext, info.userRestriction); - pref.setTitle(info.title); - pref.setSummary(null); - pref.setIcon(appIcon); - pref.setOnPreferenceClickListener(new ServiceSettingClickedListener(info)); - prefs.add(pref); - return pref; - } - - private class ServiceSettingClickedListener - implements Preference.OnPreferenceClickListener { - private InjectedSetting mInfo; - - public ServiceSettingClickedListener(InjectedSetting info) { - mInfo = info; - } - - @Override - public boolean onPreferenceClick(Preference preference) { - // Activity to start if they click on the preference. Must start in new task to ensure - // that "android.settings.LOCATION_SOURCE_SETTINGS" brings user back to - // Settings > Location. - Intent settingIntent = new Intent(); - settingIntent.setClassName(mInfo.packageName, mInfo.settingsActivity); - // Sometimes the user may navigate back to "Settings" and launch another different - // injected setting after one injected setting has been launched. - // - // FLAG_ACTIVITY_CLEAR_TOP allows multiple Activities to stack on each other. When - // "back" button is clicked, the user will navigate through all the injected settings - // launched before. Such behavior could be quite confusing sometimes. - // - // In order to avoid such confusion, we use FLAG_ACTIVITY_CLEAR_TASK, which always clear - // up all existing injected settings and make sure that "back" button always brings the - // user back to "Settings" directly. - settingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - mContext.startActivityAsUser(settingIntent, mInfo.mUserHandle); - return true; - } - } - - /** - * Loads the setting status values one at a time. Each load starts a subclass of {@link - * SettingInjectorService}, so to reduce memory pressure we don't want to load too many at - * once. - */ - private final class StatusLoadingHandler extends Handler { - - /** - * Settings whose status values need to be loaded. A set is used to prevent redundant loads. - */ - private Set mSettingsToLoad = new HashSet(); - - /** - * Settings that are being loaded now and haven't timed out. In practice this should have - * zero or one elements. - */ - private Set mSettingsBeingLoaded = new HashSet(); - - /** - * Settings that are being loaded but have timed out. If only one setting has timed out, we - * will go ahead and start loading the next setting so that one slow load won't delay the - * load of the other settings. - */ - private Set mTimedOutSettings = new HashSet(); - - private boolean mReloadRequested; - - private StatusLoadingHandler() { - super(Looper.getMainLooper()); - } - @Override - public void handleMessage(Message msg) { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "handleMessage start: " + msg + ", " + this); - } - - // Update state in response to message - switch (msg.what) { - case WHAT_RELOAD: - mReloadRequested = true; - break; - case WHAT_RECEIVED_STATUS: - final Setting receivedSetting = (Setting) msg.obj; - receivedSetting.maybeLogElapsedTime(); - mSettingsBeingLoaded.remove(receivedSetting); - mTimedOutSettings.remove(receivedSetting); - removeMessages(WHAT_TIMEOUT, receivedSetting); - break; - case WHAT_TIMEOUT: - final Setting timedOutSetting = (Setting) msg.obj; - mSettingsBeingLoaded.remove(timedOutSetting); - mTimedOutSettings.add(timedOutSetting); - if (Log.isLoggable(TAG, Log.WARN)) { - Log.w(TAG, "Timed out after " + timedOutSetting.getElapsedTime() - + " millis trying to get status for: " + timedOutSetting); - } - break; - default: - Log.wtf(TAG, "Unexpected what: " + msg); - } - - // Decide whether to load additional settings based on the new state. Start by seeing - // if we have headroom to load another setting. - if (mSettingsBeingLoaded.size() > 0 || mTimedOutSettings.size() > 1) { - // Don't load any more settings until one of the pending settings has completed. - // To reduce memory pressure, we want to be loading at most one setting (plus at - // most one timed-out setting) at a time. This means we'll be responsible for - // bringing in at most two services. - if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, "too many services already live for " + msg + ", " + this); - } - return; - } - - if (mReloadRequested && mSettingsToLoad.isEmpty() && mSettingsBeingLoaded.isEmpty() - && mTimedOutSettings.isEmpty()) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, "reloading because idle and reload requesteed " + msg + ", " + this); - } - // Reload requested, so must reload all settings - mSettingsToLoad.addAll(mSettings); - mReloadRequested = false; - } - - // Remove the next setting to load from the queue, if any - Iterator iter = mSettingsToLoad.iterator(); - if (!iter.hasNext()) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, "nothing left to do for " + msg + ", " + this); - } - return; - } - Setting setting = iter.next(); - iter.remove(); - - // Request the status value - setting.startService(); - mSettingsBeingLoaded.add(setting); - - // Ensure that if receiving the status value takes too long, we start loading the - // next value anyway - Message timeoutMsg = obtainMessage(WHAT_TIMEOUT, setting); - sendMessageDelayed(timeoutMsg, INJECTED_STATUS_UPDATE_TIMEOUT_MILLIS); - - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "handleMessage end " + msg + ", " + this - + ", started loading " + setting); - } - } - - @Override - public String toString() { - return "StatusLoadingHandler{" + - "mSettingsToLoad=" + mSettingsToLoad + - ", mSettingsBeingLoaded=" + mSettingsBeingLoaded + - ", mTimedOutSettings=" + mTimedOutSettings + - ", mReloadRequested=" + mReloadRequested + - '}'; - } - } - - /** - * Represents an injected setting and the corresponding preference. - */ - private final class Setting { - - public final InjectedSetting setting; - public final Preference preference; - public long startMillis; - - private Setting(InjectedSetting setting, Preference preference) { - this.setting = setting; - this.preference = preference; - } - - @Override - public String toString() { - return "Setting{" + - "setting=" + setting + - ", preference=" + preference + - '}'; - } - - /** - * Returns true if they both have the same {@link #setting} value. Ignores mutable - * {@link #preference} and {@link #startMillis} so that it's safe to use in sets. - */ - @Override - public boolean equals(Object o) { - return this == o || o instanceof Setting && setting.equals(((Setting) o).setting); - } - - @Override - public int hashCode() { - return setting.hashCode(); - } - - /** - * Starts the service to fetch for the current status for the setting, and updates the - * preference when the service replies. - */ - public void startService() { - final ActivityManager am = (ActivityManager) - mContext.getSystemService(Context.ACTIVITY_SERVICE); - if (!am.isUserRunning(setting.mUserHandle.getIdentifier())) { - if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, "Cannot start service as user " - + setting.mUserHandle.getIdentifier() + " is not running"); - } - return; - } - Handler handler = new Handler() { - @Override - public void handleMessage(Message msg) { - Bundle bundle = msg.getData(); - boolean enabled = bundle.getBoolean(SettingInjectorService.ENABLED_KEY, true); - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, setting + ": received " + msg + ", bundle: " + bundle); - } - preference.setSummary(null); - preference.setEnabled(enabled); - mHandler.sendMessage( - mHandler.obtainMessage(WHAT_RECEIVED_STATUS, Setting.this)); - } - }; - Messenger messenger = new Messenger(handler); - - Intent intent = setting.getServiceIntent(); - intent.putExtra(SettingInjectorService.MESSENGER_KEY, messenger); - - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, setting + ": sending update intent: " + intent - + ", handler: " + handler); - startMillis = SystemClock.elapsedRealtime(); - } else { - startMillis = 0; - } - - // Start the service, making sure that this is attributed to the user associated with - // the setting rather than the system user. - mContext.startServiceAsUser(intent, setting.mUserHandle); - } - - public long getElapsedTime() { - long end = SystemClock.elapsedRealtime(); - return end - startMillis; - } - - public void maybeLogElapsedTime() { - if (Log.isLoggable(TAG, Log.DEBUG) && startMillis != 0) { - long elapsed = getElapsedTime(); - Log.d(TAG, this + " update took " + elapsed + " millis"); - } - } - } -} diff --git a/src/com/android/settings/network/ApnEditor.java b/src/com/android/settings/network/ApnEditor.java index 3b4189bc56b..91a094f8179 100644 --- a/src/com/android/settings/network/ApnEditor.java +++ b/src/com/android/settings/network/ApnEditor.java @@ -18,7 +18,6 @@ package com.android.settings.network; import static android.content.Context.TELEPHONY_SERVICE; -import android.app.AlertDialog; import android.app.Dialog; import android.content.ContentValues; import android.content.Context; @@ -55,6 +54,7 @@ import java.util.List; import java.util.Set; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.preference.EditTextPreference; import androidx.preference.ListPreference; import androidx.preference.MultiSelectListPreference; diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java index 31a8435652f..27e1a98aa71 100644 --- a/src/com/android/settings/network/NetworkDashboardFragment.java +++ b/src/com/android/settings/network/NetworkDashboardFragment.java @@ -19,7 +19,6 @@ import static com.android.settings.network.MobilePlanPreferenceController .MANAGE_MOBILE_PLAN_DIALOG_ID; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.icu.text.ListFormatter; @@ -44,6 +43,7 @@ import java.util.Arrays; import java.util.List; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; @SearchIndexable diff --git a/src/com/android/settings/notification/NotificationAccessSettings.java b/src/com/android/settings/notification/NotificationAccessSettings.java index ad721ba750c..9bfbd2c5b9f 100644 --- a/src/com/android/settings/notification/NotificationAccessSettings.java +++ b/src/com/android/settings/notification/NotificationAccessSettings.java @@ -16,7 +16,6 @@ package com.android.settings.notification; -import android.app.AlertDialog; import android.app.Dialog; import android.app.NotificationManager; import android.content.ComponentName; @@ -42,6 +41,7 @@ import java.util.ArrayList; import java.util.List; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; /** diff --git a/src/com/android/settings/notification/NotificationLockscreenPreference.java b/src/com/android/settings/notification/NotificationLockscreenPreference.java index af912af3f60..3370f3ec785 100644 --- a/src/com/android/settings/notification/NotificationLockscreenPreference.java +++ b/src/com/android/settings/notification/NotificationLockscreenPreference.java @@ -16,7 +16,6 @@ package com.android.settings.notification; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -36,6 +35,7 @@ import com.android.settings.RestrictedListPreference; import com.android.settings.Utils; import com.android.settingslib.RestrictedLockUtils; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog.Builder; public class NotificationLockscreenPreference extends RestrictedListPreference { diff --git a/src/com/android/settings/notification/WorkSoundPreferenceController.java b/src/com/android/settings/notification/WorkSoundPreferenceController.java index 44796f8e132..26cd8aa13b8 100644 --- a/src/com/android/settings/notification/WorkSoundPreferenceController.java +++ b/src/com/android/settings/notification/WorkSoundPreferenceController.java @@ -17,7 +17,6 @@ package com.android.settings.notification; import android.annotation.UserIdInt; -import android.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; @@ -47,6 +46,7 @@ import com.android.settingslib.core.lifecycle.events.OnResume; import java.util.List; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentManager; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceChangeListener; diff --git a/src/com/android/settings/notification/ZenAccessSettings.java b/src/com/android/settings/notification/ZenAccessSettings.java index 4af81586b56..2e4bb4e6a43 100644 --- a/src/com/android/settings/notification/ZenAccessSettings.java +++ b/src/com/android/settings/notification/ZenAccessSettings.java @@ -18,7 +18,6 @@ package com.android.settings.notification; import android.annotation.Nullable; import android.app.ActivityManager; -import android.app.AlertDialog; import android.app.AppGlobals; import android.app.Dialog; import android.app.NotificationManager; @@ -58,6 +57,7 @@ import java.util.Collections; import java.util.List; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceChangeListener; import androidx.preference.PreferenceScreen; diff --git a/src/com/android/settings/notification/ZenDeleteRuleDialog.java b/src/com/android/settings/notification/ZenDeleteRuleDialog.java index 2783e3b3ce1..c460d84237d 100644 --- a/src/com/android/settings/notification/ZenDeleteRuleDialog.java +++ b/src/com/android/settings/notification/ZenDeleteRuleDialog.java @@ -16,7 +16,6 @@ package com.android.settings.notification; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; @@ -26,6 +25,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; public class ZenDeleteRuleDialog extends InstrumentedDialogFragment { diff --git a/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java b/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java index 56f9081e745..3cfd13d1540 100644 --- a/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java +++ b/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java @@ -16,7 +16,6 @@ package com.android.settings.notification; -import android.app.AlertDialog; import android.app.AutomaticZenRule; import android.app.Dialog; import android.app.TimePickerDialog; @@ -42,6 +41,7 @@ import java.util.Arrays; import java.util.Calendar; import java.util.List; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentManager; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceClickListener; diff --git a/src/com/android/settings/notification/ZenRuleNameDialog.java b/src/com/android/settings/notification/ZenRuleNameDialog.java index 43144546271..62c83cd563e 100644 --- a/src/com/android/settings/notification/ZenRuleNameDialog.java +++ b/src/com/android/settings/notification/ZenRuleNameDialog.java @@ -16,7 +16,6 @@ package com.android.settings.notification; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -32,6 +31,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; public class ZenRuleNameDialog extends InstrumentedDialogFragment { diff --git a/src/com/android/settings/notification/ZenRuleSelectionDialog.java b/src/com/android/settings/notification/ZenRuleSelectionDialog.java index 40b79f78a7a..b1a3939b98c 100644 --- a/src/com/android/settings/notification/ZenRuleSelectionDialog.java +++ b/src/com/android/settings/notification/ZenRuleSelectionDialog.java @@ -18,7 +18,6 @@ package com.android.settings.notification; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import android.app.AlertDialog; import android.app.Dialog; import android.app.NotificationManager; import android.content.Context; @@ -47,6 +46,7 @@ import java.util.Comparator; import java.util.Set; import java.util.TreeSet; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; public class ZenRuleSelectionDialog extends InstrumentedDialogFragment { diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index 3e478d1e3f5..3dc40683dde 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -23,7 +23,6 @@ import static com.android.settings.password.ChooseLockPassword.ChooseLockPasswor import android.accessibilityservice.AccessibilityServiceInfo; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.content.Context; @@ -63,6 +62,7 @@ import java.util.List; import androidx.annotation.StringRes; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.preference.Preference; diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java index fc1fab0218e..0f6eeb3bb63 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java @@ -20,7 +20,6 @@ package com.android.settings.password; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityOptions; -import android.app.AlertDialog; import android.app.Dialog; import android.app.IActivityManager; import android.app.KeyguardManager; @@ -53,6 +52,7 @@ import com.android.settings.Utils; import com.android.settings.biometrics.fingerprint.FingerprintUiHelper; import com.android.settings.core.InstrumentedFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentManager; diff --git a/src/com/android/settings/password/SetupSkipDialog.java b/src/com/android/settings/password/SetupSkipDialog.java index 98a2482ab12..c93d12d0160 100644 --- a/src/com/android/settings/password/SetupSkipDialog.java +++ b/src/com/android/settings/password/SetupSkipDialog.java @@ -17,7 +17,6 @@ package com.android.settings.password; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; @@ -27,6 +26,7 @@ import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentManager; public class SetupSkipDialog extends InstrumentedDialogFragment diff --git a/src/com/android/settings/security/ConfigureKeyGuardDialog.java b/src/com/android/settings/security/ConfigureKeyGuardDialog.java index 3bcfb89ce5c..f09e077ce96 100644 --- a/src/com/android/settings/security/ConfigureKeyGuardDialog.java +++ b/src/com/android/settings/security/ConfigureKeyGuardDialog.java @@ -17,7 +17,6 @@ package com.android.settings.security; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.content.DialogInterface; @@ -31,6 +30,7 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.password.ChooseLockGeneric; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; /** * Prompt for key guard configuration confirmation. diff --git a/src/com/android/settings/security/CryptKeeperSettings.java b/src/com/android/settings/security/CryptKeeperSettings.java index 97669114678..b7c5db79a2a 100644 --- a/src/com/android/settings/security/CryptKeeperSettings.java +++ b/src/com/android/settings/security/CryptKeeperSettings.java @@ -17,7 +17,6 @@ package com.android.settings.security; import android.app.Activity; -import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.Context; @@ -42,6 +41,7 @@ import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.password.ConfirmLockPattern; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; public class CryptKeeperSettings extends InstrumentedPreferenceFragment { diff --git a/src/com/android/settings/security/LockscreenDashboardFragment.java b/src/com/android/settings/security/LockscreenDashboardFragment.java index e2147209eac..71130ea5350 100644 --- a/src/com/android/settings/security/LockscreenDashboardFragment.java +++ b/src/com/android/settings/security/LockscreenDashboardFragment.java @@ -19,6 +19,8 @@ package com.android.settings.security; import android.content.Context; import android.provider.SearchIndexableResource; +import androidx.annotation.VisibleForTesting; + import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; @@ -29,6 +31,7 @@ import com.android.settings.gestures.DoubleTapScreenPreferenceController; import com.android.settings.gestures.PickupGesturePreferenceController; import com.android.settings.notification.LockScreenNotificationPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.security.screenlock.LockScreenPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.search.SearchIndexable; @@ -37,8 +40,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import androidx.annotation.VisibleForTesting; - /** * Settings screen for lock screen preference */ @@ -157,5 +158,11 @@ public class LockscreenDashboardFragment extends DashboardFragment niks.add(KEY_LOCK_SCREEN_NOTIFICATON_WORK_PROFILE_HEADER); return niks; } + + @Override + protected boolean isPageSearchEnabled(Context context) { + return new LockScreenPreferenceController(context, "anykey") + .isAvailable(); + } }; } diff --git a/src/com/android/settings/security/UnificationConfirmationDialog.java b/src/com/android/settings/security/UnificationConfirmationDialog.java index f82ece6def1..e862bd016fd 100644 --- a/src/com/android/settings/security/UnificationConfirmationDialog.java +++ b/src/com/android/settings/security/UnificationConfirmationDialog.java @@ -16,7 +16,6 @@ package com.android.settings.security; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; @@ -25,6 +24,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentManager; public class UnificationConfirmationDialog extends InstrumentedDialogFragment { diff --git a/src/com/android/settings/sim/SimDialogActivity.java b/src/com/android/settings/sim/SimDialogActivity.java index 853f80dc813..803e1cf36fb 100644 --- a/src/com/android/settings/sim/SimDialogActivity.java +++ b/src/com/android/settings/sim/SimDialogActivity.java @@ -17,7 +17,6 @@ package com.android.settings.sim; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -45,6 +44,8 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import androidx.appcompat.app.AlertDialog; + public class SimDialogActivity extends Activity { private static String TAG = "SimDialogActivity"; diff --git a/src/com/android/settings/sim/SimPreferenceDialog.java b/src/com/android/settings/sim/SimPreferenceDialog.java index 2b6ebe3b2e5..a657a6bfca4 100644 --- a/src/com/android/settings/sim/SimPreferenceDialog.java +++ b/src/com/android/settings/sim/SimPreferenceDialog.java @@ -16,7 +16,6 @@ package com.android.settings.sim; import android.app.Activity; -import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; @@ -42,6 +41,8 @@ import android.widget.TextView; import com.android.settings.R; import com.android.settings.Utils; +import androidx.appcompat.app.AlertDialog; + public class SimPreferenceDialog extends Activity { private Context mContext; diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java index da705c94dd6..f6c08ce349c 100644 --- a/src/com/android/settings/slices/SettingsSliceProvider.java +++ b/src/com/android/settings/slices/SettingsSliceProvider.java @@ -32,15 +32,15 @@ import android.util.KeyValueListParser; import android.util.Log; import android.util.Pair; +import com.android.settings.bluetooth.BluetoothSliceBuilder; +import com.android.settings.core.BasePreferenceController; import com.android.settings.flashlight.FlashlightSliceBuilder; import com.android.settings.location.LocationSliceBuilder; import com.android.settings.mobilenetwork.Enhanced4gLteSliceHelper; import com.android.settings.notification.ZenModeSliceBuilder; import com.android.settings.overlay.FeatureFactory; -import com.android.settings.core.BasePreferenceController; import com.android.settings.wifi.WifiSliceBuilder; import com.android.settings.wifi.calling.WifiCallingSliceHelper; -import com.android.settings.bluetooth.BluetoothSliceBuilder; import com.android.settingslib.SliceBroadcastRelay; import com.android.settingslib.utils.ThreadUtils; diff --git a/src/com/android/settings/tts/TextToSpeechSettings.java b/src/com/android/settings/tts/TextToSpeechSettings.java index c13d12c0993..d21d0c8d056 100644 --- a/src/com/android/settings/tts/TextToSpeechSettings.java +++ b/src/com/android/settings/tts/TextToSpeechSettings.java @@ -20,7 +20,6 @@ import static android.provider.Settings.Secure.TTS_DEFAULT_PITCH; import static android.provider.Settings.Secure.TTS_DEFAULT_RATE; import static android.provider.Settings.Secure.TTS_DEFAULT_SYNTH; -import android.app.AlertDialog; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Context; @@ -57,6 +56,7 @@ import java.util.MissingResourceException; import java.util.Objects; import java.util.Set; +import androidx.appcompat.app.AlertDialog; import androidx.preference.ListPreference; import androidx.preference.Preference; diff --git a/src/com/android/settings/tts/TtsEnginePreference.java b/src/com/android/settings/tts/TtsEnginePreference.java index 84f5b7e337a..41684c58061 100644 --- a/src/com/android/settings/tts/TtsEnginePreference.java +++ b/src/com/android/settings/tts/TtsEnginePreference.java @@ -16,7 +16,6 @@ package com.android.settings.tts; -import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -29,6 +28,7 @@ import android.widget.RadioButton; import com.android.settings.R; import com.android.settings.SettingsActivity; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; diff --git a/src/com/android/settings/users/AutoSyncDataPreferenceController.java b/src/com/android/settings/users/AutoSyncDataPreferenceController.java index 7d840caa6d0..5856f71e1ee 100644 --- a/src/com/android/settings/users/AutoSyncDataPreferenceController.java +++ b/src/com/android/settings/users/AutoSyncDataPreferenceController.java @@ -16,7 +16,6 @@ package com.android.settings.users; import android.app.ActivityManager; -import android.app.AlertDialog; import android.app.Dialog; import android.content.ContentResolver; import android.content.Context; @@ -33,6 +32,7 @@ import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settingslib.core.AbstractPreferenceController; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.preference.Preference; import androidx.preference.SwitchPreference; diff --git a/src/com/android/settings/users/EditUserInfoController.java b/src/com/android/settings/users/EditUserInfoController.java index 072c8cddb2c..604551607a5 100644 --- a/src/com/android/settings/users/EditUserInfoController.java +++ b/src/com/android/settings/users/EditUserInfoController.java @@ -17,7 +17,6 @@ package com.android.settings.users; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; @@ -41,6 +40,7 @@ import com.android.settingslib.drawable.CircleFramedDrawable; import java.io.File; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; /** diff --git a/src/com/android/settings/users/OwnerInfoSettings.java b/src/com/android/settings/users/OwnerInfoSettings.java index 0f99360aa28..7576917fd26 100644 --- a/src/com/android/settings/users/OwnerInfoSettings.java +++ b/src/com/android/settings/users/OwnerInfoSettings.java @@ -16,7 +16,6 @@ package com.android.settings.users; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; @@ -33,6 +32,7 @@ import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.security.OwnerInfoPreferenceController.OwnerInfoCallback; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; public class OwnerInfoSettings extends InstrumentedDialogFragment implements OnClickListener { diff --git a/src/com/android/settings/users/UserDialogs.java b/src/com/android/settings/users/UserDialogs.java index 3ed383a6251..137c938cae4 100644 --- a/src/com/android/settings/users/UserDialogs.java +++ b/src/com/android/settings/users/UserDialogs.java @@ -16,7 +16,6 @@ package com.android.settings.users; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -34,6 +33,8 @@ import android.widget.TextView; import com.android.settings.R; import com.android.settings.Utils; +import androidx.appcompat.app.AlertDialog; + /** * Helper class for displaying dialogs related to user settings. */ diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index 7d84d9903ba..9aa56c234d3 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -18,7 +18,6 @@ package com.android.settings.users; import android.app.Activity; import android.app.ActivityManager; -import android.app.AlertDialog; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; @@ -79,6 +78,7 @@ import java.util.List; import androidx.annotation.VisibleForTesting; import androidx.annotation.WorkerThread; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceScreen; diff --git a/src/com/android/settings/utils/ManagedServiceSettings.java b/src/com/android/settings/utils/ManagedServiceSettings.java index 87c6b8e0da9..e222e569583 100644 --- a/src/com/android/settings/utils/ManagedServiceSettings.java +++ b/src/com/android/settings/utils/ManagedServiceSettings.java @@ -18,7 +18,6 @@ package com.android.settings.utils; import android.annotation.Nullable; import android.app.ActivityManager; -import android.app.AlertDialog; import android.app.Dialog; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; @@ -43,6 +42,7 @@ import com.android.settingslib.applications.ServiceListing; import java.util.List; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; diff --git a/src/com/android/settings/utils/PreferenceGroupChildrenCache.java b/src/com/android/settings/utils/PreferenceGroupChildrenCache.java new file mode 100644 index 00000000000..dcbf4fdfe5c --- /dev/null +++ b/src/com/android/settings/utils/PreferenceGroupChildrenCache.java @@ -0,0 +1,59 @@ +/* + * 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.utils; + +import android.text.TextUtils; +import android.util.ArrayMap; + +import androidx.preference.Preference; +import androidx.preference.PreferenceGroup; + +/** + * Class that helps track which {@link Preference}s in a {@link PreferenceGroup} are still being + * used, and remove unused ones. + */ +public class PreferenceGroupChildrenCache { + + private ArrayMap mPreferenceCache; + + public void cacheRemoveAllPrefs(PreferenceGroup group) { + mPreferenceCache = new ArrayMap<>(); + final int N = group.getPreferenceCount(); + for (int i = 0; i < N; i++) { + Preference p = group.getPreference(i); + if (TextUtils.isEmpty(p.getKey())) { + continue; + } + mPreferenceCache.put(p.getKey(), p); + } + } + + public void removeCachedPrefs(PreferenceGroup group) { + for (Preference p : mPreferenceCache.values()) { + group.removePreference(p); + } + mPreferenceCache = null; + } + + public Preference getCachedPreference(String key) { + return mPreferenceCache != null ? mPreferenceCache.remove(key) : null; + } + + public int getCachedCount() { + return mPreferenceCache != null ? mPreferenceCache.size() : 0; + } +} diff --git a/src/com/android/settings/vpn2/AppDialog.java b/src/com/android/settings/vpn2/AppDialog.java index e41ffefea5e..6641bf3c682 100644 --- a/src/com/android/settings/vpn2/AppDialog.java +++ b/src/com/android/settings/vpn2/AppDialog.java @@ -16,7 +16,6 @@ package com.android.settings.vpn2; -import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.pm.PackageInfo; @@ -24,6 +23,8 @@ import android.os.Bundle; import com.android.settings.R; +import androidx.appcompat.app.AlertDialog; + /** * UI for managing the connection controlled by an app. * diff --git a/src/com/android/settings/vpn2/AppDialogFragment.java b/src/com/android/settings/vpn2/AppDialogFragment.java index 2f7a6bb0f7e..759adbf5348 100644 --- a/src/com/android/settings/vpn2/AppDialogFragment.java +++ b/src/com/android/settings/vpn2/AppDialogFragment.java @@ -16,7 +16,6 @@ package com.android.settings.vpn2; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -34,6 +33,7 @@ import com.android.internal.net.VpnConfig; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; /** diff --git a/src/com/android/settings/vpn2/AppManagementFragment.java b/src/com/android/settings/vpn2/AppManagementFragment.java index 145e86fb4ba..a141919661f 100644 --- a/src/com/android/settings/vpn2/AppManagementFragment.java +++ b/src/com/android/settings/vpn2/AppManagementFragment.java @@ -18,7 +18,6 @@ package com.android.settings.vpn2; import static android.app.AppOpsManager.OP_ACTIVATE_VPN; import android.annotation.NonNull; -import android.app.AlertDialog; import android.app.AppOpsManager; import android.app.Dialog; import android.content.Context; @@ -49,6 +48,7 @@ import com.android.settingslib.RestrictedSwitchPreference; import java.util.List; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; import androidx.preference.Preference; diff --git a/src/com/android/settings/vpn2/ConfigDialog.java b/src/com/android/settings/vpn2/ConfigDialog.java index 4eecd28d22c..376dba7da86 100644 --- a/src/com/android/settings/vpn2/ConfigDialog.java +++ b/src/com/android/settings/vpn2/ConfigDialog.java @@ -16,7 +16,6 @@ package com.android.settings.vpn2; -import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; @@ -39,6 +38,8 @@ import com.android.settings.R; import java.net.InetAddress; +import androidx.appcompat.app.AlertDialog; + /** * Dialog showing information about a VPN configuration. The dialog * can be launched to either edit or prompt for credentials to connect diff --git a/src/com/android/settings/vpn2/ConfigDialogFragment.java b/src/com/android/settings/vpn2/ConfigDialogFragment.java index 00b22bb2fb3..1517bf748b8 100644 --- a/src/com/android/settings/vpn2/ConfigDialogFragment.java +++ b/src/com/android/settings/vpn2/ConfigDialogFragment.java @@ -16,7 +16,6 @@ package com.android.settings.vpn2; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; @@ -38,6 +37,8 @@ import com.android.internal.net.VpnProfile; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; + /** * Fragment wrapper around a {@link ConfigDialog}. */ diff --git a/src/com/android/settings/vpn2/ConfirmLockdownFragment.java b/src/com/android/settings/vpn2/ConfirmLockdownFragment.java index 5c2c9d7b51e..d73e9286fd2 100644 --- a/src/com/android/settings/vpn2/ConfirmLockdownFragment.java +++ b/src/com/android/settings/vpn2/ConfirmLockdownFragment.java @@ -15,7 +15,6 @@ */ package com.android.settings.vpn2; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; @@ -24,6 +23,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; public class ConfirmLockdownFragment extends InstrumentedDialogFragment diff --git a/src/com/android/settings/wfd/WifiDisplaySettings.java b/src/com/android/settings/wfd/WifiDisplaySettings.java index 3d8dbdea986..dbb4e21aebe 100755 --- a/src/com/android/settings/wfd/WifiDisplaySettings.java +++ b/src/com/android/settings/wfd/WifiDisplaySettings.java @@ -16,7 +16,6 @@ package com.android.settings.wfd; -import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -63,6 +62,7 @@ import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; +import androidx.appcompat.app.AlertDialog; import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceChangeListener; diff --git a/src/com/android/settings/widget/SingleTargetGearPreference.java b/src/com/android/settings/widget/SingleTargetGearPreference.java index 8def647ef39..b770b6dd31e 100644 --- a/src/com/android/settings/widget/SingleTargetGearPreference.java +++ b/src/com/android/settings/widget/SingleTargetGearPreference.java @@ -17,13 +17,13 @@ package com.android.settings.widget; import android.content.Context; - -import androidx.core.content.res.TypedArrayUtils; -import androidx.preference.Preference; import android.util.AttributeSet; import com.android.settings.R; +import androidx.core.content.res.TypedArrayUtils; +import androidx.preference.Preference; + /** * A preference with single target and a gear icon on the side. */ diff --git a/src/com/android/settings/widget/VideoPreferenceController.java b/src/com/android/settings/widget/VideoPreferenceController.java new file mode 100644 index 00000000000..457c6dfba22 --- /dev/null +++ b/src/com/android/settings/widget/VideoPreferenceController.java @@ -0,0 +1,64 @@ +/* + * 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.widget; + +import android.content.Context; + +import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnPause; +import com.android.settingslib.core.lifecycle.events.OnResume; + +import androidx.preference.PreferenceScreen; + +public class VideoPreferenceController extends BasePreferenceController implements + LifecycleObserver, OnResume, OnPause { + + private VideoPreference mVideoPreference; + private boolean mVideoPaused; + + public VideoPreferenceController(Context context, String preferenceKey) { + super(context, preferenceKey); + } + + @Override + public int getAvailabilityStatus() { + return AVAILABLE_UNSEARCHABLE; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mVideoPreference = (VideoPreference) screen.findPreference(getPreferenceKey()); + } + + @Override + public void onPause() { + if (mVideoPreference != null) { + mVideoPaused = mVideoPreference.isVideoPaused(); + mVideoPreference.onViewInvisible(); + } + } + + @Override + public void onResume() { + if (mVideoPreference != null) { + mVideoPreference.onViewVisible(mVideoPaused); + } + } + +} diff --git a/src/com/android/settings/wifi/ChangeWifiStateDetails.java b/src/com/android/settings/wifi/ChangeWifiStateDetails.java index fbf0d6360c3..899b35db363 100644 --- a/src/com/android/settings/wifi/ChangeWifiStateDetails.java +++ b/src/com/android/settings/wifi/ChangeWifiStateDetails.java @@ -16,7 +16,6 @@ package com.android.settings.wifi; -import android.app.AlertDialog; import android.app.AppOpsManager; import android.content.Context; import android.os.Bundle; @@ -29,6 +28,7 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.wifi.AppStateChangeWifiStateBridge.WifiSettingsState; import com.android.settingslib.applications.ApplicationsState.AppEntry; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceChangeListener; import androidx.preference.SwitchPreference; diff --git a/src/com/android/settings/wifi/WifiAPITest.java b/src/com/android/settings/wifi/WifiAPITest.java index 9fc5ec4e091..52a54b7ae55 100644 --- a/src/com/android/settings/wifi/WifiAPITest.java +++ b/src/com/android/settings/wifi/WifiAPITest.java @@ -18,7 +18,6 @@ package com.android.settings.wifi; import static android.content.Context.WIFI_SERVICE; -import android.app.AlertDialog; import android.content.DialogInterface; import android.net.wifi.WifiManager; import android.os.Bundle; @@ -29,6 +28,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; diff --git a/src/com/android/settings/wifi/WifiDialog.java b/src/com/android/settings/wifi/WifiDialog.java index 79500e0b7ad..a487017d15e 100644 --- a/src/com/android/settings/wifi/WifiDialog.java +++ b/src/com/android/settings/wifi/WifiDialog.java @@ -16,7 +16,6 @@ package com.android.settings.wifi; -import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; @@ -27,11 +26,17 @@ import com.android.settings.R; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.wifi.AccessPoint; -public class WifiDialog extends AlertDialog implements WifiConfigUiBase, DialogInterface.OnClickListener { +import androidx.appcompat.app.AlertDialog; + +public class WifiDialog extends AlertDialog implements WifiConfigUiBase, + DialogInterface.OnClickListener { public interface WifiDialogListener { - void onForget(WifiDialog dialog); - void onSubmit(WifiDialog dialog); + default void onForget(WifiDialog dialog) { + } + + default void onSubmit(WifiDialog dialog) { + } } private static final int BUTTON_SUBMIT = DialogInterface.BUTTON_POSITIVE; @@ -64,7 +69,7 @@ public class WifiDialog extends AlertDialog implements WifiConfigUiBase, DialogI } /* package */ WifiDialog(Context context, WifiDialogListener listener, AccessPoint accessPoint, - int mode, int style, boolean hideSubmitButton) { + int mode, int style, boolean hideSubmitButton) { super(context, style); mMode = mode; mListener = listener; @@ -81,7 +86,6 @@ public class WifiDialog extends AlertDialog implements WifiConfigUiBase, DialogI protected void onCreate(Bundle savedInstanceState) { mView = getLayoutInflater().inflate(R.layout.wifi_dialog, null); setView(mView); - setInverseBackgroundForced(true); mController = new WifiConfigController(this, mView, mAccessPoint, mMode); super.onCreate(savedInstanceState); @@ -99,8 +103,8 @@ public class WifiDialog extends AlertDialog implements WifiConfigUiBase, DialogI } public void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - mController.updatePassword(); + super.onRestoreInstanceState(savedInstanceState); + mController.updatePassword(); } @Override diff --git a/src/com/android/settings/wifi/WifiScanModeActivity.java b/src/com/android/settings/wifi/WifiScanModeActivity.java index 4742f63f208..cdd4f5fba15 100644 --- a/src/com/android/settings/wifi/WifiScanModeActivity.java +++ b/src/com/android/settings/wifi/WifiScanModeActivity.java @@ -16,7 +16,6 @@ package com.android.settings.wifi; -import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; @@ -30,6 +29,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentActivity; diff --git a/src/com/android/settings/wifi/WifiScanningRequiredFragment.java b/src/com/android/settings/wifi/WifiScanningRequiredFragment.java index 77636aece91..a2e8b0eaf02 100644 --- a/src/com/android/settings/wifi/WifiScanningRequiredFragment.java +++ b/src/com/android/settings/wifi/WifiScanningRequiredFragment.java @@ -16,7 +16,6 @@ package com.android.settings.wifi; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.content.ActivityNotFoundException; import android.content.ContentResolver; @@ -35,6 +34,7 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settingslib.HelpUtils; import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AlertDialog; public class WifiScanningRequiredFragment extends InstrumentedDialogFragment implements DialogInterface.OnClickListener { diff --git a/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java b/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java index 3fe22c215f7..55ad18301ab 100644 --- a/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java +++ b/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java @@ -17,7 +17,6 @@ package com.android.settings.wifi; import android.app.Activity; -import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.net.wifi.WifiManager; @@ -46,6 +45,8 @@ import com.android.settingslib.wifi.AccessPoint; import java.io.IOException; +import androidx.appcompat.app.AlertDialog; + class WriteWifiConfigToNfcDialog extends AlertDialog implements TextWatcher, View.OnClickListener, CompoundButton.OnCheckedChangeListener { @@ -96,7 +97,6 @@ class WriteWifiConfigToNfcDialog extends AlertDialog mView = getLayoutInflater().inflate(R.layout.write_wifi_config_to_nfc, null); setView(mView); - setInverseBackgroundForced(true); setTitle(R.string.setup_wifi_nfc_tag); setCancelable(true); setButton(DialogInterface.BUTTON_NEUTRAL, diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java index e0868c7761e..6d340296363 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java +++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java @@ -17,7 +17,6 @@ package com.android.settings.wifi.calling; import android.app.Activity; -import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -47,6 +46,7 @@ import com.android.settings.SettingsPreferenceFragment; import com.android.settings.Utils; import com.android.settings.widget.SwitchBar; +import androidx.appcompat.app.AlertDialog; import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceClickListener; diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java index d291f9cb5a8..bda3b767cf3 100644 --- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java +++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java @@ -541,11 +541,6 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController mConnectivityManager.startCaptivePortalApp(mNetwork); } - @Override - public void onForget(WifiDialog dialog) { - // can't forget network from a 'modify' dialog - } - @Override public void onSubmit(WifiDialog dialog) { if (dialog.getController() != null) { diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java index 7ab43c7a420..3c2fa08d2f3 100644 --- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java +++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java @@ -17,7 +17,6 @@ package com.android.settings.wifi.p2p; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; @@ -55,6 +54,7 @@ import com.android.settingslib.core.AbstractPreferenceController; import java.util.ArrayList; import java.util.List; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; diff --git a/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceController.java b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceController.java new file mode 100644 index 00000000000..dea44439b99 --- /dev/null +++ b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceController.java @@ -0,0 +1,144 @@ +/* + * 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.savedaccesspoints; + + +import android.content.Context; +import android.net.wifi.WifiManager; +import android.util.Log; + +import androidx.annotation.VisibleForTesting; +import androidx.preference.Preference; +import androidx.preference.PreferenceGroup; +import androidx.preference.PreferenceScreen; + +import com.android.settings.core.BasePreferenceController; +import com.android.settings.utils.PreferenceGroupChildrenCache; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.utils.ThreadUtils; +import com.android.settingslib.wifi.AccessPoint; +import com.android.settingslib.wifi.AccessPointPreference; +import com.android.settingslib.wifi.AccessPointPreference.UserBadgeCache; +import com.android.settingslib.wifi.WifiSavedConfigUtils; + +import java.util.Collections; +import java.util.List; + +/** + * Controller that manages a PreferenceGroup, which contains a list of saved access points. + */ +public class SavedAccessPointsPreferenceController extends BasePreferenceController implements + LifecycleObserver, OnStart, Preference.OnPreferenceClickListener, + WifiManager.ActionListener { + + private static final String TAG = "SavedAPPrefCtrl"; + + private final WifiManager mWifiManager; + private final PreferenceGroupChildrenCache mChildrenCache; + + private final UserBadgeCache mUserBadgeCache; + private PreferenceGroup mPreferenceGroup; + private SavedAccessPointsWifiSettings mHost; + + public SavedAccessPointsPreferenceController(Context context, + String preferenceKey) { + super(context, preferenceKey); + mUserBadgeCache = new AccessPointPreference.UserBadgeCache(context.getPackageManager()); + mWifiManager = context.getSystemService(WifiManager.class); + mChildrenCache = new PreferenceGroupChildrenCache(); + } + + public SavedAccessPointsPreferenceController setHost(SavedAccessPointsWifiSettings host) { + mHost = host; + return this; + } + + @Override + public int getAvailabilityStatus() { + return AVAILABLE; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreferenceGroup = (PreferenceGroup) screen.findPreference(getPreferenceKey()); + } + + @Override + public void onStart() { + refreshSavedAccessPoints(); + } + + public void postRefreshSavedAccessPoints() { + ThreadUtils.postOnMainThread(() -> refreshSavedAccessPoints()); + } + + @Override + public boolean onPreferenceClick(Preference preference) { + if (mHost != null) { + mHost.showWifiDialog((AccessPointPreference) preference); + } + return false; + } + + @Override + public void onSuccess() { + postRefreshSavedAccessPoints(); + } + + @Override + public void onFailure(int reason) { + postRefreshSavedAccessPoints(); + } + + @VisibleForTesting + void refreshSavedAccessPoints() { + if (mPreferenceGroup == null) { + Log.w(TAG, "PreferenceGroup is null, skipping."); + return; + } + final Context prefContext = mPreferenceGroup.getContext(); + + final List accessPoints = + WifiSavedConfigUtils.getAllConfigs(mContext, mWifiManager); + Collections.sort(accessPoints, SavedNetworkComparator.INSTANCE); + mChildrenCache.cacheRemoveAllPrefs(mPreferenceGroup); + + final int accessPointsSize = accessPoints.size(); + for (int i = 0; i < accessPointsSize; ++i) { + AccessPoint ap = accessPoints.get(i); + String key = ap.getKey(); + AccessPointPreference preference = + (AccessPointPreference) mChildrenCache.getCachedPreference(key); + if (preference == null) { + preference = new AccessPointPreference(ap, prefContext, mUserBadgeCache, true); + preference.setKey(key); + preference.setIcon(null); + preference.setOnPreferenceClickListener(this); + mPreferenceGroup.addPreference(preference); + } + preference.setOrder(i); + } + + mChildrenCache.removeCachedPrefs(mPreferenceGroup); + + if (mPreferenceGroup.getPreferenceCount() < 1) { + Log.w(TAG, "Saved networks activity loaded, but there are no saved networks!"); + } + } +} diff --git a/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java index eeb5ca9d81d..8f14ec21d70 100644 --- a/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java +++ b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java @@ -17,102 +17,35 @@ package com.android.settings.wifi.savedaccesspoints; import android.annotation.Nullable; -import android.app.Activity; import android.app.Dialog; import android.content.Context; -import android.icu.text.Collator; +import android.content.DialogInterface; import android.net.wifi.WifiManager; import android.os.Bundle; -import android.os.Handler; import android.util.Log; -import android.widget.Toast; -import androidx.annotation.VisibleForTesting; -import androidx.preference.Preference; -import androidx.preference.PreferenceScreen; + import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.dashboard.DashboardFragment; import com.android.settings.wifi.WifiConfigUiBase; import com.android.settings.wifi.WifiDialog; import com.android.settings.wifi.WifiSettings; import com.android.settingslib.wifi.AccessPoint; import com.android.settingslib.wifi.AccessPointPreference; -import com.android.settingslib.wifi.WifiSavedConfigUtils; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; /** * UI to manage saved networks/access points. - * TODO(b/64806699): convert to {@link DashboardFragment} with {@link PreferenceController}s */ -public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment - implements WifiDialog.WifiDialogListener { +public class SavedAccessPointsWifiSettings extends DashboardFragment + implements WifiDialog.WifiDialogListener, DialogInterface.OnCancelListener { + private static final String TAG = "SavedAccessPoints"; - @VisibleForTesting - static final int MSG_UPDATE_PREFERENCES = 1; - private static final Comparator SAVED_NETWORK_COMPARATOR = - new Comparator() { - final Collator mCollator = Collator.getInstance(); - @Override - public int compare(AccessPoint ap1, AccessPoint ap2) { - return mCollator.compare( - nullToEmpty(ap1.getConfigName()), nullToEmpty(ap2.getConfigName())); - } - private String nullToEmpty(String string) { - return (string == null) ? "" : string; - } - }; - - @VisibleForTesting - final WifiManager.ActionListener mForgetListener = new WifiManager.ActionListener() { - @Override - public void onSuccess() { - postUpdatePreference(); - } - - @Override - public void onFailure(int reason) { - postUpdatePreference(); - } - }; - - @VisibleForTesting - final Handler mHandler = new Handler() { - @Override - public void handleMessage(android.os.Message msg) { - if (msg.what == MSG_UPDATE_PREFERENCES) { - initPreferences(); - } - } - }; - - private final WifiManager.ActionListener mSaveListener = new WifiManager.ActionListener() { - @Override - public void onSuccess() { - postUpdatePreference(); - } - @Override - public void onFailure(int reason) { - Activity activity = getActivity(); - if (activity != null) { - Toast.makeText(activity, - R.string.wifi_failed_save_message, - Toast.LENGTH_SHORT).show(); - } - } - }; - - private WifiDialog mDialog; private WifiManager mWifiManager; - private AccessPoint mDlgAccessPoint; private Bundle mAccessPointSavedState; private AccessPoint mSelectedAccessPoint; - private AccessPointPreference.UserBadgeCache mUserBadgeCache; - // Instance state key private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state"; @@ -122,81 +55,44 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment } @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.wifi_display_saved_access_points); - mUserBadgeCache = new AccessPointPreference.UserBadgeCache(getPackageManager()); + protected int getPreferenceScreenResId() { + return R.xml.wifi_display_saved_access_points; } @Override - public void onResume() { - super.onResume(); - initPreferences(); + protected String getLogTag() { + return TAG; } @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); + public void onAttach(Context context) { + super.onAttach(context); mWifiManager = (WifiManager) getContext() .getApplicationContext().getSystemService(Context.WIFI_SERVICE); + use(SavedAccessPointsPreferenceController.class) + .setHost(this); + } + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); if (savedInstanceState != null) { if (savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) { mAccessPointSavedState = - savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE); + savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE); } } } - private void initPreferences() { - PreferenceScreen preferenceScreen = getPreferenceScreen(); - final Context context = getPrefContext(); - - final List accessPoints = - WifiSavedConfigUtils.getAllConfigs(context, mWifiManager); - Collections.sort(accessPoints, SAVED_NETWORK_COMPARATOR); - cacheRemoveAllPrefs(preferenceScreen); - - final int accessPointsSize = accessPoints.size(); - for (int i = 0; i < accessPointsSize; ++i) { - AccessPoint ap = accessPoints.get(i); - String key = ap.getKey(); - AccessPointPreference preference = - (AccessPointPreference) getCachedPreference(key); - if (preference == null) { - preference = new AccessPointPreference(ap, context, mUserBadgeCache, true); - preference.setKey(key); - preference.setIcon(null); - preferenceScreen.addPreference(preference); - } - preference.setOrder(i); - } - - removeCachedPrefs(preferenceScreen); - - if(getPreferenceScreen().getPreferenceCount() < 1) { - Log.w(TAG, "Saved networks activity loaded, but there are no saved networks!"); - } - } - - private void postUpdatePreference() { - if (!mHandler.hasMessages(MSG_UPDATE_PREFERENCES)) { - mHandler.sendEmptyMessage(MSG_UPDATE_PREFERENCES); - } - } - - private void showWifiDialog(@Nullable AccessPointPreference accessPoint) { - if (mDialog != null) { - removeDialog(WifiSettings.WIFI_DIALOG_ID); - mDialog = null; - } + public void showWifiDialog(@Nullable AccessPointPreference accessPoint) { + removeDialog(WifiSettings.WIFI_DIALOG_ID); if (accessPoint != null) { // Save the access point and edit mode - mDlgAccessPoint = accessPoint.getAccessPoint(); + mSelectedAccessPoint = accessPoint.getAccessPoint(); } else { // No access point is selected. Clear saved state. - mDlgAccessPoint = null; + mSelectedAccessPoint = null; mAccessPointSavedState = null; } @@ -207,24 +103,18 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment public Dialog onCreateDialog(int dialogId) { switch (dialogId) { case WifiSettings.WIFI_DIALOG_ID: - if (mDlgAccessPoint == null && mAccessPointSavedState == null) { - // Add new network - mDialog = WifiDialog.createFullscreen(getActivity(), this, null, - WifiConfigUiBase.MODE_CONNECT); - } else { - // Modify network - if (mDlgAccessPoint == null) { - // Restore AP from save state - mDlgAccessPoint = new AccessPoint(getActivity(), mAccessPointSavedState); - // Reset the saved access point data - mAccessPointSavedState = null; - } - mDialog = WifiDialog.createModal(getActivity(), this, mDlgAccessPoint, - WifiConfigUiBase.MODE_VIEW); + // Modify network + if (mSelectedAccessPoint == null) { + // Restore AP from save state + mSelectedAccessPoint = new AccessPoint(getActivity(), mAccessPointSavedState); + // Reset the saved access point data + mAccessPointSavedState = null; } - mSelectedAccessPoint = mDlgAccessPoint; + final WifiDialog dialog = WifiDialog.createModal( + getActivity(), this, mSelectedAccessPoint, WifiConfigUiBase.MODE_VIEW); + dialog.setOnCancelListener(this); - return mDialog; + return dialog; } return super.onCreateDialog(dialogId); } @@ -242,14 +132,12 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - - // If the dialog is showing, save its state. - if (mDialog != null && mDialog.isShowing()) { - if (mDlgAccessPoint != null) { - mAccessPointSavedState = new Bundle(); - mDlgAccessPoint.saveWifiState(mAccessPointSavedState); - outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState); - } + // If the dialog is showing (indicated by the existence of mSelectedAccessPoint), then we + // save its state. + if (mSelectedAccessPoint != null) { + mAccessPointSavedState = new Bundle(); + mSelectedAccessPoint.saveWifiState(mAccessPointSavedState); + outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState); } } @@ -264,27 +152,19 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment Log.e(TAG, "Failed to remove Passpoint configuration for " + mSelectedAccessPoint.getConfigName()); } - postUpdatePreference(); + use(SavedAccessPointsPreferenceController.class) + .postRefreshSavedAccessPoints(); } else { // mForgetListener will call initPreferences upon completion - mWifiManager.forget(mSelectedAccessPoint.getConfig().networkId, mForgetListener); + mWifiManager.forget(mSelectedAccessPoint.getConfig().networkId, + use(SavedAccessPointsPreferenceController.class)); } mSelectedAccessPoint = null; } } @Override - public void onSubmit(WifiDialog dialog) { - mWifiManager.save(dialog.getController().getConfig(), mSaveListener); - } - - @Override - public boolean onPreferenceTreeClick(Preference preference) { - if (preference instanceof AccessPointPreference) { - showWifiDialog((AccessPointPreference) preference); - return true; - } else { - return super.onPreferenceTreeClick(preference); - } + public void onCancel(DialogInterface dialog) { + mSelectedAccessPoint = null; } } diff --git a/src/com/android/settings/wifi/savedaccesspoints/SavedNetworkComparator.java b/src/com/android/settings/wifi/savedaccesspoints/SavedNetworkComparator.java new file mode 100644 index 00000000000..cff438787f6 --- /dev/null +++ b/src/com/android/settings/wifi/savedaccesspoints/SavedNetworkComparator.java @@ -0,0 +1,40 @@ +/* + * 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.savedaccesspoints; + +import android.icu.text.Collator; + +import com.android.settingslib.wifi.AccessPoint; + +import java.util.Comparator; + +public final class SavedNetworkComparator { + public static final Comparator INSTANCE = + new Comparator() { + final Collator mCollator = Collator.getInstance(); + + @Override + public int compare(AccessPoint ap1, AccessPoint ap2) { + return mCollator.compare( + nullToEmpty(ap1.getConfigName()), nullToEmpty(ap2.getConfigName())); + } + + private String nullToEmpty(String string) { + return (string == null) ? "" : string; + } + }; +} diff --git a/tests/robotests/src/com/android/settings/RestrictedSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/RestrictedSettingsFragmentTest.java index 35f9e2876ab..73be1078b14 100644 --- a/tests/robotests/src/com/android/settings/RestrictedSettingsFragmentTest.java +++ b/tests/robotests/src/com/android/settings/RestrictedSettingsFragmentTest.java @@ -21,7 +21,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.app.Activity; -import android.app.AlertDialog; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -31,6 +30,8 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import androidx.appcompat.app.AlertDialog; + @RunWith(SettingsRobolectricTestRunner.class) public class RestrictedSettingsFragmentTest { diff --git a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java index afbf5321451..40dcf7ad693 100644 --- a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java @@ -31,6 +31,7 @@ import android.text.TextUtils; import com.android.settings.R; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.testutils.Robolectric; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settingslib.accounts.AuthenticatorHelper; import com.android.settingslib.drawer.CategoryKey; @@ -38,7 +39,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.annotation.Implementation; @@ -49,7 +49,7 @@ import java.util.List; import androidx.fragment.app.FragmentActivity; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class AccountDashboardFragmentTest { private AccountDashboardFragment mFragment; diff --git a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java index 035d74e72cd..0d905aa5bb6 100644 --- a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java +++ b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java @@ -22,7 +22,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -52,6 +51,7 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; +import androidx.appcompat.app.AlertDialog; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; 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 de2479adf9f..dac9409cf7d 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java @@ -17,6 +17,7 @@ package com.android.settings.applications.appinfo; 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; @@ -44,6 +45,7 @@ import android.os.UserManager; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.widget.ActionButtonPreference; import com.android.settings.widget.ActionButtonPreferenceTest; import com.android.settingslib.applications.AppUtils; @@ -59,12 +61,11 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.stubbing.Answer; -import org.robolectric.RobolectricTestRunner; import org.robolectric.util.ReflectionHelpers; import androidx.fragment.app.Fragment; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class AppButtonsPreferenceControllerTest { private static final String PACKAGE_NAME = "com.android.settings"; diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/ButtonActionDialogFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/ButtonActionDialogFragmentTest.java index 98bfcd54fe8..80a696abb33 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/ButtonActionDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/ButtonActionDialogFragmentTest.java @@ -21,12 +21,13 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; 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 com.android.settingslib.testutils.FragmentTestUtils; import org.junit.Before; @@ -35,13 +36,13 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; -import org.robolectric.Shadows; -import org.robolectric.shadows.ShadowAlertDialog; -import org.robolectric.shadows.ShadowDialog; +import org.robolectric.annotation.Config; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; @RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {ShadowAlertDialogCompat.class, SettingsShadowResourcesImpl.class}) public class ButtonActionDialogFragmentTest { private static final int FORCE_STOP_ID = ButtonActionDialogFragment.DialogType.FORCE_STOP; @@ -73,12 +74,12 @@ public class ButtonActionDialogFragmentTest { @Test public void testOnCreateDialog_forceStopDialog() { ButtonActionDialogFragment fragment = ButtonActionDialogFragment.newInstance(FORCE_STOP_ID); - FragmentTestUtils.startFragment(fragment); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); - final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog(); assertThat(dialog).isNotNull(); - ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog); + + ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog); assertThat(shadowDialog.getMessage()).isEqualTo( mShadowContext.getString(R.string.force_stop_dlg_text)); @@ -93,12 +94,12 @@ public class ButtonActionDialogFragmentTest { @Test public void testOnCreateDialog_disableDialog() { ButtonActionDialogFragment fragment = ButtonActionDialogFragment.newInstance(DISABLE_ID); - FragmentTestUtils.startFragment(fragment); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); - final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog(); assertThat(dialog).isNotNull(); - ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog); + + ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog); assertThat(shadowDialog.getMessage()).isEqualTo( mShadowContext.getString(R.string.app_disable_dlg_text)); @@ -111,13 +112,13 @@ public class ButtonActionDialogFragmentTest { @Test public void testOnCreateDialog_specialDisableDialog() { ButtonActionDialogFragment fragment = - ButtonActionDialogFragment.newInstance(SPECIAL_DISABLE_ID); - + ButtonActionDialogFragment.newInstance(SPECIAL_DISABLE_ID); FragmentTestUtils.startFragment(fragment); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); - final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog(); assertThat(dialog).isNotNull(); - ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog); + + ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog); assertThat(shadowDialog.getMessage()).isEqualTo( mShadowContext.getString(R.string.app_disable_dlg_text)); diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragmentTest.java index 1281b74bca7..6b4a6417bbe 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragmentTest.java @@ -25,24 +25,27 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.pm.PackageManager; import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settingslib.testutils.FragmentTestUtils; +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.Shadows; -import org.robolectric.shadows.ShadowAlertDialog; -import org.robolectric.shadows.ShadowDialog; +import org.robolectric.annotation.Config; + +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.FragmentActivity; @RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {ShadowAlertDialogCompat.class, SettingsShadowResourcesImpl.class}) public class InstantAppButtonDialogFragmentTest { private static final String TEST_PACKAGE = "testPackage"; @@ -52,8 +55,10 @@ public class InstantAppButtonDialogFragmentTest { @Before public void setUp() { + final FragmentActivity activity = Robolectric.setupActivity(FragmentActivity.class); mContext = spy(RuntimeEnvironment.application); mFragment = spy(InstantAppButtonDialogFragment.newInstance(TEST_PACKAGE)); + mFragment.show(activity.getSupportFragmentManager(), "InstantAppButtonDialogFragment"); doReturn(mContext).when(mFragment).getContext(); } @@ -61,7 +66,6 @@ public class InstantAppButtonDialogFragmentTest { public void onClick_shouldDeleteApp() { final PackageManager packageManager = mock(PackageManager.class); when(mContext.getPackageManager()).thenReturn(packageManager); - FragmentTestUtils.startFragment(mFragment); mFragment.onClick(null /* dialog */, 0 /* which */); @@ -71,11 +75,11 @@ public class InstantAppButtonDialogFragmentTest { @Test public void onCreateDialog_clearAppDialog_shouldShowClearAppDataConfirmation() { - FragmentTestUtils.startFragment(mFragment); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); - final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog(); assertThat(dialog).isNotNull(); - final ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog); + + final ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog); assertThat(shadowDialog.getMessage()).isEqualTo( mContext.getString(R.string.clear_instant_app_confirmation)); diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java index d31e3e0e11f..cc0308c0a02 100644 --- a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java +++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java @@ -37,6 +37,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.res.Resources; import android.os.Bundle; import android.os.Looper; import android.os.UserManager; @@ -74,6 +77,14 @@ public class ManageApplicationsTest { private ApplicationsState.Session mSession; @Mock private Menu mMenu; + @Mock + private FragmentActivity mActivity; + @Mock + private Resources mResources; + @Mock + private UserManager mUserManager; + @Mock + private PackageManager mPackageManager; private MenuItem mAppReset; private MenuItem mSortRecent; private MenuItem mSortFrequent; @@ -89,7 +100,11 @@ public class ManageApplicationsTest { when(mState.newSession(any())).thenReturn(mSession); when(mState.getBackgroundLooper()).thenReturn(Looper.myLooper()); - mFragment = new ManageApplications(); + mFragment = spy(new ManageApplications()); + when(mFragment.getActivity()).thenReturn(mActivity); + when(mActivity.getResources()).thenReturn(mResources); + when(mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager); + when(mActivity.getPackageManager()).thenReturn(mPackageManager); } @Test @@ -126,10 +141,8 @@ public class ManageApplicationsTest { @Test public void onCreateView_shouldNotShowLoadingContainer() { - final ManageApplications fragment = spy(new ManageApplications()); - ReflectionHelpers.setField(fragment, "mResetAppsHelper", - mock(ResetAppsHelper.class)); - doNothing().when(fragment).createHeader(); + ReflectionHelpers.setField(mFragment, "mResetAppsHelper", mock(ResetAppsHelper.class)); + doNothing().when(mFragment).createHeader(); final LayoutInflater layoutInflater = mock(LayoutInflater.class); final View view = mock(View.class); @@ -137,19 +150,17 @@ public class ManageApplicationsTest { when(layoutInflater.inflate(anyInt(), eq(null))).thenReturn(view); when(view.findViewById(R.id.loading_container)).thenReturn(loadingContainer); - fragment.onCreateView(layoutInflater, mock(ViewGroup.class), null); + mFragment.onCreateView(layoutInflater, mock(ViewGroup.class), null); verify(loadingContainer, never()).setVisibility(View.VISIBLE); } @Test public void updateLoading_appLoaded_shouldNotDelayCallToHandleLoadingContainer() { - final ManageApplications fragment = mock(ManageApplications.class); - ReflectionHelpers.setField(fragment, "mLoadingContainer", mock(View.class)); - ReflectionHelpers.setField(fragment, "mListContainer", mock(View.class)); - when(fragment.getActivity()).thenReturn(mock(FragmentActivity.class)); + ReflectionHelpers.setField(mFragment, "mLoadingContainer", mock(View.class)); + ReflectionHelpers.setField(mFragment, "mListContainer", mock(View.class)); final ManageApplications.ApplicationsAdapter adapter = - spy(new ManageApplications.ApplicationsAdapter(mState, fragment, + spy(new ManageApplications.ApplicationsAdapter(mState, mFragment, AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle())); final LoadingViewController loadingViewController = mock(LoadingViewController.class); @@ -168,12 +179,10 @@ public class ManageApplicationsTest { @Test public void updateLoading_appNotLoaded_shouldDelayCallToHandleLoadingContainer() { - final ManageApplications fragment = mock(ManageApplications.class); - ReflectionHelpers.setField(fragment, "mLoadingContainer", mock(View.class)); - ReflectionHelpers.setField(fragment, "mListContainer", mock(View.class)); - when(fragment.getActivity()).thenReturn(mock(FragmentActivity.class)); + ReflectionHelpers.setField(mFragment, "mLoadingContainer", mock(View.class)); + ReflectionHelpers.setField(mFragment, "mListContainer", mock(View.class)); final ManageApplications.ApplicationsAdapter adapter = - spy(new ManageApplications.ApplicationsAdapter(mState, fragment, + spy(new ManageApplications.ApplicationsAdapter(mState, mFragment, AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle())); final LoadingViewController loadingViewController = mock(LoadingViewController.class); @@ -200,21 +209,19 @@ public class ManageApplicationsTest { @Test public void onRebuildComplete_shouldHideLoadingView() { final Context context = RuntimeEnvironment.application; - final ManageApplications fragment = mock(ManageApplications.class); final RecyclerView recyclerView = mock(RecyclerView.class); final View emptyView = mock(View.class); - ReflectionHelpers.setField(fragment, "mRecyclerView", recyclerView); - ReflectionHelpers.setField(fragment, "mEmptyView", emptyView); + ReflectionHelpers.setField(mFragment, "mRecyclerView", recyclerView); + ReflectionHelpers.setField(mFragment, "mEmptyView", emptyView); final View loadingContainer = mock(View.class); when(loadingContainer.getContext()).thenReturn(context); final View listContainer = mock(View.class); when(listContainer.getVisibility()).thenReturn(View.INVISIBLE); when(listContainer.getContext()).thenReturn(context); - ReflectionHelpers.setField(fragment, "mLoadingContainer", loadingContainer); - ReflectionHelpers.setField(fragment, "mListContainer", listContainer); - when(fragment.getActivity()).thenReturn(mock(FragmentActivity.class)); + ReflectionHelpers.setField(mFragment, "mLoadingContainer", loadingContainer); + ReflectionHelpers.setField(mFragment, "mListContainer", listContainer); final ManageApplications.ApplicationsAdapter adapter = - spy(new ManageApplications.ApplicationsAdapter(mState, fragment, + spy(new ManageApplications.ApplicationsAdapter(mState, mFragment, AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle())); final LoadingViewController loadingViewController = mock(LoadingViewController.class); @@ -231,6 +238,8 @@ public class ManageApplicationsTest { final ArrayList appList = new ArrayList<>(); appList.add(mock(ApplicationsState.AppEntry.class)); when(mSession.getAllApps()).thenReturn(appList); + ReflectionHelpers.setField( + mFragment, "mFilterAdapter", mock(ManageApplications.FilterSpinnerAdapter.class)); adapter.onRebuildComplete(null); @@ -241,8 +250,7 @@ public class ManageApplicationsTest { public void notifyItemChange_recyclerViewIdle_shouldNotify() { final RecyclerView recyclerView = mock(RecyclerView.class); final ManageApplications.ApplicationsAdapter adapter = - spy(new ManageApplications.ApplicationsAdapter(mState, - mock(ManageApplications.class), + spy(new ManageApplications.ApplicationsAdapter(mState, mFragment, AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle())); adapter.onAttachedToRecyclerView(recyclerView); @@ -256,8 +264,7 @@ public class ManageApplicationsTest { public void notifyItemChange_recyclerViewScrolling_shouldNotifyWhenIdle() { final RecyclerView recyclerView = mock(RecyclerView.class); final ManageApplications.ApplicationsAdapter adapter = - spy(new ManageApplications.ApplicationsAdapter(mState, - mock(ManageApplications.class), + spy(new ManageApplications.ApplicationsAdapter(mState, mFragment, AppFilterRegistry.getInstance().get(FILTER_APPS_ALL), new Bundle())); adapter.onAttachedToRecyclerView(recyclerView); @@ -273,20 +280,19 @@ public class ManageApplicationsTest { @Test public void applicationsAdapter_onBindViewHolder_updateSwitch_notifications() { - ManageApplications manageApplications = mock(ManageApplications.class); - when(manageApplications.getActivity()).thenReturn(mock(FragmentActivity.class)); - UserManager um = mock(UserManager.class); - when(um.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{}); - ReflectionHelpers.setField(manageApplications, "mUserManager", um); - manageApplications.mListType = LIST_TYPE_NOTIFICATION; + when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{}); + ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager); + mFragment.mListType = LIST_TYPE_NOTIFICATION; ApplicationViewHolder holder = mock(ApplicationViewHolder.class); ReflectionHelpers.setField(holder, "itemView", mock(View.class)); ManageApplications.ApplicationsAdapter adapter = new ManageApplications.ApplicationsAdapter(mState, - manageApplications, mock(AppFilterItem.class), + mFragment, mock(AppFilterItem.class), mock(Bundle.class)); final ArrayList appList = new ArrayList<>(); - appList.add(mock(ApplicationsState.AppEntry.class)); + final ApplicationsState.AppEntry appEntry = mock(ApplicationsState.AppEntry.class); + appEntry.info = mock(ApplicationInfo.class); + appList.add(appEntry); ReflectionHelpers.setField(adapter, "mEntries", appList); adapter.onBindViewHolder(holder, 0); @@ -295,19 +301,17 @@ public class ManageApplicationsTest { @Test public void applicationsAdapter_onBindViewHolder_updateSwitch_notNotifications() { - ManageApplications manageApplications = mock(ManageApplications.class); - manageApplications.mListType = LIST_TYPE_MAIN; + mFragment.mListType = LIST_TYPE_MAIN; ApplicationViewHolder holder = mock(ApplicationViewHolder.class); ReflectionHelpers.setField(holder, "itemView", mock(View.class)); - UserManager um = mock(UserManager.class); - when(um.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{}); - ReflectionHelpers.setField(manageApplications, "mUserManager", um); - ManageApplications.ApplicationsAdapter adapter = - new ManageApplications.ApplicationsAdapter(mState, - manageApplications, mock(AppFilterItem.class), - mock(Bundle.class)); + when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{}); + ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager); + ManageApplications.ApplicationsAdapter adapter = new ManageApplications.ApplicationsAdapter( + mState, mFragment, mock(AppFilterItem.class), mock(Bundle.class)); final ArrayList appList = new ArrayList<>(); - appList.add(mock(ApplicationsState.AppEntry.class)); + final ApplicationsState.AppEntry appEntry = mock(ApplicationsState.AppEntry.class); + appEntry.info = mock(ApplicationInfo.class); + appList.add(appEntry); ReflectionHelpers.setField(adapter, "mEntries", appList); adapter.onBindViewHolder(holder, 0); @@ -316,23 +320,18 @@ public class ManageApplicationsTest { @Test public void sortOrderSavedOnRebuild() { - ManageApplications manageApplications = mock(ManageApplications.class); - when(manageApplications.getActivity()).thenReturn(mock(FragmentActivity.class)); - UserManager um = mock(UserManager.class); - when(um.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{}); - ReflectionHelpers.setField(manageApplications, "mUserManager", um); - manageApplications.mListType = LIST_TYPE_NOTIFICATION; - manageApplications.mSortOrder = -1; - ManageApplications.ApplicationsAdapter adapter = - new ManageApplications.ApplicationsAdapter(mState, - manageApplications, mock(AppFilterItem.class), - mock(Bundle.class)); + when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[]{}); + ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager); + mFragment.mListType = LIST_TYPE_NOTIFICATION; + mFragment.mSortOrder = -1; + ManageApplications.ApplicationsAdapter adapter = new ManageApplications.ApplicationsAdapter( + mState, mFragment, mock(AppFilterItem.class), mock(Bundle.class)); adapter.rebuild(mSortRecent.getItemId()); - assertThat(manageApplications.mSortOrder).isEqualTo(mSortRecent.getItemId()); + assertThat(mFragment.mSortOrder).isEqualTo(mSortRecent.getItemId()); adapter.rebuild(mSortFrequent.getItemId()); - assertThat(manageApplications.mSortOrder).isEqualTo(mSortFrequent.getItemId()); + assertThat(mFragment.mSortOrder).isEqualTo(mSortFrequent.getItemId()); } private void setUpOptionMenus() { diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/DeleteFingerprintDialogTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/DeleteFingerprintDialogTest.java index cf416d83fea..9479771a48c 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/DeleteFingerprintDialogTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/DeleteFingerprintDialogTest.java @@ -26,6 +26,7 @@ import android.hardware.fingerprint.Fingerprint; import com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment; import com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.DeleteFingerprintDialog; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; import com.android.settings.testutils.shadow.ShadowFragment; import com.android.settingslib.testutils.FragmentTestUtils; @@ -37,7 +38,7 @@ import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; @RunWith(SettingsRobolectricTestRunner.class) -@Config(shadows = ShadowFragment.class) +@Config(shadows = {ShadowFragment.class, SettingsShadowResourcesImpl.class}) public class DeleteFingerprintDialogTest { @Mock diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensorTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensorTest.java index 38127ef22e2..797a202995a 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensorTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensorTest.java @@ -16,11 +16,9 @@ package com.android.settings.biometrics.fingerprint; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static com.google.common.truth.Truth.assertThat; import static org.robolectric.RuntimeEnvironment.application; -import android.app.AlertDialog; import android.content.Intent; import android.hardware.fingerprint.FingerprintManager; import android.widget.Button; @@ -30,6 +28,8 @@ import com.android.settings.password.ChooseLockSettingsHelper; 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.SettingsShadowResourcesImpl; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowUtils; import org.junit.After; @@ -39,12 +39,17 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowAlertDialog; + +import androidx.appcompat.app.AlertDialog; @RunWith(SettingsRobolectricTestRunner.class) -@Config(shadows = {SettingsShadowResources.SettingsShadowTheme.class, ShadowUtils.class}) +@Config(shadows = { + SettingsShadowResources.SettingsShadowTheme.class, + ShadowUtils.class, + ShadowAlertDialogCompat.class, + SettingsShadowResourcesImpl.class +}) public class SetupFingerprintEnrollFindSensorTest { @Mock @@ -75,11 +80,12 @@ public class SetupFingerprintEnrollFindSensorTest { final Button skipButton = activity.findViewById(R.id.skip_button); skipButton.performClick(); - final AlertDialog alertDialog = ShadowAlertDialog.getLatestAlertDialog(); - assertNotNull(alertDialog); + final AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(alertDialog).isNotNull(); - final ShadowAlertDialog shadowAlertDialog = Shadows.shadowOf(alertDialog); + final ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf( + alertDialog); final int titleRes = R.string.setup_fingerprint_enroll_skip_title; - assertEquals(application.getString(titleRes), shadowAlertDialog.getTitle()); + assertThat(application.getString(titleRes)).isEqualTo(shadowAlertDialog.getTitle()); } } diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java index 1162f8e6ad9..6256a3db1b3 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java @@ -27,11 +27,14 @@ import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.os.UserManager; +import android.view.ContextThemeWrapper; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; @@ -41,9 +44,11 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class}) public class BluetoothDevicePreferenceTest { private static final boolean SHOW_DEVICES_WITHOUT_NAMES = true; @@ -58,7 +63,8 @@ public class BluetoothDevicePreferenceTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mContext = spy(RuntimeEnvironment.application.getApplicationContext()); + Context context = spy(RuntimeEnvironment.application.getApplicationContext()); + mContext = new ContextThemeWrapper(context, R.style.Theme_Settings); mFakeFeatureFactory = FakeFeatureFactory.setupForTest(); mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider(); mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java index ede0b044e31..6cd924a4cc5 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java @@ -26,7 +26,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.text.SpannableStringBuilder; @@ -38,6 +37,8 @@ import android.widget.TextView; 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 com.android.settingslib.testutils.FragmentTestUtils; import org.junit.Before; @@ -46,9 +47,12 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; -import org.robolectric.shadows.ShadowAlertDialog; +import org.robolectric.annotation.Config; + +import androidx.appcompat.app.AlertDialog; @RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {ShadowAlertDialogCompat.class, SettingsShadowResourcesImpl.class}) public class BluetoothPairingDialogTest { private static final String FILLER = "text that goes in a view"; @@ -434,7 +438,7 @@ public class BluetoothPairingDialogTest { BluetoothPairingDialogFragment fragment = spy(new BluetoothPairingDialogFragment()); when(fragment.getPairingViewText()).thenReturn(existingText); setupFragment(fragment); - AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog(); + AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); assertThat(dialog).isNotNull(); boolean expected = !TextUtils.isEmpty(existingText); assertThat(dialog.getButton(Dialog.BUTTON_POSITIVE).isEnabled()).isEqualTo(expected); diff --git a/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java index 37abdcc8908..8532cc11517 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java @@ -24,10 +24,9 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.AlertDialog; - import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import org.junit.Before; @@ -37,11 +36,14 @@ import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; +import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowDialog; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; @RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = SettingsShadowResourcesImpl.class) public class ForgetDeviceDialogFragmentTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) diff --git a/tests/robotests/src/com/android/settings/bluetooth/LocalDeviceNameDialogFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/LocalDeviceNameDialogFragmentTest.java index d41475f0305..25333414982 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/LocalDeviceNameDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/LocalDeviceNameDialogFragmentTest.java @@ -22,13 +22,14 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.AlertDialog; import android.content.Context; import android.view.View; import android.view.inputmethod.InputMethodManager; 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 com.android.settingslib.bluetooth.LocalBluetoothAdapter; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.testutils.FragmentTestUtils; @@ -40,11 +41,15 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; -import org.robolectric.shadows.ShadowAlertDialog; +import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; +import androidx.appcompat.app.AlertDialog; + @RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {ShadowAlertDialogCompat.class, SettingsShadowResourcesImpl.class}) public class LocalDeviceNameDialogFragmentTest { + @Mock private LocalBluetoothManager mManager; @Mock @@ -75,7 +80,7 @@ public class LocalDeviceNameDialogFragmentTest { @Test public void diaglogTriggersShowSoftInput() { FragmentTestUtils.startFragment(mFragment); - AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog(); + AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); assertThat(dialog).isNotNull(); View view = dialog.findViewById(R.id.edittext); verify(mInputMethodManager).showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); diff --git a/tests/robotests/src/com/android/settings/bluetooth/RemoteDeviceNameDialogFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/RemoteDeviceNameDialogFragmentTest.java index e257a88645d..0ecd2952ddc 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/RemoteDeviceNameDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/RemoteDeviceNameDialogFragmentTest.java @@ -25,7 +25,6 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.AlertDialog; import android.content.DialogInterface; import android.widget.Button; import android.widget.EditText; @@ -33,6 +32,7 @@ import android.widget.EditText; import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.testutils.FragmentTestUtils; @@ -42,9 +42,13 @@ import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowDialog; +import androidx.appcompat.app.AlertDialog; + @RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = SettingsShadowResourcesImpl.class) public class RemoteDeviceNameDialogFragmentTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java index a4cbc9d86db..3d7eb13bdcd 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java @@ -20,7 +20,9 @@ import static com.android.settings.dashboard.DashboardData.STABLE_ID_CONDITION_C import static com.android.settings.dashboard.DashboardData.STABLE_ID_CONDITION_FOOTER; import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONDITION_DIVIDER; import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONTAINER; + import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -29,6 +31,7 @@ import android.service.settings.suggestions.Suggestion; import com.android.settings.dashboard.conditional.AirplaneModeCondition; import com.android.settings.dashboard.conditional.Condition; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.Tile; @@ -37,7 +40,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; import java.util.ArrayList; import java.util.Collections; @@ -48,7 +50,7 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.ListUpdateCallback; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class DashboardDataTest { private static final String TEST_SUGGESTION_TITLE = "Use fingerprint"; diff --git a/tests/robotests/src/com/android/settings/deviceinfo/HardwareInfoDialogFragmentTest.java b/tests/robotests/src/com/android/settings/deviceinfo/HardwareInfoDialogFragmentTest.java index e17f6bee9ab..23ca244d6f9 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/HardwareInfoDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/HardwareInfoDialogFragmentTest.java @@ -29,14 +29,17 @@ import android.view.View; import com.android.settings.R; import com.android.settings.testutils.Robolectric; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; import androidx.fragment.app.FragmentActivity; @RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = SettingsShadowResourcesImpl.class) public class HardwareInfoDialogFragmentTest { private FragmentActivity mActivity; diff --git a/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java b/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java index d1215eca0b0..49025a8e20f 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeForgetTest.java @@ -18,7 +18,6 @@ package com.android.settings.deviceinfo; import static com.google.common.truth.Truth.assertThat; -import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.os.storage.VolumeRecord; @@ -28,6 +27,7 @@ import com.android.settings.R; import com.android.settings.deviceinfo.PrivateVolumeForget.ForgetConfirmFragment; import com.android.settings.testutils.Robolectric; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; import com.android.settings.testutils.shadow.ShadowStorageManager; import org.junit.After; @@ -36,10 +36,11 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; @RunWith(SettingsRobolectricTestRunner.class) -@Config(shadows = ShadowStorageManager.class) +@Config(shadows = {ShadowStorageManager.class, SettingsShadowResourcesImpl.class}) public class PrivateVolumeForgetTest { private PrivateVolumeForget mFragment; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceControllerTest.java index a6790fd6cd1..406ed772815 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AutoRestrictionPreferenceControllerTest.java @@ -17,6 +17,7 @@ package com.android.settings.fuelgauge; import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Mockito.doReturn; import android.content.Context; @@ -24,17 +25,17 @@ import android.provider.Settings; import com.android.settings.core.BasePreferenceController; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import androidx.preference.SwitchPreference; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class AutoRestrictionPreferenceControllerTest { private static final int ON = 1; private static final int OFF = 0; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java index 3dee0a6a695..1a3155d2760 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java @@ -35,6 +35,7 @@ import android.os.UserManager; import com.android.settings.R; 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.ShadowFragment; import com.android.settingslib.fuelgauge.PowerWhitelistBackend; @@ -45,13 +46,12 @@ import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import androidx.preference.Preference; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) @Config(shadows = {SettingsShadowResources.SettingsShadowTheme.class, ShadowFragment.class}) public class BackgroundActivityPreferenceControllerTest { diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java index 1bcacbf282e..c29a012a292 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java @@ -32,18 +32,18 @@ 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 org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import androidx.preference.PreferenceGroup; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class BatteryAppListPreferenceControllerTest { private static final String[] PACKAGE_NAMES = {"com.app1", "com.app2"}; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java index 30999cbcd00..58bfe0eabfa 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java @@ -17,6 +17,7 @@ package com.android.settings.fuelgauge; import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Mockito.spy; import android.content.Context; @@ -26,19 +27,19 @@ import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper; import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager; import com.android.settings.testutils.DatabaseTestUtils; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; import java.util.List; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class BatteryDatabaseManagerTest { private static String PACKAGE_NAME_NEW = "com.android.app1"; private static int UID_NEW = 345; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java index b89a3f0fd0e..7bb08485b5f 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java @@ -16,6 +16,7 @@ package com.android.settings.fuelgauge; import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -30,6 +31,7 @@ import android.os.UserManager; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatterySipper.DrainType; import com.android.settings.R; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Rule; @@ -38,12 +40,11 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import java.util.Locale; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class BatteryEntryTest { private static final int APP_UID = 123; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceControllerTest.java index abf05af668d..d8ee8f61f95 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceControllerTest.java @@ -17,6 +17,7 @@ package com.android.settings.fuelgauge; import static com.google.common.truth.Truth.assertThat; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; @@ -29,6 +30,7 @@ import android.content.Intent; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settingslib.fuelgauge.PowerWhitelistBackend; import org.junit.Before; @@ -36,13 +38,12 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import androidx.preference.Preference; import androidx.preference.SwitchPreference; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class BatteryOptimizationPreferenceControllerTest { private static final String PKG_IN_WHITELIST = "com.pkg.in.whitelist"; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java index 81cf6526347..267f2635489 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java @@ -18,7 +18,9 @@ package com.android.settings.fuelgauge; import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT; import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID; + import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Matchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; @@ -33,6 +35,7 @@ import android.os.UserManager; import com.android.settings.R; import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.fuelgauge.batterytip.AppInfo; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; @@ -40,7 +43,6 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; @@ -48,7 +50,7 @@ import java.util.List; import androidx.preference.Preference; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class RestrictAppPreferenceControllerTest { private static final int ALLOWED_UID = 111; private static final String ALLOWED_PACKAGE_NAME = "com.android.allowed.package"; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java index 1cc027f445b..b9ed5098116 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java @@ -21,7 +21,6 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; -import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -38,6 +37,8 @@ import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settingslib.testutils.FragmentTestUtils; import org.junit.Before; @@ -47,18 +48,18 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; -import org.robolectric.Shadows; -import org.robolectric.shadows.ShadowAlertDialog; -import org.robolectric.shadows.ShadowDialog; +import org.robolectric.annotation.Config; import java.util.ArrayList; import java.util.List; +import androidx.appcompat.app.AlertDialog; import androidx.preference.CheckBoxPreference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceManager; @RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {ShadowAlertDialogCompat.class, SettingsShadowResourcesImpl.class}) public class RestrictedAppDetailsTest { private static final String PACKAGE_NAME = "com.android.app"; @@ -154,8 +155,8 @@ public class RestrictedAppDetailsTest { FragmentTestUtils.startFragment(dialogFragment); - final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog(); - ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog); assertThat(shadowDialog.getTitle()).isEqualTo("Restrict app?"); } @@ -166,8 +167,8 @@ public class RestrictedAppDetailsTest { FragmentTestUtils.startFragment(dialogFragment); - final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog(); - ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog); assertThat(shadowDialog.getTitle()).isEqualTo("Remove restriction?"); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/SmartBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/SmartBatteryPreferenceControllerTest.java index d7db33141aa..971de7a593b 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/SmartBatteryPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/SmartBatteryPreferenceControllerTest.java @@ -17,6 +17,7 @@ package com.android.settings.fuelgauge; import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Mockito.doReturn; import android.content.ContentResolver; @@ -25,17 +26,17 @@ import android.provider.Settings; import com.android.settings.core.BasePreferenceController; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import androidx.preference.SwitchPreference; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class SmartBatteryPreferenceControllerTest { private static final int ON = 1; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java index e9c9978bc44..88821016244 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java @@ -20,7 +20,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; -import android.app.AlertDialog; import android.content.Context; import android.text.format.DateUtils; @@ -33,6 +32,8 @@ import com.android.settings.fuelgauge.batterytip.tips.SummaryTip; import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowUtils; import com.android.settingslib.testutils.FragmentTestUtils; @@ -42,16 +43,16 @@ import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowAlertDialog; -import org.robolectric.shadows.ShadowDialog; import java.util.ArrayList; import java.util.List; +import androidx.appcompat.app.AlertDialog; + @RunWith(SettingsRobolectricTestRunner.class) -@Config(shadows = ShadowUtils.class) +@Config(shadows = {ShadowUtils.class, ShadowAlertDialogCompat.class, + SettingsShadowResourcesImpl.class}) public class BatteryTipDialogFragmentTest { private static final String PACKAGE_NAME = "com.android.app"; @@ -108,8 +109,8 @@ public class BatteryTipDialogFragmentTest { Robolectric.getForegroundThreadScheduler().advanceToLastPostedRunnable(); - final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog(); - ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog); assertThat(shadowDialog.getMessage()).isEqualTo( mContext.getString(R.string.battery_tip_dialog_message, 1)); @@ -121,8 +122,8 @@ public class BatteryTipDialogFragmentTest { FragmentTestUtils.startFragment(mDialogFragment); - final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog(); - ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog); assertThat(shadowDialog.getTitle()).isEqualTo("Restrict app?"); assertThat(shadowDialog.getMessage()) @@ -142,8 +143,8 @@ public class BatteryTipDialogFragmentTest { Robolectric.getForegroundThreadScheduler().advanceToLastPostedRunnable(); - final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog(); - ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog); assertThat(shadowDialog.getTitle()).isEqualTo("Restrict 2 apps?"); assertThat(shadowDialog.getMessage()) @@ -171,8 +172,8 @@ public class BatteryTipDialogFragmentTest { Robolectric.getForegroundThreadScheduler().advanceToLastPostedRunnable(); - final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog(); - ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog); assertThat(shadowDialog.getTitle()).isEqualTo("Restrict 6 apps?"); assertThat(shadowDialog.getMessage()) @@ -189,8 +190,8 @@ public class BatteryTipDialogFragmentTest { FragmentTestUtils.startFragment(mDialogFragment); - final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog(); - ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog); assertThat(shadowDialog.getTitle()).isEqualTo("Remove restriction?"); assertThat(shadowDialog.getMessage()) @@ -204,8 +205,8 @@ public class BatteryTipDialogFragmentTest { FragmentTestUtils.startFragment(mDialogFragment); - final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog(); - ShadowAlertDialog shadowDialog = Shadows.shadowOf(dialog); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog); assertThat(shadowDialog.getMessage()).isEqualTo( "Your apps are using a normal amount of battery. If apps use too much battery, " diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java index b0d6a7dce49..3ada030de41 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java @@ -28,9 +28,13 @@ import android.os.PowerManager; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.BatteryUtils; +import com.android.settings.fuelgauge.batterytip.tips.AppLabelPredicate; +import com.android.settings.fuelgauge.batterytip.tips.AppRestrictionPredicate; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; +import com.android.settings.testutils.BatteryTestUtils; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -77,6 +81,12 @@ public class BatteryTipLoaderTest { mBatteryTipLoader.mBatteryUtils = mBatteryUtils; } + @After + public void tearDown() { + BatteryTestUtils.clearStaticInstance(AppLabelPredicate.class, "sInstance"); + BatteryTestUtils.clearStaticInstance(AppRestrictionPredicate.class, "sInstance"); + } + @Test public void testLoadBackground_containsAllTipsWithOrder() { final List batteryTips = mBatteryTipLoader.loadInBackground(); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java index 547e0eb455f..053a7164345 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java @@ -49,7 +49,8 @@ public class BatteryTipPolicyTest { + ",test_battery_saver_tip=true" + ",test_high_usage_tip=false" + ",test_smart_battery_tip=true" - + ",test_low_battery_tip=true"; + + ",test_low_battery_tip=true" + + ",app_restriction_active_hour=6"; private Context mContext; @Before @@ -72,6 +73,7 @@ public class BatteryTipPolicyTest { assertThat(batteryTipPolicy.highUsagePeriodMs).isEqualTo(2000); assertThat(batteryTipPolicy.highUsageBatteryDraining).isEqualTo(30); assertThat(batteryTipPolicy.appRestrictionEnabled).isTrue(); + assertThat(batteryTipPolicy.appRestrictionActiveHour).isEqualTo(6); assertThat(batteryTipPolicy.reducedBatteryEnabled).isTrue(); assertThat(batteryTipPolicy.reducedBatteryPercent).isEqualTo(30); assertThat(batteryTipPolicy.lowBatteryEnabled).isFalse(); @@ -99,6 +101,7 @@ public class BatteryTipPolicyTest { assertThat(batteryTipPolicy.highUsagePeriodMs).isEqualTo(2 * DateUtils.HOUR_IN_MILLIS); assertThat(batteryTipPolicy.highUsageBatteryDraining).isEqualTo(25); assertThat(batteryTipPolicy.appRestrictionEnabled).isTrue(); + assertThat(batteryTipPolicy.appRestrictionActiveHour).isEqualTo(24); assertThat(batteryTipPolicy.reducedBatteryEnabled).isFalse(); assertThat(batteryTipPolicy.reducedBatteryPercent).isEqualTo(50); assertThat(batteryTipPolicy.lowBatteryEnabled).isTrue(); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java index 459c4e2a03f..3882e8c0e85 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java @@ -17,6 +17,7 @@ package com.android.settings.fuelgauge.batterytip; import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java index 9b0007b55ca..179f2a1586c 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java @@ -34,8 +34,11 @@ import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper; import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager; import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy; +import com.android.settings.fuelgauge.batterytip.tips.AppLabelPredicate; +import com.android.settings.fuelgauge.batterytip.tips.AppRestrictionPredicate; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; +import com.android.settings.testutils.BatteryTestUtils; import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -86,6 +89,7 @@ public class RestrictAppDetectorTest { mContext = spy(RuntimeEnvironment.application); mPolicy = spy(new BatteryTipPolicy(mContext)); + doReturn(mContext).when(mContext).getApplicationContext(); doReturn(mAppOpsManager).when(mContext).getSystemService(AppOpsManager.class); doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManager).checkOpNoThrow( AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, RESTRICTED_UID, RESTRICTED_PACKAGE_NAME); @@ -103,7 +107,12 @@ public class RestrictAppDetectorTest { mRestrictAppDetector = new RestrictAppDetector(mContext, mPolicy); mRestrictAppDetector.mBatteryDatabaseManager = mBatteryDatabaseManager; + } + @After + public void tearDown() { + BatteryTestUtils.clearStaticInstance(AppLabelPredicate.class, "sInstance"); + BatteryTestUtils.clearStaticInstance(AppRestrictionPredicate.class, "sInstance"); } @After 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 5c8b7d9acb7..dd3e281d09c 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 @@ -34,9 +34,11 @@ import android.util.Pair; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.fuelgauge.batterytip.AppInfo; +import com.android.settings.testutils.BatteryTestUtils; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -74,6 +76,7 @@ public class RestrictAppTipTest { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); + doReturn(mContext).when(mContext).getApplicationContext(); doReturn(mPackageManager).when(mContext).getPackageManager(); doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME, PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_ANY_USER); @@ -98,6 +101,12 @@ public class RestrictAppTipTest { mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>()); } + @After + public void tearDown() { + BatteryTestUtils.clearStaticInstance(AppLabelPredicate.class, "sInstance"); + BatteryTestUtils.clearStaticInstance(AppRestrictionPredicate.class, "sInstance"); + } + @Test public void parcelable() { Parcel parcel = Parcel.obtain(); diff --git a/tests/robotests/src/com/android/settings/location/InjectedSettingTest.java b/tests/robotests/src/com/android/settings/location/InjectedSettingTest.java deleted file mode 100644 index 504583773a2..00000000000 --- a/tests/robotests/src/com/android/settings/location/InjectedSettingTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.location; - -import static com.google.common.truth.Truth.assertThat; - -import com.android.settings.testutils.SettingsRobolectricTestRunner; - -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(SettingsRobolectricTestRunner.class) -public final class InjectedSettingTest { - - private static final String TEST_STRING = "test"; - - @Test - public void buildWithoutPackageName_ShouldReturnNull() { - assertThat(((new InjectedSetting.Builder()) - .setClassName(TEST_STRING) - .setTitle(TEST_STRING) - .setSettingsActivity(TEST_STRING).build())).isNull(); - } - - private InjectedSetting getTestSetting() { - return new InjectedSetting.Builder() - .setPackageName(TEST_STRING) - .setClassName(TEST_STRING) - .setTitle(TEST_STRING) - .setSettingsActivity(TEST_STRING).build(); - } - - @Test - public void testEquals() { - InjectedSetting setting1 = getTestSetting(); - InjectedSetting setting2 = getTestSetting(); - assertThat(setting1).isEqualTo(setting2); - } - - @Test - public void testHashCode() { - InjectedSetting setting = getTestSetting(); - assertThat(setting.hashCode()).isEqualTo(1225314048); - } -} diff --git a/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java index ba5decceb70..f0904d03316 100644 --- a/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java @@ -67,7 +67,7 @@ public class LocationServicePreferenceControllerTest { @Mock private PreferenceScreen mScreen; @Mock - private SettingsInjector mSettingsInjector; + private AppSettingsInjector mSettingsInjector; @Mock private DevicePolicyManager mDevicePolicyManager; diff --git a/tests/robotests/src/com/android/settings/notification/BadgingNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/BadgingNotificationPreferenceControllerTest.java index 3d33ec2d544..150a89f5cfe 100644 --- a/tests/robotests/src/com/android/settings/notification/BadgingNotificationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/BadgingNotificationPreferenceControllerTest.java @@ -17,9 +17,12 @@ package com.android.settings.notification; import static android.provider.Settings.Secure.NOTIFICATION_BADGING; + import static com.android.settings.notification.BadgingNotificationPreferenceController.OFF; import static com.android.settings.notification.BadgingNotificationPreferenceController.ON; + import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -27,20 +30,21 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.provider.Settings; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import androidx.preference.TwoStatePreference; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class BadgingNotificationPreferenceControllerTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) diff --git a/tests/robotests/src/com/android/settings/notification/DeletedChannelsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/DeletedChannelsPreferenceControllerTest.java index 5aecadc4ae0..c1428a4bfc9 100644 --- a/tests/robotests/src/com/android/settings/notification/DeletedChannelsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/DeletedChannelsPreferenceControllerTest.java @@ -18,6 +18,7 @@ package com.android.settings.notification; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; + import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock; @@ -31,18 +32,19 @@ import android.app.NotificationManager; import android.content.Context; import android.os.UserManager; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; import org.robolectric.shadows.ShadowApplication; import androidx.preference.Preference; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class DeletedChannelsPreferenceControllerTest { private Context mContext; diff --git a/tests/robotests/src/com/android/settings/notification/PulseNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/PulseNotificationPreferenceControllerTest.java index 71ca554931e..b4f86a7c3fc 100644 --- a/tests/robotests/src/com/android/settings/notification/PulseNotificationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/PulseNotificationPreferenceControllerTest.java @@ -17,7 +17,9 @@ package com.android.settings.notification; import static android.provider.Settings.System.NOTIFICATION_LIGHT_PULSE; + import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -28,6 +30,7 @@ import android.content.res.Resources; import android.provider.Settings; import com.android.settings.core.BasePreferenceController; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; @@ -35,14 +38,13 @@ import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import androidx.preference.TwoStatePreference; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class PulseNotificationPreferenceControllerTest { private Context mContext; diff --git a/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java b/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java index 636248a07af..1d0b71f834f 100644 --- a/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java +++ b/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java @@ -20,9 +20,8 @@ import static com.google.common.truth.Truth.assertThat; import com.android.settings.password.ConfirmDeviceCredentialBaseFragment.LastTryDialog; import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settings.testutils.shadow.SettingsShadowResources; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; @@ -32,13 +31,12 @@ import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; @RunWith(SettingsRobolectricTestRunner.class) -@Config(shadows = SettingsShadowResources.SettingsShadowTheme.class) +@Config(shadows = SettingsShadowResourcesImpl.class) public class ConfirmCredentialTest { @Test - @Ignore("b/111193572") public void testLastTryDialogShownExactlyOnce() { FragmentManager fm = Robolectric.buildActivity(FragmentActivity.class). - get().getSupportFragmentManager(); + setup().get().getSupportFragmentManager(); // Launch only one instance at a time. assertThat(LastTryDialog.show( diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java index 627a4a0c56b..d2ec78587ba 100644 --- a/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java +++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java @@ -19,7 +19,6 @@ package com.android.settings.password; import static com.google.common.truth.Truth.assertThat; import static org.robolectric.RuntimeEnvironment.application; -import android.app.AlertDialog; import android.content.ComponentName; import android.content.pm.PackageManager; import android.os.UserHandle; @@ -37,28 +36,29 @@ import com.android.settings.testutils.Robolectric; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowUtils; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Shadows; import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowAlertDialog; import org.robolectric.shadows.ShadowPackageManager; import org.robolectric.util.ReflectionHelpers; import org.robolectric.util.ReflectionHelpers.ClassParameter; import java.util.Arrays; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; @RunWith(SettingsRobolectricTestRunner.class) @Config(shadows = { - SettingsShadowResourcesImpl.class, - SettingsShadowResources.SettingsShadowTheme.class, - ShadowUtils.class + SettingsShadowResourcesImpl.class, + SettingsShadowResources.SettingsShadowTheme.class, + ShadowUtils.class, + ShadowAlertDialogCompat.class }) public class SetupChooseLockPatternTest { @@ -88,7 +88,7 @@ public class SetupChooseLockPatternTest { ShadowPackageManager spm = Shadows.shadowOf(application.getPackageManager()); ComponentName cname = new ComponentName(application, SetupRedactionInterstitial.class); final int componentEnabled = spm.getComponentEnabledSettingFlags(cname) - & PackageManager.COMPONENT_ENABLED_STATE_ENABLED; + & PackageManager.COMPONENT_ENABLED_STATE_ENABLED; assertThat(componentEnabled).isEqualTo(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); } @@ -111,22 +111,20 @@ public class SetupChooseLockPatternTest { assertThat(button.getVisibility()).isEqualTo(View.VISIBLE); button.performClick(); - AlertDialog chooserDialog = ShadowAlertDialog.getLatestAlertDialog(); + AlertDialog chooserDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); assertThat(chooserDialog).isNotNull(); - int count = Shadows.shadowOf(chooserDialog).getAdapter().getCount(); + int count = chooserDialog.getListView().getCount(); assertThat(count).named("List items shown").isEqualTo(3); } @Config(qualifiers = "sw400dp") @Test - @Ignore("b/111194289") public void sw400dp_shouldShowScreenLockOptions() { verifyScreenLockOptionsShown(); } @Config(qualifiers = "sw400dp-land") @Test - @Ignore("b/111194289") public void sw400dpLandscape_shouldShowScreenLockOptions() { verifyScreenLockOptionsShown(); } @@ -156,7 +154,7 @@ public class SetupChooseLockPatternTest { assertThat(skipButton.getVisibility()).isEqualTo(View.VISIBLE); skipButton.performClick(); - AlertDialog chooserDialog = ShadowAlertDialog.getLatestAlertDialog(); + AlertDialog chooserDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); assertThat(chooserDialog).isNotNull(); } diff --git a/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java b/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java index 57cf7cdd897..aa36b3367ef 100644 --- a/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java +++ b/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java @@ -16,30 +16,30 @@ package com.android.settings.password; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import android.app.AlertDialog; +import static com.google.common.truth.Truth.assertThat; import com.android.settings.R; import com.android.settings.testutils.Robolectric; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.SettingsShadowResources; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowUtils; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowAlertDialog; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; @RunWith(SettingsRobolectricTestRunner.class) @Config(shadows = { - SettingsShadowResources.SettingsShadowTheme.class, - ShadowUtils.class + SettingsShadowResources.SettingsShadowTheme.class, + ShadowUtils.class, + ShadowAlertDialogCompat.class, + SettingsShadowResourcesImpl.class }) public class SetupSkipDialogTest { @@ -55,12 +55,12 @@ public class SetupSkipDialogTest { SetupSkipDialog setupSkipDialog = SetupSkipDialog.newInstance(false); setupSkipDialog.show(mActivity.getSupportFragmentManager()); - AlertDialog alertDialog = ShadowAlertDialog.getLatestAlertDialog(); - assertNotNull(alertDialog); - ShadowAlertDialog shadowAlertDialog = Shadows.shadowOf(alertDialog); - assertEquals(mActivity.getString(R.string.lock_screen_intro_skip_title), + AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(alertDialog).isNotNull(); + ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog); + assertThat(mActivity.getString(R.string.lock_screen_intro_skip_title)).isEqualTo( shadowAlertDialog.getTitle()); - assertEquals(mActivity.getString(R.string.lock_screen_intro_skip_dialog_text), + assertThat(mActivity.getString(R.string.lock_screen_intro_skip_dialog_text)).isEqualTo( shadowAlertDialog.getMessage()); } @@ -69,12 +69,12 @@ public class SetupSkipDialogTest { SetupSkipDialog setupSkipDialog = SetupSkipDialog.newInstance(true); setupSkipDialog.show(mActivity.getSupportFragmentManager()); - AlertDialog alertDialog = ShadowAlertDialog.getLatestAlertDialog(); - assertNotNull(alertDialog); - ShadowAlertDialog shadowAlertDialog = Shadows.shadowOf(alertDialog); - assertEquals(mActivity.getString(R.string.lock_screen_intro_skip_title), + AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(alertDialog).isNotNull(); + ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog); + assertThat(mActivity.getString(R.string.lock_screen_intro_skip_title)).isEqualTo( shadowAlertDialog.getTitle()); - assertEquals(mActivity.getString(R.string.lock_screen_intro_skip_dialog_text_frp), + assertThat(mActivity.getString(R.string.lock_screen_intro_skip_dialog_text_frp)).isEqualTo( shadowAlertDialog.getMessage()); } } diff --git a/tests/robotests/src/com/android/settings/security/LockscreenDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/security/LockscreenDashboardFragmentTest.java index 173f56b01d8..7e8c0d52202 100644 --- a/tests/robotests/src/com/android/settings/security/LockscreenDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/security/LockscreenDashboardFragmentTest.java @@ -17,17 +17,22 @@ package com.android.settings.security; import static com.google.common.truth.Truth.assertThat; + import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; 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.content.Context; +import com.android.internal.widget.LockPatternUtils; import com.android.settings.display.AmbientDisplayAlwaysOnPreferenceController; import com.android.settings.display.AmbientDisplayNotificationsPreferenceController; import com.android.settings.gestures.DoubleTapScreenPreferenceController; import com.android.settings.gestures.PickupGesturePreferenceController; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.XmlTestUtils; import com.android.settings.testutils.shadow.ShadowLockPatternUtils; @@ -37,6 +42,7 @@ import com.android.settingslib.core.AbstractPreferenceController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -49,12 +55,18 @@ import java.util.List; }) public class LockscreenDashboardFragmentTest { + @Mock + private LockPatternUtils mLockPatternUtils; + private FakeFeatureFactory mFeatureFactory; private TestFragment mTestFragment; private Context mContext; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); + mFeatureFactory = FakeFeatureFactory.setupForTest(); + when(mFeatureFactory.securityFeatureProvider.getLockPatternUtils(any(Context.class))) + .thenReturn(mLockPatternUtils); mContext = RuntimeEnvironment.application; mTestFragment = spy(new TestFragment()); } @@ -112,6 +124,16 @@ public class LockscreenDashboardFragmentTest { verify(controller).setConfig(any()); } + @Test + public void isPageSearchable_notLocked_shouldNotBeSearchable() { + when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false); + when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(true); + + assertThat(LockscreenDashboardFragment.SEARCH_INDEX_DATA_PROVIDER + .getNonIndexableKeys(mContext)) + .contains("security_lockscreen_settings_screen"); + } + public static class TestFragment extends LockscreenDashboardFragment { @Override protected T use(Class clazz) { diff --git a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java index 2bdab279f6a..eed20099d40 100644 --- a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java +++ b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java @@ -19,6 +19,8 @@ package com.android.settings.testutils; import android.content.Intent; import android.os.BatteryManager; +import java.lang.reflect.Field; + public class BatteryTestUtils { public static Intent getChargingIntent() { @@ -47,4 +49,15 @@ public class BatteryTestUtils { return intent; } + public static void clearStaticInstance(Class clazz, String fieldName) { + Field instance; + try { + instance = clazz.getDeclaredField(fieldName); + instance.setAccessible(true); + instance.set(null, null); + } catch (Exception e) { + throw new RuntimeException(); + } + } + } diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowTypedArray.java b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowTypedArray.java new file mode 100644 index 00000000000..fc3ff0c1646 --- /dev/null +++ b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowTypedArray.java @@ -0,0 +1,47 @@ +/* + * 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.testutils.shadow; + +import static org.robolectric.shadow.api.Shadow.directlyOn; + +import android.content.res.ColorStateList; +import android.content.res.TypedArray; +import android.graphics.Color; + +import androidx.annotation.Nullable; +import androidx.annotation.StyleableRes; + +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +import org.robolectric.annotation.RealObject; +import org.robolectric.shadows.ShadowTypedArray; + +@Implements(value = TypedArray.class, inheritImplementationMethods = true) +public class SettingsShadowTypedArray extends ShadowTypedArray { + + @RealObject + TypedArray realTypedArray; + + @Implementation + @Nullable + public ColorStateList getColorStateList(@StyleableRes int index) { + if (index == com.android.internal.R.styleable.TextView_textColorLink) { + return ColorStateList.valueOf(Color.WHITE); + } + return directlyOn(realTypedArray, TypedArray.class).getColorStateList(index); + } +} diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessPoint.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessPoint.java new file mode 100644 index 00000000000..2cb6964b779 --- /dev/null +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessPoint.java @@ -0,0 +1,31 @@ +/* + * 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.testutils.shadow; + +import com.android.settingslib.wifi.AccessPoint; + +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; + +@Implements(AccessPoint.class) +public class ShadowAccessPoint { + + @Implementation + public String getSavedNetworkSummary() { + return "saved"; + } +} diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowWifiManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowWifiManager.java index e5304daf1bf..65f92a32727 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowWifiManager.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowWifiManager.java @@ -20,13 +20,17 @@ import static org.robolectric.RuntimeEnvironment.application; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; +import android.net.wifi.hotspot2.PasspointConfiguration; import org.robolectric.annotation.HiddenApi; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import org.robolectric.shadow.api.Shadow; -@Implements(WifiManager.class) +import java.util.Collections; +import java.util.List; + +@Implements(value = WifiManager.class, inheritImplementationMethods = true) public class ShadowWifiManager extends org.robolectric.shadows.ShadowWifiManager { public WifiConfiguration savedWifiConfig; @@ -43,6 +47,11 @@ public class ShadowWifiManager extends org.robolectric.shadows.ShadowWifiManager savedWifiConfig = config; } + @Implementation + public List getPasspointConfigurations() { + return Collections.emptyList(); + } + public static ShadowWifiManager get() { return Shadow.extract(application.getSystemService(WifiManager.class)); } diff --git a/tests/robotests/src/com/android/settings/widget/BottomLabelLayoutTest.java b/tests/robotests/src/com/android/settings/widget/BottomLabelLayoutTest.java index ea0d89ad81f..7b7bcfaa401 100644 --- a/tests/robotests/src/com/android/settings/widget/BottomLabelLayoutTest.java +++ b/tests/robotests/src/com/android/settings/widget/BottomLabelLayoutTest.java @@ -23,14 +23,14 @@ import android.widget.LinearLayout; import android.widget.Space; import com.android.settings.R; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class BottomLabelLayoutTest { private BottomLabelLayout mBottomLabelLayout; diff --git a/tests/robotests/src/com/android/settings/widget/UsageGraphTest.java b/tests/robotests/src/com/android/settings/widget/UsageGraphTest.java index 15658d5aca4..4b23e7f8627 100644 --- a/tests/robotests/src/com/android/settings/widget/UsageGraphTest.java +++ b/tests/robotests/src/com/android/settings/widget/UsageGraphTest.java @@ -17,6 +17,7 @@ package com.android.settings.widget; import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -25,15 +26,15 @@ import android.content.Context; import android.content.res.Resources; import android.util.SparseIntArray; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settingslib.R; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) public class UsageGraphTest { private UsageGraph mGraph; diff --git a/tests/robotests/src/com/android/settings/widget/VideoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/widget/VideoPreferenceControllerTest.java new file mode 100644 index 00000000000..ad56fe6692b --- /dev/null +++ b/tests/robotests/src/com/android/settings/widget/VideoPreferenceControllerTest.java @@ -0,0 +1,76 @@ +/* + * 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.widget; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE; +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.anyBoolean; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +import androidx.preference.PreferenceScreen; + +@RunWith(RobolectricTestRunner.class) +public class VideoPreferenceControllerTest { + + @Mock + private VideoPreference mPreference; + @Mock + private PreferenceScreen mScreen; + + private VideoPreferenceController mController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mController = new VideoPreferenceController(RuntimeEnvironment.application, "test_pref"); + when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); + } + + @Test + public void getAvailabilityStatus_isAlwaysAvailable() { + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_UNSEARCHABLE); + } + + @Test + public void onPause_shouldCallOnViewInvisibleOnPrefernece() { + mController.displayPreference(mScreen); + + mController.onPause(); + + verify(mPreference).onViewInvisible(); + } + + @Test + public void onResume_shouldCallOnViewVisibleOnPrefernece() { + mController.displayPreference(mScreen); + + mController.onResume(); + + verify(mPreference).onViewVisible(anyBoolean()); + } + +} diff --git a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java index 8cdecff0258..e80edba72a1 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java @@ -24,6 +24,9 @@ import android.net.wifi.WifiConfiguration; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.SettingsShadowResources; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; +import com.android.settings.testutils.shadow.SettingsShadowTypedArray; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowConnectivityManager; import com.android.settings.testutils.shadow.ShadowWifiManager; @@ -34,16 +37,17 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowAlertDialog; import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) @Config(shadows = { - SettingsShadowResources.SettingsShadowTheme.class, - ShadowConnectivityManager.class, - ShadowWifiManager.class -} -) + SettingsShadowResources.SettingsShadowTheme.class, + ShadowConnectivityManager.class, + SettingsShadowTypedArray.class, + ShadowWifiManager.class, + ShadowAlertDialogCompat.class, + SettingsShadowResourcesImpl.class +}) public class WifiDialogActivityTest { private static final String AP1_SSID = "\"ap1\""; @@ -62,7 +66,7 @@ public class WifiDialogActivityTest { @Test public void onSubmit_shouldConnectToNetwork() { WifiDialogActivity activity = Robolectric.setupActivity(WifiDialogActivity.class); - WifiDialog dialog = (WifiDialog) ShadowAlertDialog.getLatestAlertDialog(); + WifiDialog dialog = (WifiDialog) ShadowAlertDialogCompat.getLatestAlertDialog(); assertThat(dialog).isNotNull(); ReflectionHelpers.setField(dialog, "mController", mController); @@ -78,8 +82,9 @@ public class WifiDialogActivityTest { Robolectric.buildActivity( WifiDialogActivity.class, new Intent().putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, false)) - .setup().get(); - WifiDialog dialog = (WifiDialog) ShadowAlertDialog.getLatestAlertDialog(); + .setup().get(); + WifiDialog dialog = (WifiDialog) ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(dialog).isNotNull(); ReflectionHelpers.setField(dialog, "mController", mController); diff --git a/tests/robotests/src/com/android/settings/wifi/WifiDialogTest.java b/tests/robotests/src/com/android/settings/wifi/WifiDialogTest.java index 7025100a99e..7a88131df89 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiDialogTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiDialogTest.java @@ -25,15 +25,7 @@ public class WifiDialogTest { private Context mContext = RuntimeEnvironment.application; - private WifiDialogListener mListener = new WifiDialogListener() { - @Override - public void onForget(WifiDialog dialog) { - } - - @Override - public void onSubmit(WifiDialog dialog) { - } - }; + private WifiDialogListener mListener = new WifiDialogListener() {}; @Before public void setUp() { diff --git a/tests/robotests/src/com/android/settings/wifi/WifiScanningRequiredFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/WifiScanningRequiredFragmentTest.java index 995ad176d69..d37b66768f8 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiScanningRequiredFragmentTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiScanningRequiredFragmentTest.java @@ -27,7 +27,6 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import android.app.AlertDialog; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; @@ -45,6 +44,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; @RunWith(SettingsRobolectricTestRunner.class) diff --git a/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java b/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java index 252e7eddaa4..7e3ce6fac86 100644 --- a/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java @@ -20,11 +20,10 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; import android.app.Activity; -import android.content.Context; import android.net.wifi.WifiManager; -import android.view.inputmethod.InputMethodManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; import com.android.settings.testutils.shadow.ShadowNfcAdapter; import org.junit.After; @@ -33,16 +32,14 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.RuntimeEnvironment; +import org.robolectric.Robolectric; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) -@Config(shadows = ShadowNfcAdapter.class) +@Config(shadows = {ShadowNfcAdapter.class, SettingsShadowResourcesImpl.class}) public class WriteWifiConfigToNfcDialogTest { - @Mock - private Activity mActivity; @Mock private WifiManager mWifiManager; @@ -51,13 +48,10 @@ public class WriteWifiConfigToNfcDialogTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - when(mActivity.getApplicationContext()).thenReturn(mActivity); - when(mActivity.getSystemService(Context.INPUT_METHOD_SERVICE)) - .thenReturn(ReflectionHelpers.newInstance(InputMethodManager.class)); - mWriteWifiConfigToNfcDialog = new WriteWifiConfigToNfcDialog(RuntimeEnvironment.application, - 0 /* security */); + final Activity activity = Robolectric.setupActivity(Activity.class); + mWriteWifiConfigToNfcDialog = new WriteWifiConfigToNfcDialog(activity, 0 /* security */); ReflectionHelpers.setField(mWriteWifiConfigToNfcDialog, "mWifiManager", mWifiManager); - mWriteWifiConfigToNfcDialog.setOwnerActivity(mActivity); + mWriteWifiConfigToNfcDialog.setOwnerActivity(activity); mWriteWifiConfigToNfcDialog.onCreate(null /* savedInstanceState */); } diff --git a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceControllerTest.java new file mode 100644 index 00000000000..790739aec8b --- /dev/null +++ b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceControllerTest.java @@ -0,0 +1,135 @@ +/* + * 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.savedaccesspoints; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.net.wifi.WifiConfiguration; + +import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceScreen; + +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.ShadowAccessPoint; +import com.android.settings.testutils.shadow.ShadowThreadUtils; +import com.android.settings.testutils.shadow.ShadowWifiManager; +import com.android.settingslib.wifi.AccessPointPreference; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {ShadowThreadUtils.class, ShadowWifiManager.class}) +public class SavedAccessPointsPreferenceControllerTest { + + @Mock + private PreferenceScreen mPreferenceScreen; + @Mock + private PreferenceCategory mPreferenceCategory; + + private Context mContext; + private ShadowWifiManager mWifiManager; + private SavedAccessPointsPreferenceController mController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; + mWifiManager = ShadowWifiManager.get(); + mController = spy(new SavedAccessPointsPreferenceController(mContext, "test_key")); + + when(mPreferenceScreen.findPreference(mController.getPreferenceKey())) + .thenReturn(mPreferenceCategory); + when(mPreferenceCategory.getContext()).thenReturn(mContext); + } + + @Test + public void getAvailability_alwaysAvailable() { + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); + } + + @Test + public void onStart_shouldRefreshApList() { + doNothing().when(mController).refreshSavedAccessPoints(); + + mController.onStart(); + + verify(mController).refreshSavedAccessPoints(); + } + + + @Test + public void postRefresh_shouldRefreshApList() { + doNothing().when(mController).refreshSavedAccessPoints(); + + mController.postRefreshSavedAccessPoints(); + + verify(mController).refreshSavedAccessPoints(); + } + + @Test + public void forget_onSuccess_shouldRefreshApList() { + doNothing().when(mController).refreshSavedAccessPoints(); + + mController.onSuccess(); + + verify(mController).refreshSavedAccessPoints(); + } + + @Test + public void forget_onFailure_shouldRefreshApList() { + doNothing().when(mController).refreshSavedAccessPoints(); + + mController.onFailure(0 /* reason */); + + verify(mController).refreshSavedAccessPoints(); + } + + @Test + @Config(shadows = ShadowAccessPoint.class) + public void refreshSavedAccessPoints_shouldListAllAPs() { + final WifiConfiguration config = new WifiConfiguration(); + config.SSID = "SSID"; + config.BSSID = "BSSID"; + config.networkId = 2; + mWifiManager.addNetwork(config); + + final ArgumentCaptor captor = + ArgumentCaptor.forClass(AccessPointPreference.class); + mController.displayPreference(mPreferenceScreen); + mController.refreshSavedAccessPoints(); + + verify(mPreferenceCategory).addPreference(captor.capture()); + + final AccessPointPreference pref = captor.getValue(); + assertThat(pref.getTitle()).isEqualTo(config.SSID); + } +} diff --git a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettingsTest.java index 8ce2a3332f7..97ad7d9b2f3 100644 --- a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettingsTest.java +++ b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettingsTest.java @@ -16,20 +16,22 @@ package com.android.settings.wifi.savedaccesspoints; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; +import static com.google.common.truth.Truth.assertThat; + +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.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; -import android.net.wifi.WifiManager.ActionListener; -import android.os.Handler; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.wifi.WifiConfigController; import com.android.settings.wifi.WifiDialog; +import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.wifi.AccessPoint; import org.junit.Before; @@ -43,68 +45,66 @@ import org.robolectric.util.ReflectionHelpers; public class SavedAccessPointsWifiSettingsTest { @Mock - private WifiManager mockWifiManager; + private WifiManager mWifiManager; @Mock - private WifiDialog mockWifiDialog; + private WifiDialog mWifiDialog; @Mock - private WifiConfigController mockConfigController; + private WifiConfigController mConfigController; @Mock - private WifiConfiguration mockWifiConfiguration; + private WifiConfiguration mWifiConfiguration; @Mock - private AccessPoint mockAccessPoint; + private AccessPoint mAccessPoint; @Mock - private Handler mHandler; + private SavedAccessPointsPreferenceController mSavedApController; - private SavedAccessPointsWifiSettings mSettings; + private TestFragment mSettings; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mSettings = new SavedAccessPointsWifiSettings(); - ReflectionHelpers.setField(mSettings, "mHandler", mHandler); - ReflectionHelpers.setField(mSettings, "mWifiManager", mockWifiManager); + mSettings = spy(new TestFragment()); - when(mockWifiDialog.getController()).thenReturn(mockConfigController); - when(mockConfigController.getConfig()).thenReturn(mockWifiConfiguration); + doReturn(mSavedApController).when(mSettings) + .use(SavedAccessPointsPreferenceController.class); + + ReflectionHelpers.setField(mSettings, "mWifiManager", mWifiManager); + + when(mWifiDialog.getController()).thenReturn(mConfigController); + when(mConfigController.getConfig()).thenReturn(mWifiConfiguration); } @Test - public void onForget_isPasspointConfig_shouldSendMessageToHandler() { - final AccessPoint accessPoint = mock(AccessPoint.class); - when(accessPoint.isPasspointConfig()).thenReturn(true); - ReflectionHelpers.setField(mSettings, "mSelectedAccessPoint", accessPoint); + public void onForget_isPasspointConfig_shouldRefreshAPList() { + when(mAccessPoint.isPasspointConfig()).thenReturn(true); + ReflectionHelpers.setField(mSettings, "mSelectedAccessPoint", mAccessPoint); mSettings.onForget(null); - verify(mHandler).sendEmptyMessage(SavedAccessPointsWifiSettings.MSG_UPDATE_PREFERENCES); - } - - @Test - public void onForget_onSuccess_shouldSendMessageToHandler() { - mSettings.mForgetListener.onSuccess(); - - verify(mHandler).sendEmptyMessage(SavedAccessPointsWifiSettings.MSG_UPDATE_PREFERENCES); - } - - @Test - public void onForget_onFailure_shouldSendMessageToHandler() { - mSettings.mForgetListener.onFailure(0); - - verify(mHandler).sendEmptyMessage(SavedAccessPointsWifiSettings.MSG_UPDATE_PREFERENCES); - } - - @Test - public void onSubmit_shouldInvokeSaveApi() { - mSettings.onSubmit(mockWifiDialog); - verify(mockWifiManager).save(eq(mockWifiConfiguration), any(ActionListener.class)); + verify(mSavedApController).postRefreshSavedAccessPoints(); } @Test public void onForget_shouldInvokeForgetApi() { - ReflectionHelpers.setField(mSettings, "mSelectedAccessPoint", mockAccessPoint); - when(mockAccessPoint.getConfig()).thenReturn(mockWifiConfiguration); - mSettings.onForget(mockWifiDialog); - verify(mockWifiManager) - .forget(eq(mockWifiConfiguration.networkId), any(ActionListener.class)); + ReflectionHelpers.setField(mSettings, "mSelectedAccessPoint", mAccessPoint); + when(mAccessPoint.getConfig()).thenReturn(mWifiConfiguration); + + mSettings.onForget(mWifiDialog); + + verify(mWifiManager) + .forget(mWifiConfiguration.networkId, mSavedApController); + } + + @Test + public void verifyConstants() { + assertThat(mSettings.getMetricsCategory()).isEqualTo(MetricsEvent.WIFI_SAVED_ACCESS_POINTS); + assertThat(mSettings.getPreferenceScreenResId()) + .isEqualTo(R.xml.wifi_display_saved_access_points); + } + + public static class TestFragment extends SavedAccessPointsWifiSettings { + + public T use(Class clazz) { + return super.use(clazz); + } } }