Merge "[BiometricsV2] Ignore ui tests" into main
diff --git a/Android.bp b/Android.bp
index 3055863..ca4971e 100644
--- a/Android.bp
+++ b/Android.bp
@@ -105,6 +105,7 @@
"android.hardware.dumpstate-V1.1-java",
"android.hardware.dumpstate-V1-java",
"lottie",
+ "BiometricsSharedLib",
"WifiTrackerLib",
"SettingsLibActivityEmbedding",
"Settings-change-ids",
diff --git a/res/layout/battery_chart_graph.xml b/res/layout/battery_chart_graph.xml
index f116c8e..9e816ed 100644
--- a/res/layout/battery_chart_graph.xml
+++ b/res/layout/battery_chart_graph.xml
@@ -27,6 +27,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="16dp"
+ android:textAlignment="viewStart"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary"
android:text="@string/battery_usage_chart_graph_hint_last_full_charge" />
@@ -40,7 +41,7 @@
<com.android.settings.fuelgauge.batteryusage.BatteryChartView
android:id="@+id/daily_battery_chart"
android:layout_width="match_parent"
- android:layout_height="170dp"
+ android:layout_height="@dimen/chartview_layout_height"
android:layout_marginBottom="16dp"
android:visibility="gone"
android:contentDescription="@string/daily_battery_usage_chart"
@@ -50,7 +51,7 @@
<com.android.settings.fuelgauge.batteryusage.BatteryChartView
android:id="@+id/hourly_battery_chart"
android:layout_width="match_parent"
- android:layout_height="170dp"
+ android:layout_height="@dimen/chartview_layout_height"
android:layout_marginBottom="16dp"
android:visibility="visible"
android:contentDescription="@string/hourly_battery_usage_chart"
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 1d79b68..a8ad434 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -390,6 +390,12 @@
<dimen name="chartview_text_padding">6dp</dimen>
<dimen name="chartview_divider_width">1dp</dimen>
<dimen name="chartview_divider_height">4dp</dimen>
+ <dimen name="chartview_transom_width">4dp</dimen>
+ <dimen name="chartview_transom_radius">4dp</dimen>
+ <dimen name="chartview_transom_icon_size">12dp</dimen>
+ <dimen name="chartview_transom_padding_top">2dp</dimen>
+ <dimen name="chartview_transom_layout_height">12dp</dimen>
+ <dimen name="chartview_layout_height">182dp</dimen>
<dimen name="chartview_trapezoid_radius">5dp</dimen>
<dimen name="chartview_trapezoid_margin_start">1dp</dimen>
<dimen name="chartview_trapezoid_margin_bottom">2dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a4f709d..5014a66 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -257,6 +257,8 @@
<string name="connected_device_other_device_title">Other devices</string>
<!-- Title for connected device group [CHAR LIMIT=none]-->
<string name="connected_device_saved_title">Saved devices</string>
+ <!-- Title for fast pair device group [CHAR LIMIT=none]-->
+ <string name="connected_device_fast_pair_device_title">Associated with account</string>
<!-- Summary for preference to add a device [CHAR LIMIT=none]-->
<string name="connected_device_add_device_summary">Bluetooth will turn on to pair</string>
<!-- Title for other connection preferences [CHAR LIMIT=none]-->
@@ -1175,13 +1177,38 @@
<!-- Title for the subpage in the "Security & privacy". This page consists of the more security and privacy settings. Can be navigated by Settings -> Security & privacy -> More security & privacy [CHAR LIMIT=NONE] -->
<string name="more_security_privacy_settings">More security & privacy</string>
- <!-- Title for the section that has security entries in the More security & privacy page. [CHAR LIMIT=60] -->
+ <!-- Title for the section that has security entries in the More security & privacy page. Also used for Private Space security category. [CHAR LIMIT=60] -->
<string name="security_header">Security</string>
<!-- Title for the section that has privacy entries in the More security & privacy page. [CHAR LIMIT=60] -->
<string name="privacy_header">Privacy</string>
<!-- Title for the section that has work profile entries in the More security & privacy page. [CHAR LIMIT=60] -->
<string name="work_profile_category_header">Work profile</string>
+ <!-- Title for the Private Space page. [CHAR LIMIT=60] -->
+ <string name="private_space_title">Private Space</string>
+ <!-- Summary for the Private Space page. [CHAR LIMIT=NONE] -->
+ <string name="private_space_summary">Hide apps in a private folder</string>
+ <!-- Title for the Private Space one lock preference. [CHAR LIMIT=60] -->
+ <string name="private_space_one_lock_title">Unlock using screen lock</string>
+ <!-- Title for the preference to hide Private Space. [CHAR LIMIT=60] -->
+ <string name="private_space_hide_title">Show Private Space</string>
+ <!-- System category for the Private Space page. [CHAR LIMIT=30] -->
+ <string name="private_space_category_system">System</string>
+ <!-- Title for the preference to create Private Space. [CHAR LIMIT=60] -->
+ <string name="private_space_create_title">Create Private Space</string>
+ <!-- Title for the preference to delete Private Space. [CHAR LIMIT=60] -->
+ <string name="private_space_delete_title">Delete Private Space</string>
+ <!-- Toast to show when the private space was created. [CHAR LIMIT=NONE] -->
+ <string name="private_space_created">Private Space successfully created</string>
+ <!-- Toast to show when the private space already exists. [CHAR LIMIT=NONE] -->
+ <string name="private_space_already_exists">Private Space already exists</string>
+ <!-- Toast to show when the private space could not be created. [CHAR LIMIT=NONE] -->
+ <string name="private_space_create_failed">Private Space could not be created</string>
+ <!-- Toast to show when the private space was deleted. [CHAR LIMIT=NONE] -->
+ <string name="private_space_deleted">Private Space successfully deleted</string>
+ <!-- Toast to show when the private space could not be deleted. [CHAR LIMIT=NONE] -->
+ <string name="private_space_delete_failed">Private Space could not be deleted</string>
+
<!-- Text shown when "Add fingerprint" button is disabled -->
<string name="fingerprint_add_max">You can add up to <xliff:g id="count" example="5">%d</xliff:g> fingerprints</string>
<!-- Text shown when users has enrolled a maximum number of fingerprints [CHAR LIMIT=NONE] -->
@@ -10037,7 +10064,7 @@
<!-- Title text for edge to edge navigation [CHAR LIMIT=60] -->
<string name="edge_to_edge_navigation_title">Gesture navigation</string>
<!-- Summary text for edge to edge navigation [CHAR LIMIT=NONE] -->
- <string name="edge_to_edge_navigation_summary">To go Home, swipe up from the bottom of the screen. To switch apps, swipe up from the bottom, hold, then release. To go back, swipe from either the left or right edge.</string>
+ <string name="edge_to_edge_navigation_summary">To go home, swipe up from the bottom of the screen. To switch apps, swipe up from the bottom, hold, then release. To go back, swipe from either the left or right edge.</string>
<!-- Title text for 3-button navigation [CHAR LIMIT=60] -->
<string name="legacy_navigation_title">3-button navigation</string>
@@ -12135,6 +12162,11 @@
<!-- The summary of the head tracking [CHAR LIMIT=none] -->
<string name="bluetooth_details_head_tracking_summary">Audio changes as you move your head to sound more natural</string>
+ <!-- The title of CDM Permissions Sync -->
+ <string name="bluetooth_details_permissions_sync_title">Sync permissions from phone</string>
+ <!-- The summary of CDM Permissions Sync -->
+ <string name="bluetooth_details_permissions_sync_summary">Give your watch the same app permissions that you’ve allowed on this phone</string>
+
<!-- The title of the bluetooth audio device type selection [CHAR LIMIT=none] -->
<string name="bluetooth_details_audio_device_types_title">Audio Device Type</string>
<!-- The audio device type corresponding to unknown device type [CHAR LIMIT=none] -->
@@ -12245,11 +12277,13 @@
<!-- [CHAR LIMIT=60] Aspect ratio title setting to choose app aspect ratio -->
<string name="aspect_ratio_title">Aspect ratio</string>
<!-- [CHAR LIMIT=NONE] Aspect ratio setting summary to choose aspect ratio for apps unoptimized for device -->
- <string name="aspect_ratio_summary">Choose an aspect ratio to view this app if it hasn\'t been designed to fit your <xliff:g id="device_name">%1$s</xliff:g></string>
+ <string name="aspect_ratio_summary">Try a new aspect ratio to view this app if it hasn\'t been designed to fit your <xliff:g id="device_name">%1$s</xliff:g></string>
+ <!-- [CHAR LIMIT=NONE] Aspect ratio setting main summary on page to choose aspect ratio for apps unoptimized for device -->
+ <string name="aspect_ratio_main_summary">Try a new aspect ratio to view this app if it hasn\'t been designed to fit your <xliff:g id="device_name">%1$s</xliff:g>. Some apps may not be optimized for certain aspect ratios.</string>
<!-- [CHAR LIMIT=NONE] Aspect ratio suggested apps filter label -->
<string name="user_aspect_ratio_suggested_apps_label">Suggested apps</string>
- <!-- [CHAR LIMIT=NONE] Filter label for apps that have user aspect ratio override applied -->
- <string name="user_aspect_ratio_overridden_apps_label">Apps you have overridden</string>
+ <!-- [CHAR LIMIT=14] Filter label for apps that have user aspect ratio changed -->
+ <string name="user_aspect_ratio_changed_apps_label">Changed apps</string>
<!-- [CHAR LIMIT=NONE] App default aspect ratio entry -->
<string name="user_aspect_ratio_app_default">App default</string>
<!-- [CHAR LIMIT=NONE] Fullscreen aspect ratio entry -->
@@ -12265,7 +12299,7 @@
<!-- [CHAR LIMIT=NONE] 4:3 aspect ratio entry -->
<string name="user_aspect_ratio_4_3">4:3</string>
<!-- [CHAR LIMIT=NONE] Warning description for app info aspect ratio page -->
- <string name="app_aspect_ratio_footer">The app will restart when you change aspect ratio. You may lose unsaved changes.</string>
+ <string name="app_aspect_ratio_footer">The app will restart when you change aspect ratio. You may lose unsaved changes. Some apps may not be optimized for certain aspect ratios.</string>
<!-- Accessibility label for fingerprint sensor [CHAR LIMIT=NONE] -->
diff --git a/res/xml/apps.xml b/res/xml/apps.xml
index 651ed9b..db46a1a 100644
--- a/res/xml/apps.xml
+++ b/res/xml/apps.xml
@@ -80,18 +80,6 @@
android:order="10"/>
<Preference
- android:key="aspect_ratio_apps"
- android:title="@string/aspect_ratio_title"
- android:summary="@string/summary_placeholder"
- android:order="14"
- settings:controller="com.android.settings.applications.appcompat.UserAspectRatioAppsPreferenceController"
- android:fragment="com.android.settings.applications.manageapplications.ManageApplications">
- <extra android:name="classname"
- android:value="com.android.settings.Settings$UserAspectRatioAppListActivity"/>
- <intent android:action="android.settings.MANAGE_USER_ASPECT_RATIO_SETTINGS"/>
- </Preference>
-
- <Preference
android:key="hibernated_apps"
android:title="@string/unused_apps"
android:summary="@string/summary_placeholder"
@@ -119,4 +107,23 @@
android:title="@string/special_access"
android:order="20"/>
+ <PreferenceCategory
+ android:key="advanced_category"
+ android:title="@string/advanced_apps"
+ android:order="21"
+ android:visibility="gone"
+ settings:searchable="false"/>
+
+ <Preference
+ android:key="aspect_ratio_apps"
+ android:title="@string/aspect_ratio_title"
+ android:summary="@string/summary_placeholder"
+ android:order="22"
+ settings:controller="com.android.settings.applications.appcompat.UserAspectRatioAppsPreferenceController"
+ android:fragment="com.android.settings.applications.manageapplications.ManageApplications">
+ <extra android:name="classname"
+ android:value="com.android.settings.Settings$UserAspectRatioAppListActivity"/>
+ <intent android:action="android.settings.MANAGE_USER_ASPECT_RATIO_SETTINGS"/>
+ </Preference>
+
</PreferenceScreen>
diff --git a/res/xml/bluetooth_device_details_fragment.xml b/res/xml/bluetooth_device_details_fragment.xml
index 8f309a4..12ed8eb 100644
--- a/res/xml/bluetooth_device_details_fragment.xml
+++ b/res/xml/bluetooth_device_details_fragment.xml
@@ -92,6 +92,9 @@
settings:controller="com.android.settings.accessibility.LiveCaptionPreferenceController"/>
</PreferenceCategory>
+ <PreferenceCategory
+ android:key="data_sync_group"/>
+
<Preference
android:key="keyboard_settings"
android:persistent="false"
diff --git a/res/xml/connected_devices.xml b/res/xml/connected_devices.xml
index 5d7e0a8..830ed87 100644
--- a/res/xml/connected_devices.xml
+++ b/res/xml/connected_devices.xml
@@ -63,7 +63,7 @@
<PreferenceCategory
android:key="fast_pair_devices"
- android:title="TODO(296507968): Placeholder"
+ android:title="@string/connected_device_fast_pair_device_title"
settings:controller=
"com.android.settings.connecteddevice.fastpair.FastPairDevicePreferenceController">
diff --git a/res/xml/fast_pair_devices.xml b/res/xml/fast_pair_devices.xml
index f549ff4..7e72cd7 100644
--- a/res/xml/fast_pair_devices.xml
+++ b/res/xml/fast_pair_devices.xml
@@ -17,7 +17,8 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:settings="http://schemas.android.com/apk/res-auto">
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:title="@string/connected_device_fast_pair_device_title">
<PreferenceCategory
android:key="fast_pair_device_list"
diff --git a/res/xml/private_space_settings.xml b/res/xml/private_space_settings.xml
new file mode 100644
index 0000000..08053e0
--- /dev/null
+++ b/res/xml/private_space_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2023 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.
+ -->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="private_space_title"
+ android:title="@string/private_space_title">
+
+ <PreferenceCategory
+ android:title="@string/security_header">
+
+ <SwitchPreference
+ android:key="private_space_use_one_lock"
+ android:title="@string/private_space_one_lock_title"
+ settings:controller="com.android.settings.privatespace.UseOneLockController"
+ settings:searchable="false" />
+
+ <SwitchPreference
+ android:key="private_space_hidden"
+ android:title="@string/private_space_hide_title"
+ settings:controller="com.android.settings.privatespace.HidePrivateSpaceController"
+ settings:searchable="false" />
+
+ </PreferenceCategory>
+
+ <PreferenceCategory
+ android:title="@string/private_space_category_system">
+
+ <Preference
+ android:key="private_space_create"
+ android:title="@string/private_space_create_title"
+ settings:controller="com.android.settings.privatespace.CreatePrivateSpaceController"
+ settings:searchable="false" />
+
+ <Preference
+ android:key="private_space_delete"
+ android:title="@string/private_space_delete_title"
+ settings:controller="com.android.settings.privatespace.DeletePrivateSpaceController"
+ settings:searchable="false" />
+
+ </PreferenceCategory>
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/reset_dashboard_fragment.xml b/res/xml/reset_dashboard_fragment.xml
index 3bd7a13..08852c9 100644
--- a/res/xml/reset_dashboard_fragment.xml
+++ b/res/xml/reset_dashboard_fragment.xml
@@ -57,5 +57,13 @@
settings:keywords="@string/keywords_factory_data_reset"
settings:userRestriction="no_factory_reset"
settings:useAdminDisabledSummary="true"
+ settings:controller="com.android.settings.system.FactoryResetPreferenceController"
+ android:fragment="com.android.settings.MainClear" />
+
+ <Preference
+ android:key="factory_reset_demo_user"
+ android:title="@string/main_clear_title"
+ settings:keywords="@string/keywords_factory_data_reset"
+ settings:controller="com.android.settings.system.FactoryResetDemoUserPreferenceController"
android:fragment="com.android.settings.MainClear" />
</PreferenceScreen>
diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java
index b559b47..55d0af9 100644
--- a/src/com/android/settings/MainClear.java
+++ b/src/com/android/settings/MainClear.java
@@ -571,7 +571,7 @@
UserHandle.myUserId());
if (disallow && !Utils.isDemoUser(context)) {
return inflater.inflate(R.layout.main_clear_disallowed_screen, null);
- } else if (admin != null) {
+ } else if (admin != null && !Utils.isDemoUser(context)) {
new ActionDisabledByAdminDialogHelper(getActivity())
.prepareDialogBuilder(UserManager.DISALLOW_FACTORY_RESET, admin)
.setOnDismissListener(__ -> getActivity().finish())
diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
index 4ba634c..182e5ae 100644
--- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
+++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
@@ -302,8 +302,36 @@
null);
}
+ private Set<ComponentName> buildComponentNameSet(List<CredentialProviderInfo> providers) {
+ Set<ComponentName> output = new HashSet<>();
+
+ for (CredentialProviderInfo cpi : providers) {
+ output.add(cpi.getComponentName());
+ }
+
+ return output;
+ }
+
private void updateFromExternal() {
- update();
+ if (mCredentialManager == null) {
+ return;
+ }
+
+ // Get the list of new providers and components.
+ List<CredentialProviderInfo> newProviders =
+ mCredentialManager.getCredentialProviderServices(
+ getUser(), CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY);
+ Set<ComponentName> newComponents = buildComponentNameSet(newProviders);
+
+ // Get the list of old components
+ Set<ComponentName> oldComponents = buildComponentNameSet(mServices);
+
+ // If the sets are equal then don't update the UI.
+ if (oldComponents.equals(newComponents)) {
+ return;
+ }
+
+ setAvailableServices(newProviders, null);
if (mPreferenceScreen != null) {
displayPreference(mPreferenceScreen);
diff --git a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollEnrollingView.java b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollEnrollingView.java
index 77b8aea..d17fa24 100644
--- a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollEnrollingView.java
+++ b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollEnrollingView.java
@@ -37,8 +37,8 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
-import com.android.settingslib.udfps.UdfpsOverlayParams;
-import com.android.settingslib.udfps.UdfpsUtils;
+import com.android.systemui.biometrics.UdfpsUtils;
+import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams;
import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupdesign.GlifLayout;
diff --git a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollView.java b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollView.java
index 5ded91e..2d392ff 100644
--- a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollView.java
+++ b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollView.java
@@ -33,7 +33,7 @@
import androidx.annotation.Nullable;
import com.android.settings.R;
-import com.android.settingslib.udfps.UdfpsOverlayParams;
+import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams;
/**
* View corresponding with udfps_enroll_view.xml
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractor.kt
index e7c458d..1f57198 100644
--- a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractor.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractor.kt
@@ -47,6 +47,12 @@
/** Returns the max enrollable fingerprints, note during SUW this might be 1 */
val maxEnrollableFingerprints: Flow<Int>
+ /** Returns true if a user can enroll a fingerprint false otherwise. */
+ val canEnrollFingerprints: Flow<Boolean>
+
+ /** Retrieves the sensor properties of a device */
+ val sensorPropertiesInternal: Flow<FingerprintSensorPropertiesInternal?>
+
/** Runs [FingerprintManager.authenticate] */
suspend fun authenticate(): FingerprintAuthAttemptViewModel
@@ -60,9 +66,6 @@
*/
suspend fun generateChallenge(gateKeeperPasswordHandle: Long): Pair<Long, ByteArray>
- /** Returns true if a user can enroll a fingerprint false otherwise. */
- fun canEnrollFingerprints(numFingerprints: Int): Flow<Boolean>
-
/**
* Removes the given fingerprint, returning true if it was successfully removed and false
* otherwise
@@ -77,9 +80,6 @@
/** Indicates if the press to auth feature has been enabled */
suspend fun pressToAuthEnabled(): Boolean
-
- /** Retrieves the sensor properties of a device */
- suspend fun sensorPropertiesInternal(): List<FingerprintSensorPropertiesInternal>
}
class FingerprintManagerInteractorImpl(
@@ -120,8 +120,15 @@
)
}
- override fun canEnrollFingerprints(numFingerprints: Int): Flow<Boolean> = flow {
- emit(numFingerprints < maxFingerprints)
+ override val canEnrollFingerprints: Flow<Boolean> = flow {
+ emit(
+ fingerprintManager.getEnrolledFingerprints(applicationContext.userId).size < maxFingerprints
+ )
+ }
+
+ override val sensorPropertiesInternal = flow {
+ val sensorPropertiesInternal = fingerprintManager.sensorPropertiesInternal
+ emit(if (sensorPropertiesInternal.isEmpty()) null else sensorPropertiesInternal.first())
}
override val maxEnrollableFingerprints = flow { emit(maxFingerprints) }
@@ -165,11 +172,6 @@
it.resume(pressToAuthProvider())
}
- override suspend fun sensorPropertiesInternal(): List<FingerprintSensorPropertiesInternal> =
- suspendCancellableCoroutine {
- it.resume(fingerprintManager.sensorPropertiesInternal)
- }
-
override suspend fun authenticate(): FingerprintAuthAttemptViewModel =
suspendCancellableCoroutine { c: CancellableContinuation<FingerprintAuthAttemptViewModel> ->
val authenticationCallback =
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt
index 36bdf8d..db28e79 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintViewModel.kt
@@ -16,18 +16,6 @@
package com.android.settings.biometrics.fingerprint2.shared.model
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
-
-/** Represents the fingerprint data nad the relevant state. */
-data class FingerprintStateViewModel(
- val fingerprintViewModels: List<FingerprintViewModel>,
- val canEnroll: Boolean,
- val maxFingerprints: Int,
- val hasSideFps: Boolean,
- val pressToAuth: Boolean,
- val sensorProps: FingerprintSensorPropertiesInternal,
-)
-
data class FingerprintViewModel(
val name: String,
val fingerId: Int,
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
index d497d46..f6d20ae 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
@@ -47,10 +47,10 @@
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Confirmation
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Education
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Enrollment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollmentNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Finish
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Intro
@@ -179,8 +179,10 @@
)[FingerprintEnrollmentNavigationViewModel::class.java]
// Initialize FingerprintViewModel
- ViewModelProvider(this, FingerprintViewModel.FingerprintViewModelFactory(interactor))[
- FingerprintViewModel::class.java]
+ ViewModelProvider(
+ this,
+ FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(interactor)
+ )[FingerprintEnrollViewModel::class.java]
// Initialize scroll view model
ViewModelProvider(this, FingerprintScrollViewModel.FingerprintScrollViewModelFactory())[
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollmentIntroV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollmentIntroV2Fragment.kt
index c7fcb66..f2f925b 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollmentIntroV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollmentIntroV2Fragment.kt
@@ -21,7 +21,6 @@
import android.graphics.Color
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
-import android.hardware.fingerprint.FingerprintSensorProperties
import android.os.Bundle
import android.text.Html
import android.text.method.LinkMovementMethod
@@ -34,11 +33,12 @@
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.android.settings.R
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollmentNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Unicorn
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.google.android.setupcompat.template.FooterBarMixin
import com.google.android.setupcompat.template.FooterButton
import com.google.android.setupdesign.GlifLayout
@@ -76,7 +76,7 @@
private lateinit var footerBarMixin: FooterBarMixin
private lateinit var textModel: TextModel
private lateinit var navigationViewModel: FingerprintEnrollmentNavigationViewModel
- private lateinit var fingerprintStateViewModel: FingerprintViewModel
+ private lateinit var fingerprintEnrollViewModel: FingerprintEnrollViewModel
private lateinit var fingerprintScrollViewModel: FingerprintScrollViewModel
private lateinit var gateKeeperViewModel: FingerprintGatekeeperViewModel
@@ -84,8 +84,8 @@
super.onCreate(savedInstanceState)
navigationViewModel =
ViewModelProvider(requireActivity())[FingerprintEnrollmentNavigationViewModel::class.java]
- fingerprintStateViewModel =
- ViewModelProvider(requireActivity())[FingerprintViewModel::class.java]
+ fingerprintEnrollViewModel =
+ ViewModelProvider(requireActivity())[FingerprintEnrollViewModel::class.java]
fingerprintScrollViewModel =
ViewModelProvider(requireActivity())[FingerprintScrollViewModel::class.java]
gateKeeperViewModel =
@@ -98,13 +98,11 @@
lifecycleScope.launch {
combine(
navigationViewModel.enrollType,
- fingerprintStateViewModel.fingerprintStateViewModel,
- ) { enrollType, fingerprintStateViewModel ->
- Pair(enrollType, fingerprintStateViewModel)
+ fingerprintEnrollViewModel.sensorType,
+ ) { enrollType, sensorType ->
+ Pair(enrollType, sensorType)
}
- .collect { (enrollType, fingerprintStateViewModel) ->
- val sensorProps = fingerprintStateViewModel?.sensorProps
-
+ .collect { (enrollType, sensorType) ->
textModel =
when (enrollType) {
Unicorn -> getUnicornTextModel()
@@ -145,9 +143,9 @@
val iconShield: ImageView = view.requireViewById(R.id.icon_shield)
val footerMessage6: TextView = view.requireViewById(R.id.footer_message_6)
- when (sensorProps?.sensorType) {
- FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC,
- FingerprintSensorProperties.TYPE_UDFPS_OPTICAL -> {
+ when (sensorType) {
+ FingerprintSensorType.UDFPS_ULTRASONIC,
+ FingerprintSensorType.UDFPS_OPTICAL -> {
footerMessage6.visibility = View.VISIBLE
iconShield.visibility = View.VISIBLE
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
new file mode 100644
index 0000000..31fa03d
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2023 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.biometrics.fingerprint2.ui.enrollment.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractor
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.toSensorType
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.map
+
+/** Represents all of the fingerprint information needed for fingerprint enrollment. */
+class FingerprintEnrollViewModel(fingerprintManagerInteractor: FingerprintManagerInteractor) :
+ ViewModel() {
+
+ /** Represents the stream of [FingerprintSensorType] */
+ val sensorType: Flow<FingerprintSensorType> =
+ fingerprintManagerInteractor.sensorPropertiesInternal.filterNotNull().map {
+ it.sensorType.toSensorType()
+ }
+
+ class FingerprintEnrollViewModelFactory(val interactor: FingerprintManagerInteractor) :
+ ViewModelProvider.Factory {
+
+ @Suppress("UNCHECKED_CAST")
+ override fun <T : ViewModel> create(
+ modelClass: Class<T>,
+ ): T {
+ return FingerprintEnrollViewModel(interactor) as T
+ }
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintStateViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintStateViewModel.kt
deleted file mode 100644
index 20e3a0a..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintStateViewModel.kt
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics.fingerprint2.ui.enrollment.viewmodel
-
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintStateViewModel
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.flow.last
-import kotlinx.coroutines.flow.update
-import kotlinx.coroutines.launch
-
-/** Represents all of the fingerprint information needed for fingerprint enrollment. */
-class FingerprintViewModel(fingerprintManagerInteractor: FingerprintManagerInteractor) :
- ViewModel() {
-
- private val _fingerprintViewModel: MutableStateFlow<FingerprintStateViewModel?> =
- MutableStateFlow(null)
-
- /**
- * A flow that contains a [FingerprintStateViewModel] which contains the relevant information for
- * enrollment
- */
- val fingerprintStateViewModel: Flow<FingerprintStateViewModel?> =
- _fingerprintViewModel.asStateFlow()
-
- init {
- viewModelScope.launch {
- val enrolledFingerprints =
- fingerprintManagerInteractor.enrolledFingerprints.last().map {
- com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel(
- it.name,
- it.fingerId,
- it.deviceId
- )
- }
- val sensorProps = fingerprintManagerInteractor.sensorPropertiesInternal().first()
- val maxFingerprints = 5
- _fingerprintViewModel.update {
- FingerprintStateViewModel(
- enrolledFingerprints,
- enrolledFingerprints.size < maxFingerprints,
- maxFingerprints,
- sensorProps.isAnySidefpsType,
- false,
- sensorProps,
- )
- }
- }
- }
-
- class FingerprintViewModelFactory(val interactor: FingerprintManagerInteractor) :
- ViewModelProvider.Factory {
-
- @Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(
- modelClass: Class<T>,
- ): T {
-
- return FingerprintViewModel(interactor) as T
- }
- }
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
index 6a44630..9f42d81 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
@@ -20,7 +20,6 @@
import android.util.Log
import androidx.lifecycle.LifecycleCoroutineScope
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintStateViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
import com.android.settings.biometrics.fingerprint2.ui.settings.binder.FingerprintSettingsViewBinder.FingerprintView
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.EnrollAdditionalFingerprint
@@ -35,6 +34,7 @@
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.ShowSettings
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
+import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.launch
@@ -70,7 +70,11 @@
/** Indicates what result should be set for the returning callee */
fun setResultExternal(resultCode: Int)
/** Indicates the settings UI should be shown */
- fun showSettings(state: FingerprintStateViewModel)
+ fun showSettings(enrolledFingerprints: List<FingerprintViewModel>)
+ /** Updates the add fingerprints preference */
+ fun updateAddFingerprintsPreference(canEnroll: Boolean, maxFingerprints: Int)
+ /** Updates the sfps fingerprints preference */
+ fun updateSfpsPreference(isSfpsPrefVisible: Boolean)
/** Indicates that a user has been locked out */
fun userLockout(authAttemptViewModel: FingerprintAuthAttemptViewModel.Error)
/** Indicates a fingerprint preference should be highlighted */
@@ -93,9 +97,13 @@
/** Result listener for launching enrollments **after** a user has reached the settings page. */
// Settings display flow
+ lifecycleScope.launch { viewModel.enrolledFingerprints.collect { view.showSettings(it) } }
lifecycleScope.launch {
- viewModel.fingerprintState.filterNotNull().collect { view.showSettings(it) }
+ viewModel.addFingerprintPrefInfo.collect { (enablePref, maxFingerprints) ->
+ view.updateAddFingerprintsPreference(enablePref, maxFingerprints)
+ }
}
+ lifecycleScope.launch { viewModel.isSfpsPrefVisible.collect { view.updateSfpsPreference(it) } }
// Dialog flow
lifecycleScope.launch {
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
index 7dcf46a..c818566 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
@@ -47,7 +47,6 @@
import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroductionInternal
import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintStateViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
import com.android.settings.biometrics.fingerprint2.ui.settings.binder.FingerprintSettingsViewBinder
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
@@ -304,44 +303,52 @@
settingsViewModel.onDeleteClicked(fingerprintViewModel)
}
- override fun showSettings(state: FingerprintStateViewModel) {
+ override fun showSettings(enrolledFingerprints: List<FingerprintViewModel>) {
val category =
this@FingerprintSettingsV2Fragment.findPreference(KEY_FINGERPRINTS_ENROLLED_CATEGORY)
as PreferenceCategory?
category?.removeAll()
- state.fingerprintViewModels.forEach { fingerprint ->
+ enrolledFingerprints.forEach { fingerprint ->
category?.addPreference(
FingerprintSettingsPreference(
requireContext(),
fingerprint,
this@FingerprintSettingsV2Fragment,
- state.fingerprintViewModels.size == 1,
+ enrolledFingerprints.size == 1,
)
)
}
category?.isVisible = true
-
- createFingerprintsFooterPreference(state.canEnroll, state.maxFingerprints)
preferenceScreen.isVisible = true
+ addFooter()
+ }
+ override fun updateAddFingerprintsPreference(canEnroll: Boolean, maxFingerprints: Int) {
+ val pref = this@FingerprintSettingsV2Fragment.findPreference<Preference>(KEY_FINGERPRINT_ADD)
+ val maxSummary = context?.getString(R.string.fingerprint_add_max, maxFingerprints) ?: ""
+ pref?.summary = maxSummary
+ pref?.isEnabled = canEnroll
+ pref?.setOnPreferenceClickListener {
+ navigationViewModel.onAddFingerprintClicked()
+ true
+ }
+ pref?.isVisible = true
+ }
+
+ override fun updateSfpsPreference(isSfpsPrefVisible: Boolean) {
val sideFpsPref =
this@FingerprintSettingsV2Fragment.findPreference(KEY_FINGERPRINT_SIDE_FPS_CATEGORY)
as PreferenceCategory?
- sideFpsPref?.isVisible = false
-
- if (state.hasSideFps) {
- sideFpsPref?.isVisible = state.fingerprintViewModels.isNotEmpty()
- val otherPref =
- this@FingerprintSettingsV2Fragment.findPreference(
- KEY_FINGERPRINT_SIDE_FPS_SCREEN_ON_TO_AUTH
- ) as Preference?
- otherPref?.isVisible = state.fingerprintViewModels.isNotEmpty()
- }
- addFooter(state.hasSideFps)
+ sideFpsPref?.isVisible = isSfpsPrefVisible
+ val otherPref =
+ this@FingerprintSettingsV2Fragment.findPreference(KEY_FINGERPRINT_SIDE_FPS_SCREEN_ON_TO_AUTH)
+ as Preference?
+ otherPref?.isVisible = isSfpsPrefVisible
}
- private fun addFooter(hasSideFps: Boolean) {
+
+ private fun addFooter() {
val footer =
this@FingerprintSettingsV2Fragment.findPreference(KEY_FINGERPRINT_FOOTER)
as PreferenceCategory?
@@ -380,10 +387,8 @@
footerColumns.add(column1)
val column2 = FooterColumn()
column2.title = getText(R.string.security_fingerprint_disclaimer_lockscreen_disabled_2)
- if (hasSideFps) {
- column2.learnMoreOverrideText =
- getText(R.string.security_settings_fingerprint_settings_footer_learn_more)
- }
+ column2.learnMoreOverrideText =
+ getText(R.string.security_settings_fingerprint_settings_footer_learn_more)
column2.learnMoreOnClickListener = learnMoreClickListener
footerColumns.add(column2)
} else {
@@ -394,10 +399,8 @@
DeviceHelper.getDeviceName(requireActivity())
)
column.learnMoreOnClickListener = learnMoreClickListener
- if (hasSideFps) {
- column.learnMoreOverrideText =
- getText(R.string.security_settings_fingerprint_settings_footer_learn_more)
- }
+ column.learnMoreOverrideText =
+ getText(R.string.security_settings_fingerprint_settings_footer_learn_more)
footerColumns.add(column)
}
@@ -550,18 +553,6 @@
}
}
- private fun createFingerprintsFooterPreference(canEnroll: Boolean, maxFingerprints: Int) {
- val pref = this@FingerprintSettingsV2Fragment.findPreference<Preference>(KEY_FINGERPRINT_ADD)
- val maxSummary = context?.getString(R.string.fingerprint_add_max, maxFingerprints) ?: ""
- pref?.summary = maxSummary
- pref?.isEnabled = canEnroll
- pref?.setOnPreferenceClickListener {
- navigationViewModel.onAddFingerprintClicked()
- true
- }
- pref?.isVisible = true
- }
-
private fun fingerprintPreferences(): List<FingerprintSettingsPreference?> {
val category =
this@FingerprintSettingsV2Fragment.findPreference(KEY_FINGERPRINTS_ENROLLED_CATEGORY)
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
index fbd0f1d..5770d09 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
@@ -17,27 +17,29 @@
package com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel
import android.hardware.fingerprint.FingerprintManager
-import android.hardware.fingerprint.FingerprintSensorProperties
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintStateViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.toSensorType
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.combineTransform
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flowOn
-import kotlinx.coroutines.flow.last
+import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.sample
+import kotlinx.coroutines.flow.transform
import kotlinx.coroutines.flow.transformLatest
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
@@ -52,13 +54,30 @@
private val backgroundDispatcher: CoroutineDispatcher,
private val navigationViewModel: FingerprintSettingsNavigationViewModel,
) : ViewModel() {
-
- private val _consumerShouldAuthenticate: MutableStateFlow<Boolean> = MutableStateFlow(false)
-
- private val fingerprintSensorPropertiesInternal:
- MutableStateFlow<List<FingerprintSensorPropertiesInternal>?> =
+ private val _enrolledFingerprints: MutableStateFlow<List<FingerprintViewModel>?> =
MutableStateFlow(null)
+ /** Represents the stream of enrolled fingerprints. */
+ val enrolledFingerprints: Flow<List<FingerprintViewModel>> =
+ _enrolledFingerprints.asStateFlow().filterNotNull().filterOnlyWhenSettingsIsShown()
+
+ /** Represents the stream of the information of "Add Fingerprint" preference. */
+ val addFingerprintPrefInfo: Flow<Pair<Boolean, Int>> =
+ _enrolledFingerprints.filterOnlyWhenSettingsIsShown().transform {
+ emit(
+ Pair(
+ fingerprintManagerInteractor.canEnrollFingerprints.first(),
+ fingerprintManagerInteractor.maxEnrollableFingerprints.first()
+ )
+ )
+ }
+
+ /** Represents the stream of visibility of sfps preference. */
+ val isSfpsPrefVisible: Flow<Boolean> =
+ _enrolledFingerprints.filterOnlyWhenSettingsIsShown().transform {
+ emit(fingerprintManagerInteractor.hasSideFps() && !it.isNullOrEmpty())
+ }
+
private val _isShowingDialog: MutableStateFlow<PreferenceViewModel?> = MutableStateFlow(null)
val isShowingDialog =
_isShowingDialog.combine(navigationViewModel.nextStep) { dialogFlow, nextStep ->
@@ -69,24 +88,23 @@
}
}
- private val _fingerprintStateViewModel: MutableStateFlow<FingerprintStateViewModel?> =
- MutableStateFlow(null)
- val fingerprintState: Flow<FingerprintStateViewModel?> =
- _fingerprintStateViewModel.combineTransform(navigationViewModel.nextStep) {
- settingsShowingViewModel,
- currStep ->
- if (currStep != null && currStep is ShowSettings) {
- emit(settingsShowingViewModel)
- }
+ private val _consumerShouldAuthenticate: MutableStateFlow<Boolean> = MutableStateFlow(false)
+
+ private val _fingerprintSensorType: Flow<FingerprintSensorType> =
+ fingerprintManagerInteractor.sensorPropertiesInternal.filterNotNull().map {
+ it.sensorType.toSensorType()
}
+ private val _sensorNullOrEmpty: Flow<Boolean> =
+ fingerprintManagerInteractor.sensorPropertiesInternal.map { it == null }
+
private val _isLockedOut: MutableStateFlow<FingerprintAuthAttemptViewModel.Error?> =
MutableStateFlow(null)
private val _authSucceeded: MutableSharedFlow<FingerprintAuthAttemptViewModel.Success?> =
MutableSharedFlow()
- private val attemptsSoFar: MutableStateFlow<Int> = MutableStateFlow(0)
+ private val _attemptsSoFar: MutableStateFlow<Int> = MutableStateFlow(0)
/**
* This is a very tricky flow. The current fingerprint manager APIs are not robust, and a proper
* implementation would take quite a lot of code to implement, it might be easier to rewrite
@@ -101,11 +119,20 @@
_isShowingDialog,
navigationViewModel.nextStep,
_consumerShouldAuthenticate,
- _fingerprintStateViewModel,
+ _enrolledFingerprints,
_isLockedOut,
- attemptsSoFar,
- fingerprintSensorPropertiesInternal
- ) { dialogShowing, step, resume, fingerprints, isLockedOut, attempts, sensorProps ->
+ _attemptsSoFar,
+ _fingerprintSensorType,
+ _sensorNullOrEmpty
+ ) {
+ dialogShowing,
+ step,
+ resume,
+ fingerprints,
+ isLockedOut,
+ attempts,
+ sensorType,
+ sensorNullOrEmpty ->
if (DEBUG) {
Log.d(
TAG,
@@ -115,25 +142,22 @@
"fingerprints=${fingerprints}," +
"lockedOut=${isLockedOut}," +
"attempts=${attempts}," +
- "sensorProps=${sensorProps}"
+ "sensorType=${sensorType}" +
+ "sensorNullOrEmpty=${sensorNullOrEmpty}"
)
}
- if (sensorProps.isNullOrEmpty()) {
+ if (sensorNullOrEmpty) {
return@combine false
}
- val sensorType = sensorProps[0].sensorType
if (
- listOf(
- FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
- FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC
- )
+ listOf(FingerprintSensorType.UDFPS_ULTRASONIC, FingerprintSensorType.UDFPS_OPTICAL)
.contains(sensorType)
) {
return@combine false
}
if (step != null && step is ShowSettings) {
- if (fingerprints?.fingerprintViewModels?.isNotEmpty() == true) {
+ if (fingerprints?.isNotEmpty() == true) {
return@combine dialogShowing == null && isLockedOut == null && resume && attempts < 15
}
}
@@ -173,17 +197,11 @@
init {
viewModelScope.launch {
- fingerprintSensorPropertiesInternal.update {
- fingerprintManagerInteractor.sensorPropertiesInternal()
- }
- }
-
- viewModelScope.launch {
navigationViewModel.nextStep.filterNotNull().collect {
_isShowingDialog.update { null }
if (it is ShowSettings) {
// reset state
- updateSettingsData()
+ updateEnrolledFingerprints()
}
}
}
@@ -200,7 +218,7 @@
}
override fun toString(): String {
- return "userId: $userId\n" + "fingerprintState: ${_fingerprintStateViewModel.value}\n"
+ return "userId: $userId\n" + "enrolledFingerprints: ${_enrolledFingerprints.value}\n"
}
/** The fingerprint delete button has been clicked. */
@@ -229,7 +247,7 @@
fun deleteFingerprint(fp: FingerprintViewModel) {
viewModelScope.launch(backgroundDispatcher) {
if (fingerprintManagerInteractor.removeFingerprint(fp)) {
- updateSettingsData()
+ updateEnrolledFingerprints()
}
}
}
@@ -238,45 +256,25 @@
fun renameFingerprint(fp: FingerprintViewModel, newName: String) {
viewModelScope.launch {
fingerprintManagerInteractor.renameFingerprint(fp, newName)
- updateSettingsData()
+ updateEnrolledFingerprints()
}
}
private fun attemptingAuth() {
- attemptsSoFar.update { it + 1 }
+ _attemptsSoFar.update { it + 1 }
}
private suspend fun onAuthSuccess(success: FingerprintAuthAttemptViewModel.Success) {
_authSucceeded.emit(success)
- attemptsSoFar.update { 0 }
+ _attemptsSoFar.update { 0 }
}
private fun lockout(attemptViewModel: FingerprintAuthAttemptViewModel.Error) {
_isLockedOut.update { attemptViewModel }
}
- /**
- * This function is sort of a hack, it's used whenever we want to check for fingerprint state
- * updates.
- */
- private suspend fun updateSettingsData() {
- Log.d(TAG, "update settings data called")
- val fingerprints = fingerprintManagerInteractor.enrolledFingerprints.last()
- val canEnrollFingerprint =
- fingerprintManagerInteractor.canEnrollFingerprints(fingerprints.size).last()
- val maxFingerprints = fingerprintManagerInteractor.maxEnrollableFingerprints.last()
- val hasSideFps = fingerprintManagerInteractor.hasSideFps()
- val pressToAuthEnabled = fingerprintManagerInteractor.pressToAuthEnabled()
- _fingerprintStateViewModel.update {
- FingerprintStateViewModel(
- fingerprints,
- canEnrollFingerprint,
- maxFingerprints,
- hasSideFps,
- pressToAuthEnabled,
- fingerprintManagerInteractor.sensorPropertiesInternal().first(),
- )
- }
+ private suspend fun updateEnrolledFingerprints() {
+ _enrolledFingerprints.update { fingerprintManagerInteractor.enrolledFingerprints.first() }
}
/** Used to indicate whether the consumer of the view model is ready for authentication. */
@@ -284,6 +282,13 @@
_consumerShouldAuthenticate.update { authenticate }
}
+ private fun <T> Flow<T>.filterOnlyWhenSettingsIsShown() =
+ combineTransform(navigationViewModel.nextStep) { value, currStep ->
+ if (currStep != null && currStep is ShowSettings) {
+ emit(value)
+ }
+ }
+
class FingerprintSettingsViewModelFactory(
private val userId: Int,
private val interactor: FingerprintManagerInteractor,
@@ -307,7 +312,7 @@
}
}
-private inline fun <T1, T2, T3, T4, T5, T6, T7, R> combine(
+private inline fun <T1, T2, T3, T4, T5, T6, T7, T8, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
@@ -315,9 +320,10 @@
flow5: Flow<T5>,
flow6: Flow<T6>,
flow7: Flow<T7>,
- crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7) -> R
+ flow8: Flow<T8>,
+ crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8) -> R
): Flow<R> {
- return combine(flow, flow2, flow3, flow4, flow5, flow6, flow7) { args: Array<*> ->
+ return combine(flow, flow2, flow3, flow4, flow5, flow6, flow7, flow8) { args: Array<*> ->
@Suppress("UNCHECKED_CAST")
transform(
args[0] as T1,
@@ -327,6 +333,7 @@
args[4] as T5,
args[5] as T6,
args[6] as T7,
+ args[7] as T8,
)
}
}
diff --git a/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollView.java b/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollView.java
index 55a78b8..831e83b 100644
--- a/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollView.java
+++ b/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollView.java
@@ -37,8 +37,8 @@
import androidx.annotation.Nullable;
import com.android.settings.R;
-import com.android.settingslib.udfps.UdfpsOverlayParams;
-import com.android.settingslib.udfps.UdfpsUtils;
+import com.android.systemui.biometrics.UdfpsUtils;
+import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams;
/**
* View corresponding with udfps_enroll_view.xml
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsDataSyncController.java b/src/com/android/settings/bluetooth/BluetoothDetailsDataSyncController.java
new file mode 100644
index 0000000..5969ada
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsDataSyncController.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2023 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.bluetooth;
+
+import android.companion.AssociationInfo;
+import android.companion.CompanionDeviceManager;
+import android.companion.datatransfer.PermissionSyncRequest;
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import com.google.common.base.Objects;
+
+import java.util.Comparator;
+
+/**
+ * The controller of the CDM data sync in the bluetooth detail settings.
+ */
+public class BluetoothDetailsDataSyncController extends BluetoothDetailsController
+ implements Preference.OnPreferenceClickListener {
+
+ private static final int DUMMY_ASSOCIATION_ID = -1;
+ private static final String TAG = "BTDataSyncController";
+ private static final String KEY_DATA_SYNC_GROUP = "data_sync_group";
+ private static final String KEY_PERM_SYNC = "perm_sync";
+
+ @VisibleForTesting
+ PreferenceCategory mPreferenceCategory;
+ @VisibleForTesting
+ int mAssociationId = DUMMY_ASSOCIATION_ID;
+
+ private CachedBluetoothDevice mCachedDevice;
+ private CompanionDeviceManager mCompanionDeviceManager;
+
+ public BluetoothDetailsDataSyncController(Context context,
+ PreferenceFragmentCompat fragment,
+ CachedBluetoothDevice device,
+ Lifecycle lifecycle) {
+ super(context, fragment, device, lifecycle);
+ mCachedDevice = device;
+ mCompanionDeviceManager = context.getSystemService(CompanionDeviceManager.class);
+
+ mCompanionDeviceManager.getAllAssociations().stream().filter(
+ a -> Objects.equal(mCachedDevice.getAddress(),
+ a.getDeviceMacAddress().toString().toUpperCase())).max(
+ Comparator.comparingLong(AssociationInfo::getTimeApprovedMs)).ifPresent(
+ a -> mAssociationId = a.getId());
+ }
+
+ @Override
+ public boolean isAvailable() {
+ if (mAssociationId == DUMMY_ASSOCIATION_ID) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ SwitchPreference switchPreference = (SwitchPreference) preference;
+ String key = switchPreference.getKey();
+ if (key.equals(KEY_PERM_SYNC)) {
+ if (switchPreference.isChecked()) {
+ mCompanionDeviceManager.enablePermissionsSync(mAssociationId);
+ } else {
+ mCompanionDeviceManager.disablePermissionsSync(mAssociationId);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return KEY_DATA_SYNC_GROUP;
+ }
+
+ @Override
+ protected void init(PreferenceScreen screen) {
+ mPreferenceCategory = screen.findPreference(getPreferenceKey());
+ refresh();
+ }
+
+ @Override
+ protected void refresh() {
+ SwitchPreference permSyncPref = mPreferenceCategory.findPreference(KEY_PERM_SYNC);
+ if (permSyncPref == null) {
+ permSyncPref = createPermSyncPreference(mPreferenceCategory.getContext());
+ mPreferenceCategory.addPreference(permSyncPref);
+ }
+
+ boolean visible = false;
+ boolean checked = false;
+ PermissionSyncRequest request = mCompanionDeviceManager.getPermissionSyncRequest(
+ mAssociationId);
+ if (request != null) {
+ visible = true;
+ if (request.isUserConsented()) {
+ checked = true;
+ }
+ }
+ permSyncPref.setVisible(visible);
+ permSyncPref.setChecked(checked);
+ }
+
+ @VisibleForTesting
+ SwitchPreference createPermSyncPreference(Context context) {
+ SwitchPreference pref = new SwitchPreference(context);
+ pref.setKey(KEY_PERM_SYNC);
+ pref.setTitle(context.getString(R.string.bluetooth_details_permissions_sync_title));
+ pref.setSummary(context.getString(R.string.bluetooth_details_permissions_sync_summary));
+ pref.setOnPreferenceClickListener(this);
+ return pref;
+ }
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
index bf8ed77..8a7c048 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
@@ -316,6 +316,8 @@
lifecycle));
controllers.add(new BluetoothDetailsHearingDeviceControlsController(context, this,
mCachedDevice, lifecycle));
+ controllers.add(new BluetoothDetailsDataSyncController(context, this,
+ mCachedDevice, lifecycle));
}
return controllers;
}
diff --git a/src/com/android/settings/bluetooth/OWNERS b/src/com/android/settings/bluetooth/OWNERS
index 4b79652..0a3dec9 100644
--- a/src/com/android/settings/bluetooth/OWNERS
+++ b/src/com/android/settings/bluetooth/OWNERS
@@ -5,5 +5,7 @@
robertluo@google.com
yiyishen@google.com
yqian@google.com
+chelseahao@google.com
+hahong@google.com
# Emergency approvers in case the above are not available
diff --git a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
index 7eabf01..c095fee 100644
--- a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
+++ b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
@@ -135,6 +135,11 @@
}
@VisibleForTesting
+ public void setFragmentManager(FragmentManager fragmentManager) {
+ mFragmentManager = fragmentManager;
+ }
+
+ @VisibleForTesting
public void setBluetoothDeviceUpdater(BluetoothDeviceUpdater bluetoothDeviceUpdater) {
mBluetoothDeviceUpdater = bluetoothDeviceUpdater;
}
diff --git a/src/com/android/settings/connecteddevice/OWNERS b/src/com/android/settings/connecteddevice/OWNERS
index 3179a05..5215a8f 100644
--- a/src/com/android/settings/connecteddevice/OWNERS
+++ b/src/com/android/settings/connecteddevice/OWNERS
@@ -4,5 +4,7 @@
robertluo@google.com
yiyishen@google.com
yqian@google.com
+chelseahao@google.com
+hahong@google.com
# Emergency approvers in case the above are not available
diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java
index 9a19e85..50ce579 100644
--- a/src/com/android/settings/fuelgauge/BatteryInfo.java
+++ b/src/com/android/settings/fuelgauge/BatteryInfo.java
@@ -44,7 +44,6 @@
public class BatteryInfo {
private static final String TAG = "BatteryInfo";
- private static final String GLOBAL_TIME_TO_FULL_MILLIS = "time_to_full_millis";
public CharSequence chargeLabel;
public CharSequence remainingLabel;
@@ -152,7 +151,7 @@
static long getSettingsChargeTimeRemaining(final Context context) {
return Settings.Global.getLong(
context.getContentResolver(),
- GLOBAL_TIME_TO_FULL_MILLIS, -1);
+ com.android.settingslib.fuelgauge.BatteryUtils.GLOBAL_TIME_TO_FULL_MILLIS, -1);
}
public static void getBatteryInfo(final Context context, final Callback callback,
@@ -287,7 +286,7 @@
if (getSettingsChargeTimeRemaining(context) != chargeTimeMs) {
Settings.Global.putLong(
context.getContentResolver(),
- GLOBAL_TIME_TO_FULL_MILLIS,
+ com.android.settingslib.fuelgauge.BatteryUtils.GLOBAL_TIME_TO_FULL_MILLIS,
chargeTimeMs);
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
index eba13f4..75b7c08 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
@@ -85,6 +85,10 @@
int mDailyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
@VisibleForTesting
int mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
+ @VisibleForTesting
+ int mDailyHighlightSlotIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
+ @VisibleForTesting
+ int mHourlyHighlightSlotIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
private boolean mIs24HourFormat;
private View mBatteryChartViewGroup;
@@ -217,6 +221,37 @@
refreshUi();
}
+ void onHighlightSlotIndexUpdate(int dailyHighlightSlotIndex, int hourlyHighlightSlotIndex) {
+ if (mDailyHighlightSlotIndex == dailyHighlightSlotIndex
+ && mHourlyHighlightSlotIndex == hourlyHighlightSlotIndex) {
+ return;
+ }
+ mDailyHighlightSlotIndex = dailyHighlightSlotIndex;
+ mHourlyHighlightSlotIndex = hourlyHighlightSlotIndex;
+ refreshUi();
+ }
+
+ void selectHighlightSlotIndex() {
+ if (mDailyHighlightSlotIndex == BatteryChartViewModel.SELECTED_INDEX_INVALID
+ || mHourlyHighlightSlotIndex == BatteryChartViewModel.SELECTED_INDEX_INVALID) {
+ return;
+ }
+ if (mDailyHighlightSlotIndex == mDailyChartIndex
+ && mHourlyHighlightSlotIndex == mHourlyChartIndex) {
+ return;
+ }
+ mDailyChartIndex = mDailyHighlightSlotIndex;
+ mHourlyChartIndex = mHourlyHighlightSlotIndex;
+ Log.d(TAG, String.format("onDailyChartSelect:%d, onHourlyChartSelect:%d",
+ mDailyChartIndex, mHourlyChartIndex));
+ refreshUi();
+ mHandler.post(() -> mDailyChartView.announceForAccessibility(
+ getAccessibilityAnnounceMessage()));
+ if (mOnSelectedIndexUpdatedListener != null) {
+ mOnSelectedIndexUpdatedListener.onSelectedIndexUpdated();
+ }
+ }
+
void setBatteryChartView(@NonNull final BatteryChartView dailyChartView,
@NonNull final BatteryChartView hourlyChartView) {
final View parentView = (View) dailyChartView.getParent();
@@ -320,6 +355,7 @@
mDailyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
}
mDailyViewModel.setSelectedIndex(mDailyChartIndex);
+ mDailyViewModel.setHighlightSlotIndex(mDailyHighlightSlotIndex);
mDailyChartView.setViewModel(mDailyViewModel);
}
@@ -334,6 +370,9 @@
mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
}
hourlyViewModel.setSelectedIndex(mHourlyChartIndex);
+ hourlyViewModel.setHighlightSlotIndex((mDailyChartIndex == mDailyHighlightSlotIndex)
+ ? mHourlyHighlightSlotIndex
+ : BatteryChartViewModel.SELECTED_INDEX_INVALID);
mHourlyChartView.setViewModel(hourlyViewModel);
}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
index 086f56c..bb468fe 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
@@ -31,6 +31,7 @@
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.ArraySet;
import android.util.AttributeSet;
@@ -90,6 +91,15 @@
private int mTrapezoidHoverColor;
private int mDefaultTextColor;
private int mTextPadding;
+ private int mTransomIconSize;
+ private int mTransomTop;
+ private int mTransomViewHeight;
+ private int mTransomLineDefaultColor;
+ private int mTransomLineSelectedColor;
+ private float mTransomPadding;
+ private Drawable mTransomIcon;
+ private Paint mTransomLinePaint;
+ private Paint mTransomSelectedSlotPaint;
private Paint mDividerPaint;
private Paint mTrapezoidPaint;
private Paint mTextPaint;
@@ -123,8 +133,9 @@
return;
}
- Log.d(TAG, String.format("setViewModel(): size: %d, selectedIndex: %d.",
- viewModel.size(), viewModel.selectedIndex()));
+ Log.d(TAG, String.format(
+ "setViewModel(): size: %d, selectedIndex: %d, getHighlightSlotIndex: %d",
+ viewModel.size(), viewModel.selectedIndex(), viewModel.getHighlightSlotIndex()));
mViewModel = viewModel;
initializeAxisLabelsBounds();
initializeTrapezoidSlots(viewModel.size() - 1);
@@ -162,7 +173,7 @@
mPercentageBounds[index]);
}
// Updates the indent configurations.
- mIndent.top = mPercentageBounds[0].height();
+ mIndent.top = mPercentageBounds[0].height() + mTransomViewHeight;
final int textWidth = mPercentageBounds[0].width() + mTextPadding;
if (isRTL()) {
mIndent.left = textWidth;
@@ -196,6 +207,7 @@
}
drawVerticalDividers(canvas);
drawTrapezoids(canvas);
+ drawTransomLine(canvas);
}
@Override
@@ -340,6 +352,40 @@
resources.getDimensionPixelSize(R.dimen.chartview_trapezoid_radius)));
// Initializes for drawing text information.
mTextPadding = resources.getDimensionPixelSize(R.dimen.chartview_text_padding);
+ // Initializes the padding top for drawing text information.
+ mTransomViewHeight = resources.getDimensionPixelSize(
+ R.dimen.chartview_transom_layout_height);
+ }
+
+ private void initializeTransomPaint() {
+ if (mTransomLinePaint != null && mTransomSelectedSlotPaint != null
+ && mTransomIcon != null) {
+ return;
+ }
+ // Initializes the transom line paint.
+ final Resources resources = getContext().getResources();
+ final int transomLineWidth = resources.getDimensionPixelSize(
+ R.dimen.chartview_transom_width);
+ final int transomRadius = resources.getDimensionPixelSize(R.dimen.chartview_transom_radius);
+ mTransomPadding = transomRadius * .5f;
+ mTransomTop = resources.getDimensionPixelSize(R.dimen.chartview_transom_padding_top);
+ mTransomLineDefaultColor = Utils.getDisabled(mContext, DIVIDER_COLOR);
+ mTransomLineSelectedColor = resources.getColor(
+ R.color.color_battery_anomaly_yellow_selector);
+ final int slotHighlightColor = Utils.getDisabled(mContext, mTransomLineSelectedColor);
+ mTransomIconSize = resources.getDimensionPixelSize(R.dimen.chartview_transom_icon_size);
+ mTransomLinePaint = new Paint();
+ mTransomLinePaint.setAntiAlias(true);
+ mTransomLinePaint.setStyle(Paint.Style.STROKE);
+ mTransomLinePaint.setStrokeWidth(transomLineWidth);
+ mTransomLinePaint.setStrokeCap(Paint.Cap.ROUND);
+ mTransomLinePaint.setPathEffect(new CornerPathEffect(transomRadius));
+ mTransomSelectedSlotPaint = new Paint();
+ mTransomSelectedSlotPaint.setAntiAlias(true);
+ mTransomSelectedSlotPaint.setColor(slotHighlightColor);
+ mTransomSelectedSlotPaint.setStyle(Paint.Style.FILL);
+ // Get the companion icon beside transom line
+ mTransomIcon = getResources().getDrawable(R.drawable.ic_battery_tips_warning_icon);
}
private void drawHorizontalDividers(Canvas canvas) {
@@ -592,6 +638,50 @@
}
}
+ private boolean isHighlightSlotValid() {
+ return mViewModel != null && mViewModel.getHighlightSlotIndex()
+ != BatteryChartViewModel.SELECTED_INDEX_INVALID;
+ }
+
+ private void drawTransomLine(Canvas canvas) {
+ if (!isHighlightSlotValid()) {
+ return;
+ }
+ initializeTransomPaint();
+ // Draw the whole transom line and a warning icon
+ mTransomLinePaint.setColor(mTransomLineDefaultColor);
+ final int width = getWidth() - abs(mIndent.width());
+ final float transomOffset = mTrapezoidHOffset + mDividerWidth * .5f + mTransomPadding;
+ final float trapezoidBottom = getHeight() - mIndent.bottom - mDividerHeight - mDividerWidth
+ - mTrapezoidVOffset;
+ canvas.drawLine(mIndent.left + transomOffset, mTransomTop,
+ mIndent.left + width - transomOffset, mTransomTop,
+ mTransomLinePaint);
+ drawTransomIcon(canvas);
+ // Draw selected segment of transom line and a highlight slot
+ mTransomLinePaint.setColor(mTransomLineSelectedColor);
+ final int index = mViewModel.getHighlightSlotIndex();
+ final float startX = mTrapezoidSlots[index].mLeft;
+ final float endX = mTrapezoidSlots[index].mRight;
+ canvas.drawLine(startX + mTransomPadding, mTransomTop,
+ endX - mTransomPadding, mTransomTop,
+ mTransomLinePaint);
+ canvas.drawRect(startX, mTransomTop, endX, trapezoidBottom,
+ mTransomSelectedSlotPaint);
+ }
+
+ private void drawTransomIcon(Canvas canvas) {
+ if (mTransomIcon == null) {
+ return;
+ }
+ final int left = isRTL()
+ ? mIndent.left - mTextPadding - mTransomIconSize
+ : getWidth() - abs(mIndent.width()) + mTextPadding;
+ mTransomIcon.setBounds(left, mTransomTop - mTransomIconSize / 2,
+ left + mTransomIconSize, mTransomTop + mTransomIconSize / 2);
+ mTransomIcon.draw(canvas);
+ }
+
// Searches the corresponding trapezoid index from x location.
private int getTrapezoidIndex(float x) {
if (mTrapezoidSlots == null) {
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
index f58d241..bf8a771 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
@@ -55,6 +55,7 @@
private final String[] mFullTexts;
private int mSelectedIndex = SELECTED_INDEX_ALL;
+ private int mHighlightSlotIndex = SELECTED_INDEX_INVALID;
BatteryChartViewModel(@NonNull List<Integer> levels, @NonNull List<Long> timestamps,
@NonNull AxisLabelPosition axisLabelPosition,
@@ -106,6 +107,14 @@
mSelectedIndex = index;
}
+ public int getHighlightSlotIndex() {
+ return mHighlightSlotIndex;
+ }
+
+ public void setHighlightSlotIndex(int index) {
+ mHighlightSlotIndex = index;
+ }
+
@Override
public int hashCode() {
return Objects.hash(mLevels, mTimestamps, mSelectedIndex, mAxisLabelPosition);
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java
index 53ebbd9..09d66c7 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java
@@ -20,6 +20,7 @@
import android.text.format.DateUtils;
import android.util.ArrayMap;
+import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -69,6 +70,16 @@
return String.format(Locale.ENGLISH, "timestamps: %s; levels: %s",
Objects.toString(mTimestamps), Objects.toString(mLevels));
}
+
+ private int getIndexByTimestamps(long startTimestamp, long endTimestamp) {
+ for (int index = 0; index < mTimestamps.size() - 1; index++) {
+ if (mTimestamps.get(index) <= startTimestamp
+ && endTimestamp <= mTimestamps.get(index + 1)) {
+ return index;
+ }
+ }
+ return BatteryChartViewModel.SELECTED_INDEX_INVALID;
+ }
}
/**
@@ -100,6 +111,18 @@
}
}
+ /** Gets daily and hourly index between start and end timestamps. */
+ public Pair<Integer, Integer> getIndexByTimestamps(long startTimestamp, long endTimestamp) {
+ final int dailyHighlightIndex =
+ mDailyBatteryLevels.getIndexByTimestamps(startTimestamp, endTimestamp);
+ final int hourlyHighlightIndex =
+ (dailyHighlightIndex == BatteryChartViewModel.SELECTED_INDEX_INVALID)
+ ? BatteryChartViewModel.SELECTED_INDEX_INVALID
+ : mHourlyBatteryLevelsPerDay.get(dailyHighlightIndex)
+ .getIndexByTimestamps(startTimestamp, endTimestamp);
+ return Pair.create(dailyHighlightIndex, hourlyHighlightIndex);
+ }
+
public PeriodBatteryLevelData getDailyBatteryLevels() {
return mDailyBatteryLevels;
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java
index 65cca7c..e5cff20 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java
@@ -16,9 +16,7 @@
package com.android.settings.fuelgauge.batteryusage;
-import android.app.settings.SettingsEnums;
import android.content.Context;
-import android.os.Bundle;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
@@ -31,8 +29,6 @@
import androidx.preference.PreferenceViewHolder;
import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.core.SubSettingLauncher;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -45,10 +41,17 @@
private static final String TAG = "BatteryTipsCardPreference";
- private final MetricsFeatureProvider mMetricsFeatureProvider;
+ interface OnConfirmListener {
+ void onConfirm();
+ }
- private String mAnomalyEventId;
- private PowerAnomalyKey mPowerAnomalyKey;
+ interface OnRejectListener {
+ void onReject();
+ }
+
+ private final MetricsFeatureProvider mMetricsFeatureProvider;
+ private OnConfirmListener mOnConfirmListener;
+ private OnRejectListener mOnRejectListener;
private int mIconResourceId = 0;
private int mMainButtonStrokeColorResourceId = 0;
@@ -56,12 +59,6 @@
CharSequence mMainButtonLabel;
@VisibleForTesting
CharSequence mDismissButtonLabel;
- @VisibleForTesting
- String mDestinationComponentName;
- @VisibleForTesting
- String mPreferenceHighlightKey;
- @VisibleForTesting
- Integer mSourceMetricsCategory;
public BatteryTipsCardPreference(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -69,7 +66,14 @@
setSelectable(false);
final FeatureFactory featureFactory = FeatureFactory.getFeatureFactory();
mMetricsFeatureProvider = featureFactory.getMetricsFeatureProvider();
- mPowerAnomalyKey = null;
+ }
+
+ public void setOnConfirmListener(OnConfirmListener listener) {
+ mOnConfirmListener = listener;
+ }
+
+ public void setOnRejectListener(OnRejectListener listener) {
+ mOnRejectListener = listener;
}
/**
@@ -93,13 +97,6 @@
}
/**
- * Sets the anomaly event id which is used in metrics.
- */
- public void setAnomalyEventId(final String anomalyEventId) {
- mAnomalyEventId = anomalyEventId;
- }
-
- /**
* Sets the label of main button in tips card.
*/
public void setMainButtonLabel(CharSequence label) {
@@ -119,50 +116,18 @@
}
}
- /**
- * Sets the power anomaly key of battery tips card.
- */
- public void setPowerAnomalyKey(final PowerAnomalyKey powerAnomalyKey) {
- mPowerAnomalyKey = powerAnomalyKey;
- }
-
- /**
- * Sets the info of target fragment launched by main button.
- */
- public void setMainButtonLauncherInfo(final String destinationClassName,
- final Integer sourceMetricsCategory, final String highlightKey) {
- mDestinationComponentName = destinationClassName;
- mSourceMetricsCategory = sourceMetricsCategory;
- mPreferenceHighlightKey = highlightKey;
- }
-
@Override
public void onClick(View view) {
final int viewId = view.getId();
if (viewId == R.id.main_button || viewId == R.id.tips_card) {
- if (TextUtils.isEmpty(mDestinationComponentName)) {
- return;
- }
- Bundle arguments = Bundle.EMPTY;
- if (!TextUtils.isEmpty(mPreferenceHighlightKey)) {
- arguments = new Bundle(1);
- arguments.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY,
- mPreferenceHighlightKey);
- }
- new SubSettingLauncher(getContext())
- .setDestination(mDestinationComponentName)
- .setSourceMetricsCategory(mSourceMetricsCategory)
- .setArguments(arguments)
- .launch();
setVisible(false);
- mMetricsFeatureProvider.action(
- getContext(), SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, mAnomalyEventId);
+ if (mOnConfirmListener != null) {
+ mOnConfirmListener.onConfirm();
+ }
} else if (viewId == R.id.dismiss_button) {
setVisible(false);
- mMetricsFeatureProvider.action(
- getContext(), SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, mAnomalyEventId);
- if (mPowerAnomalyKey != null) {
- DatabaseUtils.setDismissedPowerAnomalyKeys(getContext(), mPowerAnomalyKey.name());
+ if (mOnRejectListener != null) {
+ mOnRejectListener.onReject();
}
}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
index 625d9e5..b3a3508 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
@@ -18,13 +18,16 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
+import android.os.Bundle;
import android.text.TextUtils;
import androidx.preference.PreferenceScreen;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
+import com.android.settings.SettingsActivity;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.SubSettingLauncher;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -39,6 +42,21 @@
private final MetricsFeatureProvider mMetricsFeatureProvider;
+ /** A callback listener for the battery tips is confirmed. */
+ interface OnAnomalyConfirmListener {
+ /** The callback function for the battery tips is confirmed. */
+ void onAnomalyConfirm();
+ }
+
+ /** A callback listener for the battery tips is rejected. */
+ interface OnAnomalyRejectListener {
+ /** The callback function for the battery tips is rejected. */
+ void onAnomalyReject();
+ }
+
+ private OnAnomalyConfirmListener mOnAnomalyConfirmListener;
+ private OnAnomalyRejectListener mOnAnomalyRejectListener;
+
@VisibleForTesting
BatteryTipsCardPreference mCardPreference;
@@ -59,6 +77,14 @@
mCardPreference = screen.findPreference(CARD_PREFERENCE_KEY);
}
+ void setOnAnomalyConfirmListener(OnAnomalyConfirmListener listener) {
+ mOnAnomalyConfirmListener = listener;
+ }
+
+ void setOnAnomalyRejectListener(OnAnomalyRejectListener listener) {
+ mOnAnomalyRejectListener = listener;
+ }
+
private <T> T getInfo(PowerAnomalyEvent powerAnomalyEvent,
Function<WarningBannerInfo, T> warningBannerInfoSupplier,
Function<WarningItemInfo, T> warningItemInfoSupplier) {
@@ -95,6 +121,21 @@
: getStringFromResource(resourceId, resourceIndex);
}
+ /** Generate a key string of current anomaly to record as dismissed in sharedPreferences. */
+ public static String getDismissRecordKey(PowerAnomalyEvent event) {
+ if (!event.hasKey()) {
+ return null;
+ }
+ switch (event.getKey()){
+ case KEY_APP:
+ return event.hasWarningItemInfo()
+ && event.getWarningItemInfo().hasDismissRecordKey()
+ ? event.getWarningItemInfo().getDismissRecordKey() : null;
+ default:
+ return event.getKey().name();
+ }
+ }
+
void handleBatteryTipsCardUpdated(PowerAnomalyEvent powerAnomalyEvent) {
if (powerAnomalyEvent == null) {
mCardPreference.setVisible(false);
@@ -109,44 +150,76 @@
R.array.battery_tips_card_colors, cardStyleId, "color");
// Get card preference strings and navigate fragment info
+ final String eventId = powerAnomalyEvent.hasEventId()
+ ? powerAnomalyEvent.getEventId() : null;
final PowerAnomalyKey powerAnomalyKey = powerAnomalyEvent.hasKey()
? powerAnomalyEvent.getKey() : null;
final int resourceIndex = powerAnomalyKey != null ? powerAnomalyKey.getNumber() : -1;
- String titleString = getString(powerAnomalyEvent, WarningBannerInfo::getTitleString,
+ final String titleString = getString(powerAnomalyEvent, WarningBannerInfo::getTitleString,
WarningItemInfo::getTitleString, R.array.power_anomaly_titles, resourceIndex);
if (titleString.isEmpty()) {
mCardPreference.setVisible(false);
return;
}
- String mainBtnString = getString(powerAnomalyEvent,
+ final String mainBtnString = getString(powerAnomalyEvent,
WarningBannerInfo::getMainButtonString, WarningItemInfo::getMainButtonString,
R.array.power_anomaly_main_btn_strings, resourceIndex);
- String dismissBtnString = getString(powerAnomalyEvent,
+ final String dismissBtnString = getString(powerAnomalyEvent,
WarningBannerInfo::getCancelButtonString, WarningItemInfo::getCancelButtonString,
R.array.power_anomaly_dismiss_btn_strings, resourceIndex);
- String destinationClassName = getInfo(powerAnomalyEvent,
+ final String destinationClassName = getInfo(powerAnomalyEvent,
WarningBannerInfo::getMainButtonDestination, null);
- Integer sourceMetricsCategory = getInfo(powerAnomalyEvent,
+ final Integer sourceMetricsCategory = getInfo(powerAnomalyEvent,
WarningBannerInfo::getMainButtonSourceMetricsCategory, null);
- String preferenceHighlightKey = getInfo(powerAnomalyEvent,
+ final String preferenceHighlightKey = getInfo(powerAnomalyEvent,
WarningBannerInfo::getMainButtonSourceHighlightKey, null);
// Update card preference and main button fragment launcher
- mCardPreference.setAnomalyEventId(powerAnomalyEvent.getEventId());
- mCardPreference.setPowerAnomalyKey(powerAnomalyKey);
mCardPreference.setTitle(titleString);
mCardPreference.setIconResourceId(iconResId);
mCardPreference.setMainButtonStrokeColorResourceId(colorResId);
mCardPreference.setMainButtonLabel(mainBtnString);
mCardPreference.setDismissButtonLabel(dismissBtnString);
- mCardPreference.setMainButtonLauncherInfo(
- destinationClassName, sourceMetricsCategory, preferenceHighlightKey);
- mCardPreference.setVisible(true);
- mMetricsFeatureProvider.action(mContext,
- SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, powerAnomalyEvent.getEventId());
+ // Set battery tips card listener
+ mCardPreference.setOnConfirmListener(() -> {
+ if (mOnAnomalyConfirmListener != null) {
+ mOnAnomalyConfirmListener.onAnomalyConfirm();
+ } else if (!TextUtils.isEmpty(destinationClassName)) {
+ // Navigate to sub setting page
+ Bundle arguments = Bundle.EMPTY;
+ if (!TextUtils.isEmpty(preferenceHighlightKey)) {
+ arguments = new Bundle(1);
+ arguments.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY,
+ preferenceHighlightKey);
+ }
+ new SubSettingLauncher(mContext)
+ .setDestination(destinationClassName)
+ .setSourceMetricsCategory(sourceMetricsCategory)
+ .setArguments(arguments)
+ .launch();
+ }
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, eventId);
+ });
+ mCardPreference.setOnRejectListener(() -> {
+ if (mOnAnomalyRejectListener != null) {
+ mOnAnomalyRejectListener.onAnomalyReject();
+ }
+ // For anomaly events with same record key, dismissed until next time full charged.
+ final String dismissRecordKey = getDismissRecordKey(powerAnomalyEvent);
+ if (!TextUtils.isEmpty(dismissRecordKey)) {
+ DatabaseUtils.setDismissedPowerAnomalyKeys(mContext, dismissRecordKey);
+ }
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, eventId);
+ });
+
+ mCardPreference.setVisible(true);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, eventId);
}
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java
index ab5ab8a..63f0d40 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBroadcastReceiver.java
@@ -120,6 +120,7 @@
mFetchBatteryUsageData = true;
BatteryUsageDataLoader.enqueueWork(context, /*isFullChargeStart=*/ true);
+ BootBroadcastReceiver.invokeJobRecheck(context);
}
private void sendBatteryEventData(Context context, BatteryEventType batteryEventType) {
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java
index ece9960..1cbf2a3 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java
@@ -28,6 +28,7 @@
import com.android.settings.fuelgauge.BatteryUsageHistoricalLogEntry.Action;
import com.android.settings.fuelgauge.batteryusage.bugreport.BatteryUsageLogUtils;
+import com.android.settings.overlay.FeatureFactory;
import java.util.List;
import java.util.Map;
@@ -138,6 +139,8 @@
// No app usage data or battery diff data at this time.
loadAppUsageData(context);
preprocessBatteryUsageSlots(context);
+ FeatureFactory.getFeatureFactory().getPowerUsageFeatureProvider()
+ .detectSettingsAnomaly(context, /* displayDrain= */ 0);
}
Log.d(TAG, String.format(
"loadUsageDataSafely() in %d/ms", System.currentTimeMillis() - start));
diff --git a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
index ec0d01a..a1987c9 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
@@ -473,6 +473,9 @@
.setConsumePower(batteryDiffEntry.mConsumePower)
.setForegroundUsageConsumePower(batteryDiffEntry.mForegroundUsageConsumePower)
.setBackgroundUsageConsumePower(batteryDiffEntry.mBackgroundUsageConsumePower)
+ .setForegroundServiceUsageConsumePower(
+ batteryDiffEntry.mForegroundServiceUsageConsumePower)
+ .setCachedUsageConsumePower(batteryDiffEntry.mCachedUsageConsumePower)
.setForegroundUsageTime(batteryDiffEntry.mForegroundUsageTimeInMs)
.setBackgroundUsageTime(batteryDiffEntry.mBackgroundUsageTimeInMs)
.setScreenOnTime(batteryDiffEntry.mScreenOnTimeInMs);
@@ -525,9 +528,9 @@
batteryUsageDiff.getScreenOnTime(),
batteryUsageDiff.getConsumePower(),
batteryUsageDiff.getForegroundUsageConsumePower(),
- /*foregroundServiceUsageConsumePower=*/ 0,
+ batteryUsageDiff.getForegroundServiceUsageConsumePower(),
batteryUsageDiff.getBackgroundUsageConsumePower(),
- /*cachedUsageConsumePower=*/ 0);
+ batteryUsageDiff.getCachedUsageConsumePower());
}
static BatteryDiffData convertToBatteryDiffData(
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManager.java b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManager.java
index 0e15093..7fb2c56 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManager.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobManager.java
@@ -68,6 +68,8 @@
/** Schedules the next alarm job if it is available. */
public void refreshJob(final boolean fromBoot) {
if (mAlarmManager == null) {
+ BatteryUsageLogUtils.writeLog(mContext, Action.SCHEDULE_JOB,
+ "cannot schedule next alarm job due to AlarmManager is null");
Log.e(TAG, "cannot schedule next alarm job");
return;
}
@@ -80,8 +82,8 @@
AlarmManager.RTC_WAKEUP, triggerAtMillis, pendingIntent);
final String utcToLocalTime = ConvertUtils.utcToLocalTimeForLogging(triggerAtMillis);
- BatteryUsageLogUtils.writeLog(
- mContext, Action.SCHEDULE_JOB, "triggerTime=" + utcToLocalTime);
+ BatteryUsageLogUtils.writeLog(mContext, Action.SCHEDULE_JOB,
+ String.format("triggerTime=%s, fromBoot=%b", utcToLocalTime, fromBoot));
Log.d(TAG, "schedule next alarm job at " + utcToLocalTime);
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java
index 2371a19..dccca43 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiver.java
@@ -33,12 +33,23 @@
@Override
public void onReceive(Context context, Intent intent) {
+ try {
+ loadDataAndRefreshJob(context, intent);
+ } catch (Exception e) {
+ BatteryUsageLogUtils.writeLog(context, Action.SCHEDULE_JOB,
+ String.format("loadDataAndRefreshJob() failed: %s", e));
+ }
+ }
+
+ private static void loadDataAndRefreshJob(Context context, Intent intent) {
final String action = intent == null ? "" : intent.getAction();
if (!ACTION_PERIODIC_JOB_UPDATE.equals(action)) {
Log.w(TAG, "receive unexpected action=" + action);
return;
}
if (DatabaseUtils.isWorkProfile(context)) {
+ BatteryUsageLogUtils.writeLog(context, Action.SCHEDULE_JOB,
+ "do not refresh job for work profile");
Log.w(TAG, "do not refresh job for work profile action=" + action);
return;
}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
index a5449aa..283b742 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
@@ -27,6 +27,7 @@
import android.os.Looper;
import android.provider.SearchIndexableResource;
import android.util.Log;
+import android.util.Pair;
import androidx.annotation.VisibleForTesting;
import androidx.loader.app.LoaderManager;
@@ -67,11 +68,6 @@
private boolean mIsChartDataLoaded = false;
private long mResumeTimestamp;
- private BatteryTipsController mBatteryTipsController;
- private BatteryChartPreferenceController mBatteryChartPreferenceController;
- private ScreenOnTimeController mScreenOnTimeController;
- private BatteryUsageBreakdownController mBatteryUsageBreakdownController;
- private Optional<BatteryLevelData> mBatteryLevelData;
private Map<Integer, Map<Integer, BatteryDiffData>> mBatteryUsageMap;
private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
@@ -87,6 +83,19 @@
}
};
+ @VisibleForTesting
+ BatteryTipsController mBatteryTipsController;
+ @VisibleForTesting
+ BatteryChartPreferenceController mBatteryChartPreferenceController;
+ @VisibleForTesting
+ ScreenOnTimeController mScreenOnTimeController;
+ @VisibleForTesting
+ BatteryUsageBreakdownController mBatteryUsageBreakdownController;
+ @VisibleForTesting
+ PowerAnomalyEvent mPowerAnomalyEvent;
+ @VisibleForTesting
+ Optional<BatteryLevelData> mBatteryLevelData;
+
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -179,6 +188,7 @@
mIsChartDataLoaded = true;
mBatteryLevelData = null;
mBatteryUsageMap = null;
+ mPowerAnomalyEvent = null;
restartLoader(LoaderIndex.BATTERY_LEVEL_DATA_LOADER, bundle,
mBatteryLevelDataLoaderCallbacks);
}
@@ -253,12 +263,45 @@
Log.d(TAG, "anomalyEventList = " + anomalyEventList);
final PowerAnomalyEvent displayEvent =
getHighestScoreAnomalyEvent(getContext(), anomalyEventList);
- if (displayEvent == null) {
+ onDisplayAnomalyEventUpdated(displayEvent);
+ }
+
+ @VisibleForTesting
+ void onDisplayAnomalyEventUpdated(PowerAnomalyEvent event) {
+ mPowerAnomalyEvent = event;
+ if (mBatteryTipsController == null
+ || mBatteryChartPreferenceController == null
+ || mBatteryUsageBreakdownController == null) {
return;
}
- if (mBatteryTipsController != null) {
- mBatteryTipsController.handleBatteryTipsCardUpdated(displayEvent);
+
+ // Update battery tips card preference & behaviour
+ mBatteryTipsController.setOnAnomalyConfirmListener(null);
+ mBatteryTipsController.setOnAnomalyRejectListener(null);
+ mBatteryTipsController.handleBatteryTipsCardUpdated(mPowerAnomalyEvent);
+
+ // Update highlight slot effect in battery chart view
+ Pair<Integer, Integer> highlightSlotIndexPair = Pair.create(
+ BatteryChartViewModel.SELECTED_INDEX_INVALID,
+ BatteryChartViewModel.SELECTED_INDEX_INVALID);
+ if (mPowerAnomalyEvent != null && mPowerAnomalyEvent.hasWarningItemInfo()) {
+ final WarningItemInfo warningItemInfo = mPowerAnomalyEvent.getWarningItemInfo();
+ final Long startTimestamp = warningItemInfo.hasStartTimestamp()
+ ? warningItemInfo.getStartTimestamp() : null;
+ final Long endTimestamp = warningItemInfo.hasEndTimestamp()
+ ? warningItemInfo.getEndTimestamp() : null;
+ if (startTimestamp != null && endTimestamp != null) {
+ highlightSlotIndexPair = mBatteryLevelData.map(levelData ->
+ levelData.getIndexByTimestamps(startTimestamp, endTimestamp))
+ .orElse(highlightSlotIndexPair);
+ mBatteryTipsController.setOnAnomalyConfirmListener(
+ mBatteryChartPreferenceController::selectHighlightSlotIndex);
+ mBatteryTipsController.setOnAnomalyRejectListener(
+ () -> onDisplayAnomalyEventUpdated(null));
+ }
}
+ mBatteryChartPreferenceController.onHighlightSlotIndexUpdate(
+ highlightSlotIndexPair.first, highlightSlotIndexPair.second);
}
private void setBatteryChartPreferenceController() {
@@ -306,8 +349,8 @@
final PowerAnomalyEvent highestScoreEvent = anomalyEventList.getPowerAnomalyEventsList()
.stream()
- .filter(event -> event.hasKey()
- && !dismissedPowerAnomalyKeys.contains(event.getKey().name()))
+ .filter(event -> !dismissedPowerAnomalyKeys.contains(
+ BatteryTipsController.getDismissRecordKey(event)))
.max(Comparator.comparing(PowerAnomalyEvent::getScore))
.orElse(null);
Log.d(TAG, "highestScoreAnomalyEvent = " + highestScoreEvent);
@@ -341,6 +384,7 @@
controllers.add(new BatteryUsageBreakdownController(
context, null /* lifecycle */, null /* activity */,
null /* fragment */));
+ controllers.add(new BatteryTipsController(context));
return controllers;
}
};
diff --git a/src/com/android/settings/fuelgauge/protos/battery_usage_slot.proto b/src/com/android/settings/fuelgauge/protos/battery_usage_slot.proto
index e3b604b..5bc1a3e 100644
--- a/src/com/android/settings/fuelgauge/protos/battery_usage_slot.proto
+++ b/src/com/android/settings/fuelgauge/protos/battery_usage_slot.proto
@@ -26,7 +26,9 @@
optional double consume_power = 9;
optional double foreground_usage_consume_power = 10;
optional double background_usage_consume_power = 11;
- optional int64 foreground_usage_time = 12;
- optional int64 background_usage_time = 13;
- optional int64 screen_on_time = 14;
+ optional double foreground_service_usage_consume_power = 12;
+ optional double cached_usage_consume_power = 13;
+ optional int64 foreground_usage_time = 14;
+ optional int64 background_usage_time = 15;
+ optional int64 screen_on_time = 16;
}
diff --git a/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto b/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto
index 644ab9e..99df215 100644
--- a/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto
+++ b/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto
@@ -60,4 +60,6 @@
optional string description_string = 5;
optional string main_button_string = 6;
optional string cancel_button_string = 7;
+ optional string dismiss_record_key = 8;
+ optional string item_key = 9;
}
diff --git a/src/com/android/settings/privatespace/CreatePrivateSpaceController.java b/src/com/android/settings/privatespace/CreatePrivateSpaceController.java
new file mode 100644
index 0000000..3214988
--- /dev/null
+++ b/src/com/android/settings/privatespace/CreatePrivateSpaceController.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.widget.Toast;
+
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+// TODO(b/293569406): Remove this when we have the setup flow in place to create PS
+/**
+ * Temp Controller to create the private space from the PS Settings page. This is to allow PM, UX,
+ * and other folks to play around with PS before the PS setup flow is ready.
+ */
+public final class CreatePrivateSpaceController extends BasePreferenceController {
+
+ public CreatePrivateSpaceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(Preference preference) {
+ if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
+ return false;
+ }
+
+ if (PrivateSpaceMaintainer.getInstance(mContext).doesPrivateSpaceExist()) {
+ showPrivateSpaceAlreadyExistsToast();
+ return super.handlePreferenceTreeClick(preference);
+ }
+
+ if (PrivateSpaceMaintainer.getInstance(mContext).createPrivateSpace()) {
+ showPrivateSpaceCreatedToast();
+ } else {
+ showPrivateSpaceCreationFailedToast();
+ }
+ return super.handlePreferenceTreeClick(preference);
+ }
+
+ private void showPrivateSpaceCreatedToast() {
+ Toast.makeText(mContext, R.string.private_space_created, Toast.LENGTH_SHORT).show();
+ }
+
+ private void showPrivateSpaceCreationFailedToast() {
+ Toast.makeText(mContext, R.string.private_space_create_failed, Toast.LENGTH_SHORT).show();
+ }
+
+ private void showPrivateSpaceAlreadyExistsToast() {
+ Toast.makeText(mContext, R.string.private_space_already_exists, Toast.LENGTH_SHORT).show();
+ }
+}
diff --git a/src/com/android/settings/privatespace/DeletePrivateSpaceController.java b/src/com/android/settings/privatespace/DeletePrivateSpaceController.java
new file mode 100644
index 0000000..c94f63a
--- /dev/null
+++ b/src/com/android/settings/privatespace/DeletePrivateSpaceController.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_INTERNAL;
+import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NONE;
+import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NO_PRIVATE_SPACE;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.Toast;
+
+import androidx.preference.Preference;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+/** Controller to delete the private space from the PS Settings page */
+public class DeletePrivateSpaceController extends BasePreferenceController {
+ private static final String TAG = "DeletePrivateSpaceController";
+ private final PrivateSpaceMaintainer mPrivateSpaceMaintainer;
+
+ static class Injector {
+ PrivateSpaceMaintainer injectPrivateSpaceMaintainer(Context context) {
+ return PrivateSpaceMaintainer.getInstance(context);
+ }
+ }
+
+ public DeletePrivateSpaceController(Context context, String preferenceKey) {
+ this(context, preferenceKey, new Injector());
+ }
+
+ DeletePrivateSpaceController(Context context, String preferenceKey, Injector injector) {
+ super(context, preferenceKey);
+ mPrivateSpaceMaintainer = injector.injectPrivateSpaceMaintainer(context);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(Preference preference) {
+ if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
+ return false;
+ }
+
+ PrivateSpaceMaintainer.ErrorDeletingPrivateSpace error =
+ mPrivateSpaceMaintainer.deletePrivateSpace();
+ if (error == DELETE_PS_ERROR_NONE) {
+ showSuccessfulDeletionToast();
+ } else if (error == DELETE_PS_ERROR_INTERNAL) {
+ showDeletionInternalErrorToast();
+ } else if (error == DELETE_PS_ERROR_NO_PRIVATE_SPACE) {
+ // Ideally this should never happen as PS Settings is not available when there's no
+ // Private Profile.
+ Log.e(TAG, "Unexpected attempt to delete non-existent PS");
+ }
+ return super.handlePreferenceTreeClick(preference);
+ }
+
+ /** Shows a toast saying that the private space was deleted */
+ @VisibleForTesting
+ public void showSuccessfulDeletionToast() {
+ Toast.makeText(mContext, R.string.private_space_deleted, Toast.LENGTH_SHORT).show();
+ }
+
+ /** Shows a toast saying that the private space could not be deleted */
+ @VisibleForTesting
+ public void showDeletionInternalErrorToast() {
+ Toast.makeText(mContext, R.string.private_space_delete_failed, Toast.LENGTH_SHORT).show();
+ }
+}
diff --git a/src/com/android/settings/privatespace/HidePrivateSpaceController.java b/src/com/android/settings/privatespace/HidePrivateSpaceController.java
new file mode 100644
index 0000000..f27acbd
--- /dev/null
+++ b/src/com/android/settings/privatespace/HidePrivateSpaceController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+import android.content.Context;
+
+import com.android.settings.core.TogglePreferenceController;
+
+/** Represents the preference controller for (un)hiding the Private Space */
+public final class HidePrivateSpaceController extends TogglePreferenceController {
+ public HidePrivateSpaceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public boolean isChecked() {
+ // TODO(b/293569406) Need to check this from a persistent store, maybe like SettingsProvider
+ return false;
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ // TODO(b/293569406) Need to save this to a persistent store, maybe like SettingsProvider
+ return true;
+ }
+
+ @Override
+ public int getSliceHighlightMenuRes() {
+ return 0;
+ }
+}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java b/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java
new file mode 100644
index 0000000..9e1d0d5
--- /dev/null
+++ b/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.util.FeatureFlagUtils;
+
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.safetycenter.SafetyCenterManagerWrapper;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.search.SearchIndexable;
+
+import java.util.List;
+
+/** Fragment representing the Private Space dashboard in Settings. */
+@SearchIndexable
+public class PrivateSpaceDashboardFragment extends DashboardFragment {
+ private static final String TAG = "PrivateSpaceDashboardFragment";
+ private static final String KEY_CREATE_PROFILE_PREFERENCE = "private_space_create";
+ private static final String KEY_DELETE_PROFILE_PREFERENCE = "private_space_delete";
+ private static final String KEY_ONE_LOCK_PREFERENCE = "private_space_use_one_lock";
+ private static final String KEY_PS_HIDDEN_PREFERENCE = "private_space_hidden";
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.private_space_settings;
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.PRIVATE_SPACE_SETTINGS;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider(R.xml.private_space_settings) {
+ @Override
+ protected boolean isPageSearchEnabled(Context context) {
+ // Temporary workaround for hiding PS Settings until the trunk stable feature
+ // flag is available.
+ // TODO(b/295516544): Remove this workaround when trunk stable feature flag is
+ // available.
+ return SafetyCenterManagerWrapper.get().isEnabled(context)
+ && FeatureFlagUtils.isEnabled(context,
+ FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS);
+ }
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ List<String> keys = super.getNonIndexableKeys(context);
+ keys.add(KEY_CREATE_PROFILE_PREFERENCE);
+ keys.add(KEY_DELETE_PROFILE_PREFERENCE);
+ keys.add(KEY_ONE_LOCK_PREFERENCE);
+ keys.add(KEY_PS_HIDDEN_PREFERENCE);
+ return keys;
+ }
+ };
+}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
new file mode 100644
index 0000000..709814d
--- /dev/null
+++ b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+import static android.os.UserManager.USER_TYPE_PROFILE_PRIVATE;
+
+import android.app.ActivityManager;
+import android.app.IActivityManager;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.ArraySet;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.List;
+
+// TODO(b/293569406): Update the javadoc when we have the setup flow in place to create PS
+/** A class to help with the creation / deletion of Private Space */
+public class PrivateSpaceMaintainer {
+ private static final String TAG = "PrivateSpaceMaintainer";
+ @GuardedBy("this")
+ private static PrivateSpaceMaintainer sPrivateSpaceMaintainer;
+
+ private final Context mContext;
+ private final UserManager mUserManager;
+ @GuardedBy("this")
+ private UserHandle mUserHandle;
+
+ public enum ErrorDeletingPrivateSpace {
+ DELETE_PS_ERROR_NONE,
+ DELETE_PS_ERROR_NO_PRIVATE_SPACE,
+ DELETE_PS_ERROR_INTERNAL
+ }
+
+ /**
+ * Returns true if the private space was successfully created.
+ *
+ * <p> This method should be used by the Private Space Setup Flow ONLY.
+ */
+ final synchronized boolean createPrivateSpace() {
+ // Check if Private space already exists
+ if (doesPrivateSpaceExist()) {
+ return true;
+ }
+ // a name indicating that the profile was created from the PS Settings page
+ final String userName = "psSettingsUser";
+
+ if (mUserHandle == null) {
+ try {
+ mUserHandle = mUserManager.createProfile(
+ userName, USER_TYPE_PROFILE_PRIVATE, new ArraySet<>());
+ } catch (Exception e) {
+ Log.e(TAG, "Error creating private space", e);
+ return false;
+ }
+
+ if (mUserHandle == null) {
+ Log.e(TAG, "Failed to create private space");
+ return false;
+ }
+
+ IActivityManager am = ActivityManager.getService();
+ try {
+ am.startProfile(mUserHandle.getIdentifier());
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to start private profile");
+ return false;
+ }
+
+ Log.i(TAG, "Private space created with id: " + mUserHandle.getIdentifier());
+ }
+ return true;
+ }
+
+ /** Returns the {@link ErrorDeletingPrivateSpace} enum representing the result of operation.
+ *
+ * <p> This method should be used ONLY by the delete-PS controller in the PS Settings page.
+ */
+ public synchronized ErrorDeletingPrivateSpace deletePrivateSpace() {
+ if (!doesPrivateSpaceExist()) {
+ return ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NO_PRIVATE_SPACE;
+ }
+
+ try {
+ Log.i(TAG, "Deleting Private space with id: " + mUserHandle.getIdentifier());
+ if (mUserManager.removeUser(mUserHandle)) {
+ Log.i(TAG, "Private space deleted");
+ mUserHandle = null;
+
+ return ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NONE;
+ } else {
+ Log.e(TAG, "Failed to delete private space");
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Error deleting private space", e);
+ }
+ return ErrorDeletingPrivateSpace.DELETE_PS_ERROR_INTERNAL;
+ }
+
+ /** Returns true if the Private space exists. */
+ public synchronized boolean doesPrivateSpaceExist() {
+ if (mUserHandle != null) {
+ return true;
+ }
+
+ List<UserInfo> users = mUserManager.getProfiles(0);
+ for (UserInfo user : users) {
+ if (user.isPrivateProfile()) {
+ mUserHandle = user.getUserHandle();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ static synchronized PrivateSpaceMaintainer getInstance(Context context) {
+ if (sPrivateSpaceMaintainer == null) {
+ sPrivateSpaceMaintainer = new PrivateSpaceMaintainer(context);
+ }
+ return sPrivateSpaceMaintainer;
+ }
+
+ private PrivateSpaceMaintainer(Context context) {
+ mContext = context.getApplicationContext();
+ mUserManager = mContext.getSystemService(UserManager.class);
+ }
+}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceSafetySource.java b/src/com/android/settings/privatespace/PrivateSpaceSafetySource.java
new file mode 100644
index 0000000..b07c623
--- /dev/null
+++ b/src/com/android/settings/privatespace/PrivateSpaceSafetySource.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+import android.app.PendingIntent;
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserManager;
+import android.safetycenter.SafetyEvent;
+import android.safetycenter.SafetySourceData;
+import android.safetycenter.SafetySourceStatus;
+import android.util.FeatureFlagUtils;
+import android.util.Log;
+
+import com.android.settings.R;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.safetycenter.SafetyCenterManagerWrapper;
+import com.android.settingslib.transition.SettingsTransitionHelper;
+
+/** Private Space safety source for the Safety Center */
+public final class PrivateSpaceSafetySource {
+ public static final String SAFETY_SOURCE_ID = "AndroidPrivateSpace";
+ private static final String TAG = "PrivateSpaceSafetySource";
+
+ private PrivateSpaceSafetySource() {}
+
+ /** Sets lock screen safety data for Safety Center. */
+ public static void setSafetySourceData(Context context,
+ SafetyEvent safetyEvent) {
+ if (!SafetyCenterManagerWrapper.get().isEnabled(context)) {
+ Log.i(TAG, "Safety Center disabled");
+ return;
+ }
+
+ // Check the profile type - we don't want to show this for anything other than primary user.
+ UserManager userManager = context.getSystemService(UserManager.class);
+ if (userManager != null && !userManager.isMainUser()) {
+ Log.i(TAG, "setSafetySourceData not main user");
+ return;
+ }
+
+ // Temporary workaround to help prevent the PS Settings showing up in droidfood builds.
+ // TODO(b/295516544): remove this when the trunk stable feature flag for PS is available.
+ if (!FeatureFlagUtils.isEnabled(context,
+ FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS)) {
+ // Setting null safetySourceData so that an old entry gets cleared out and this way
+ // provide a response since SC always expects one on rescan.
+ SafetyCenterManagerWrapper.get().setSafetySourceData(
+ context,
+ SAFETY_SOURCE_ID,
+ /* safetySourceData */ null,
+ safetyEvent
+ );
+ return;
+ }
+
+ PendingIntent pendingIntent = getPendingIntentForPsDashboard(context);
+
+ SafetySourceStatus status = new SafetySourceStatus.Builder(
+ context.getString(R.string.private_space_title),
+ context.getString(R.string.private_space_summary),
+ SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED)
+ .setPendingIntent(pendingIntent).build();
+ SafetySourceData safetySourceData =
+ new SafetySourceData.Builder().setStatus(status).build();
+
+ Log.d(TAG, "Setting safety source data");
+ SafetyCenterManagerWrapper.get().setSafetySourceData(
+ context,
+ SAFETY_SOURCE_ID,
+ safetySourceData,
+ safetyEvent
+ );
+ }
+
+ private static PendingIntent getPendingIntentForPsDashboard(Context context) {
+ Intent privateSpaceDashboardIntent = new SubSettingLauncher(context)
+ .setDestination(PrivateSpaceDashboardFragment.class.getName())
+ .setTransitionType(SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE)
+ .setSourceMetricsCategory(SettingsEnums.PRIVATE_SPACE_SETTINGS)
+ .toIntent()
+ .setIdentifier(SAFETY_SOURCE_ID);
+
+ return PendingIntent
+ .getActivity(
+ context,
+ /* requestCode */ 0,
+ privateSpaceDashboardIntent,
+ PendingIntent.FLAG_IMMUTABLE);
+ }
+}
diff --git a/src/com/android/settings/privatespace/UseOneLockController.java b/src/com/android/settings/privatespace/UseOneLockController.java
new file mode 100644
index 0000000..a94db57
--- /dev/null
+++ b/src/com/android/settings/privatespace/UseOneLockController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+import android.content.Context;
+
+import com.android.settings.core.TogglePreferenceController;
+
+/** Represents the preference controller for using the same lock as the screen lock */
+public class UseOneLockController extends TogglePreferenceController {
+ public UseOneLockController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public boolean isChecked() {
+ // TODO(b/293569406) Need to save this to a persistent store, maybe like SettingsProvider
+ return false;
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ // TODO(b/293569406) Need to save this to a persistent store, maybe like SettingsProvider
+ return true;
+ }
+
+ @Override
+ public int getSliceHighlightMenuRes() {
+ return 0;
+ }
+}
diff --git a/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java b/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java
index 0b556e7..cc0f892 100644
--- a/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java
+++ b/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java
@@ -28,6 +28,7 @@
import android.safetycenter.SafetyCenterManager;
import android.safetycenter.SafetyEvent;
+import com.android.settings.privatespace.PrivateSpaceSafetySource;
import com.android.settings.security.ScreenLockPreferenceDetailsUtils;
import com.google.common.collect.ImmutableList;
@@ -79,11 +80,16 @@
if (sourceIds.contains(BiometricsSafetySource.SAFETY_SOURCE_ID)) {
BiometricsSafetySource.setSafetySourceData(context, safetyEvent);
}
+
+ if (sourceIds.contains(PrivateSpaceSafetySource.SAFETY_SOURCE_ID)) {
+ PrivateSpaceSafetySource.setSafetySourceData(context, safetyEvent);
+ }
}
private static void refreshAllSafetySources(Context context, SafetyEvent safetyEvent) {
LockScreenSafetySource.setSafetySourceData(context,
new ScreenLockPreferenceDetailsUtils(context), safetyEvent);
BiometricsSafetySource.setSafetySourceData(context, safetyEvent);
+ PrivateSpaceSafetySource.setSafetySourceData(context, safetyEvent);
}
}
diff --git a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
index e0c778d..f403743 100644
--- a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
+++ b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
@@ -109,7 +109,7 @@
appList = appList,
header = {
Box(Modifier.padding(SettingsDimension.itemPadding)) {
- SettingsBody(UserAspectRatioAppsPageProvider.getSummary())
+ SettingsBody(stringResource(R.string.aspect_ratio_main_summary, Build.MODEL))
}
Illustration(object : IllustrationModel {
override val resId = R.raw.user_aspect_ratio_education
@@ -215,5 +215,5 @@
private enum class SpinnerItem(val stringResId: Int) {
Suggested(R.string.user_aspect_ratio_suggested_apps_label),
All(R.string.filter_all_apps),
- Overridden(R.string.user_aspect_ratio_overridden_apps_label)
+ Overridden(R.string.user_aspect_ratio_changed_apps_label)
}
\ No newline at end of file
diff --git a/src/com/android/settings/system/FactoryResetDemoUserPreferenceController.java b/src/com/android/settings/system/FactoryResetDemoUserPreferenceController.java
new file mode 100644
index 0000000..f6a9b31
--- /dev/null
+++ b/src/com/android/settings/system/FactoryResetDemoUserPreferenceController.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.settings.system;
+
+import android.content.Context;
+import com.android.settings.Utils;
+
+public class FactoryResetDemoUserPreferenceController extends FactoryResetPreferenceController {
+
+ public FactoryResetDemoUserPreferenceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ /** Hide demo user specific "Factory reset" settings for non demo users. */
+ @Override
+ public int getAvailabilityStatus() {
+ return Utils.isDemoUser(mContext) ? AVAILABLE : DISABLED_FOR_USER;
+ }
+}
diff --git a/src/com/android/settings/system/FactoryResetPreferenceController.java b/src/com/android/settings/system/FactoryResetPreferenceController.java
index a307171..6e010c1 100644
--- a/src/com/android/settings/system/FactoryResetPreferenceController.java
+++ b/src/com/android/settings/system/FactoryResetPreferenceController.java
@@ -24,35 +24,26 @@
import com.android.settings.R;
import com.android.settings.Settings;
import com.android.settings.Utils;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settings.core.BasePreferenceController;
-public class FactoryResetPreferenceController extends AbstractPreferenceController
- implements PreferenceControllerMixin {
- /** Key of the "Factory reset" preference in {@link R.xml.reset_dashboard_fragment}. */
- private static final String KEY_FACTORY_RESET = "factory_reset";
+public class FactoryResetPreferenceController extends BasePreferenceController {
private final UserManager mUm;
- public FactoryResetPreferenceController(Context context) {
- super(context);
+ public FactoryResetPreferenceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
}
- /** Hide "Factory reset" settings for secondary users, except demo users. */
+ /** Hide "Factory reset" settings for secondary users. */
@Override
- public boolean isAvailable() {
- return mUm.isAdminUser() || Utils.isDemoUser(mContext);
- }
-
- @Override
- public String getPreferenceKey() {
- return KEY_FACTORY_RESET;
+ public int getAvailabilityStatus() {
+ return mUm.isAdminUser() ? AVAILABLE : DISABLED_FOR_USER;
}
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
- if (KEY_FACTORY_RESET.equals(preference.getKey())) {
+ if (mPreferenceKey.equals(preference.getKey())) {
final Intent intent = new Intent(mContext, Settings.FactoryResetActivity.class);
mContext.startActivity(intent);
return true;
diff --git a/src/com/android/settings/system/ResetDashboardFragment.java b/src/com/android/settings/system/ResetDashboardFragment.java
index aea92aa..662edc5 100644
--- a/src/com/android/settings/system/ResetDashboardFragment.java
+++ b/src/com/android/settings/system/ResetDashboardFragment.java
@@ -78,7 +78,6 @@
if (SubscriptionUtil.isSimHardwareVisible(context)) {
controllers.add(new NetworkResetPreferenceController(context));
}
- controllers.add(new FactoryResetPreferenceController(context));
controllers.add(new ResetAppPrefPreferenceController(context, lifecycle));
return controllers;
}
diff --git a/src/com/android/settings/system/ResetPreferenceController.java b/src/com/android/settings/system/ResetPreferenceController.java
index 0740ac9..35f1ff7 100644
--- a/src/com/android/settings/system/ResetPreferenceController.java
+++ b/src/com/android/settings/system/ResetPreferenceController.java
@@ -26,13 +26,11 @@
private final UserManager mUm;
private final NetworkResetPreferenceController mNetworkReset;
- private final FactoryResetPreferenceController mFactpruReset;
public ResetPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
mNetworkReset = new NetworkResetPreferenceController(context);
- mFactpruReset = new FactoryResetPreferenceController(context);
}
@Override
diff --git a/tests/robotests/src/com/android/settings/AllInOneTetherSettingsTest.java b/tests/robotests/src/com/android/settings/AllInOneTetherSettingsTest.java
index f4a20fe..f2a55c1 100644
--- a/tests/robotests/src/com/android/settings/AllInOneTetherSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/AllInOneTetherSettingsTest.java
@@ -52,7 +52,6 @@
import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -186,7 +185,6 @@
.getPreferenceControllers(mContext)).isNotEmpty();
}
- @Ignore
@Test
public void createPreferenceControllers_hasAutoOffPreference() {
assertThat(mAllInOneTetherSettings.createPreferenceControllers(mContext)
diff --git a/tests/robotests/src/com/android/settings/MainClearConfirmTest.java b/tests/robotests/src/com/android/settings/MainClearConfirmTest.java
index 43fe9ca..b866c96 100644
--- a/tests/robotests/src/com/android/settings/MainClearConfirmTest.java
+++ b/tests/robotests/src/com/android/settings/MainClearConfirmTest.java
@@ -31,8 +31,6 @@
import androidx.fragment.app.FragmentActivity;
-import com.android.settings.utils.ActivityControllerWrapper;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -66,8 +64,7 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mActivity = spy((FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get());
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
mMainClearConfirm = spy(new MainClearConfirm());
}
diff --git a/tests/robotests/src/com/android/settings/MainClearTest.java b/tests/robotests/src/com/android/settings/MainClearTest.java
index d782e6d..dc17dda 100644
--- a/tests/robotests/src/com/android/settings/MainClearTest.java
+++ b/tests/robotests/src/com/android/settings/MainClearTest.java
@@ -52,12 +52,10 @@
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.development.DevelopmentSettingsEnabler;
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -113,8 +111,7 @@
@Override
boolean showAnySubscriptionInfo(Context context) { return true; }
});
- mActivity = spy((FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get());
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
mShadowActivity = Shadows.shadowOf(mActivity);
UserManager userManager = mActivity.getSystemService(UserManager.class);
mShadowUserManager = Shadow.extract(userManager);
@@ -151,7 +148,6 @@
.isTrue();
}
- @Ignore
@Test
public void testShowFinalConfirmation_eraseEsimVisible_eraseEsimUnchecked() {
final Context context = mock(Context.class);
@@ -237,7 +233,6 @@
assertThat(mMainClear.showWipeEuicc()).isTrue();
}
- @Ignore
@Test
public void testShowWipeEuicc_developerMode_unprovisioned() {
prepareEuiccState(
diff --git a/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java b/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java
index 34012d3..9ade776 100644
--- a/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java
+++ b/tests/robotests/src/com/android/settings/ResetNetworkConfirmTest.java
@@ -18,8 +18,14 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import android.content.Context;
+import android.os.Looper;
import android.view.LayoutInflater;
import android.widget.TextView;
@@ -27,10 +33,10 @@
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowRecoverySystem;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.After;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -57,8 +63,7 @@
MockitoAnnotations.initMocks(this);
mResetNetworkConfirm = new ResetNetworkConfirm();
- mActivity = spy((FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get());
+ mActivity = spy(Robolectric.setupActivity(FragmentActivity.class));
mResetNetworkConfirm.mActivity = mActivity;
}
diff --git a/tests/robotests/src/com/android/settings/ResetNetworkTest.java b/tests/robotests/src/com/android/settings/ResetNetworkTest.java
index 0689e4a..0c2c7e8 100644
--- a/tests/robotests/src/com/android/settings/ResetNetworkTest.java
+++ b/tests/robotests/src/com/android/settings/ResetNetworkTest.java
@@ -27,8 +27,6 @@
import android.view.View;
import android.widget.CheckBox;
-import com.android.settings.utils.ActivityControllerWrapper;
-
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
@@ -43,8 +41,7 @@
@Before
public void setUp() {
- mActivity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ mActivity = Robolectric.setupActivity(Activity.class);
mResetNetwork = spy(new ResetNetwork());
when(mResetNetwork.getContext()).thenReturn(mActivity);
mResetNetwork.mEsimContainer = new View(mActivity);
diff --git a/tests/robotests/src/com/android/settings/RestrictedListPreferenceTest.java b/tests/robotests/src/com/android/settings/RestrictedListPreferenceTest.java
index 232933c..9660b9d 100644
--- a/tests/robotests/src/com/android/settings/RestrictedListPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/RestrictedListPreferenceTest.java
@@ -30,7 +30,6 @@
import android.util.AttributeSet;
import com.android.settings.testutils.shadow.ShadowUserManager;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.RestrictedPreferenceHelper;
import org.junit.Before;
@@ -59,8 +58,7 @@
@Before
public void setUp() {
- mActivity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ mActivity = Robolectric.setupActivity(Activity.class);
mShadowKeyguardManager =
Shadows.shadowOf(application.getSystemService(KeyguardManager.class));
mMockHelper = mock(RestrictedPreferenceHelper.class);
diff --git a/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java b/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java
index 2e5c144..9d8841f 100644
--- a/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java
@@ -34,7 +34,6 @@
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -100,7 +99,6 @@
ANOMALY_VERSION);
}
- @Ignore
@Test
public void testDump_printServiceAsKey() {
mResolveInfo.activityInfo = new ActivityInfo();
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidDialogFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidDialogFragmentTest.java
index 7a0853f..adfd573 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HearingAidDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidDialogFragmentTest.java
@@ -34,7 +34,6 @@
import com.android.settings.SettingsActivity;
import com.android.settings.bluetooth.BluetoothPairingDetail;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Rule;
@@ -65,8 +64,7 @@
@Before
public void setUpTestFragment() {
mFragment = spy(HearingAidDialogFragment.newInstance());
- mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
when(mFragment.getActivity()).thenReturn(mActivity);
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
index e632f97..6c1de59 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
@@ -45,7 +45,6 @@
import com.android.settings.bluetooth.Utils;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.HearingAidInfo;
@@ -171,8 +170,7 @@
private void setupDialog(int launchPage) {
mFragment = spy(
HearingAidPairingDialogFragment.newInstance(TEST_DEVICE_ADDRESS, launchPage));
- mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
mFragmentManager = mActivity.getSupportFragmentManager();
when(mFragment.getActivity()).thenReturn(mActivity);
doReturn(mFragmentManager).when(mFragment).getParentFragmentManager();
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java
index 9863087..6d45af2 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java
@@ -35,7 +35,6 @@
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.CsipSetCoordinatorProfile;
@@ -92,8 +91,7 @@
@Before
public void setUp() {
setupEnvironment();
- final FragmentActivity mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ final FragmentActivity mActivity = Robolectric.setupActivity(FragmentActivity.class);
shadowMainLooper().idle();
mFragmentManager = mActivity.getSupportFragmentManager();
ShadowAlertDialogCompat.reset();
diff --git a/tests/robotests/src/com/android/settings/accessibility/ScreenFlashNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ScreenFlashNotificationPreferenceControllerTest.java
index 8160fab..95a9438 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ScreenFlashNotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ScreenFlashNotificationPreferenceControllerTest.java
@@ -40,7 +40,6 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.After;
import org.junit.Before;
@@ -91,10 +90,7 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- FragmentActivity fragmentActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
-
-
+ FragmentActivity fragmentActivity = Robolectric.setupActivity(FragmentActivity.class);
Context context = fragmentActivity.getApplicationContext();
ShadowScreenFlashNotificationColorDialogFragment.setInstance(mDialogFragment);
ShadowFlashNotificationsUtils.setColorDescriptionText(COLOR_DESCRIPTION_TEXT);
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java
index 1d5370f..8212ba2 100644
--- a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java
@@ -40,7 +40,6 @@
import com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums;
import com.android.settings.accessibility.TextReadingResetController.ResetStateListener;
import com.android.settings.testutils.XmlTestUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Rule;
@@ -83,9 +82,7 @@
when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
when(mFragment.getContext()).thenReturn(mContext);
- when(mFragment.getActivity()).thenReturn((FragmentActivity)
- ActivityControllerWrapper.setup(Robolectric.buildActivity(
- FragmentActivity.class)).get());
+ when(mFragment.getActivity()).thenReturn(Robolectric.setupActivity(FragmentActivity.class));
// Avoid a NPE is happened in ShadowWindowManagerGlobal
doReturn(mock(DisplaySizeData.class)).when(mFragment).createDisplaySizeData(mContext);
diff --git a/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java
index 2c59354..6c9fbfc 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ViewAllBluetoothDevicesPreferenceControllerTest.java
@@ -30,8 +30,6 @@
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
-import com.android.settings.utils.ActivityControllerWrapper;
-
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -66,8 +64,7 @@
@Before
public void setUp() {
- mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
when(mFragment.getContext()).thenReturn(mContext);
when(mFragment.getActivity()).thenReturn(mActivity);
diff --git a/tests/robotests/src/com/android/settings/accounts/AccountSyncPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/AccountSyncPreferenceControllerTest.java
index e760e62..1084102 100644
--- a/tests/robotests/src/com/android/settings/accounts/AccountSyncPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AccountSyncPreferenceControllerTest.java
@@ -36,7 +36,6 @@
import com.android.settings.SettingsActivity;
import com.android.settings.testutils.shadow.ShadowAccountManager;
import com.android.settings.testutils.shadow.ShadowContentResolver;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.After;
import org.junit.Before;
@@ -63,8 +62,7 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mActivity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ mActivity = Robolectric.setupActivity(Activity.class);
ShadowApplication.getInstance().setSystemService(Context.ACCOUNT_SERVICE, mAccountManager);
when(mAccountManager.getAuthenticatorTypesAsUser(anyInt())).thenReturn(
diff --git a/tests/robotests/src/com/android/settings/accounts/ChooseAccountPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/ChooseAccountPreferenceControllerTest.java
index 5c4af0d..783eebe 100644
--- a/tests/robotests/src/com/android/settings/accounts/ChooseAccountPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/ChooseAccountPreferenceControllerTest.java
@@ -41,7 +41,6 @@
import com.android.settings.testutils.shadow.ShadowAccountManager;
import com.android.settings.testutils.shadow.ShadowContentResolver;
import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.After;
import org.junit.Before;
@@ -69,8 +68,7 @@
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mController = spy(new ChooseAccountPreferenceController(mContext, "controller_key"));
- mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
mPreferenceManager = new PreferenceManager(mContext);
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
}
diff --git a/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java
index 7433d7a..ece7ea9 100644
--- a/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java
@@ -40,7 +40,6 @@
import com.android.settings.R;
import com.android.settings.testutils.shadow.ShadowAccountManager;
import com.android.settings.testutils.shadow.ShadowContentResolver;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.search.SearchIndexableRaw;
import org.junit.After;
@@ -76,8 +75,7 @@
doReturn(mock(DevicePolicyManager.class)).when(mContext)
.getSystemService(Context.DEVICE_POLICY_SERVICE);
mController = new EmergencyInfoPreferenceController(mContext, "test_key");
- mPreference = new Preference((Context) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get());
+ mPreference = new Preference(Robolectric.setupActivity(Activity.class));
mPreference.setKey(mController.getPreferenceKey());
when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
when(mContext.getResources().getBoolean(R.bool.config_show_emergency_info_in_device_info))
diff --git a/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java
index 8d8f0c1..2052f46 100644
--- a/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/RemoveAccountPreferenceControllerTest.java
@@ -53,7 +53,6 @@
import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
import com.android.settings.testutils.shadow.ShadowFragment;
import com.android.settings.testutils.shadow.ShadowUserManager;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settings.widget.RestrictedButton;
import com.android.settingslib.widget.LayoutPreference;
@@ -113,8 +112,8 @@
when(mAccountManager.getAuthenticatorTypesAsUser(anyInt()))
.thenReturn(new AuthenticatorDescription[0]);
when(mAccountManager.getAccountsAsUser(anyInt())).thenReturn(new Account[0]);
- mController = new RemoveAccountPreferenceController((Context) ActivityControllerWrapper
- .setup(Robolectric.buildActivity(Activity.class)).get(), mFragment);
+ mController = new RemoveAccountPreferenceController(
+ Robolectric.setupActivity(Activity.class), mFragment);
}
@After
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java
index 5ca7415..638dabd 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppBatteryPreferenceControllerTest.java
@@ -43,7 +43,6 @@
import com.android.settingslib.applications.ApplicationsState;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -117,7 +116,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void testAppBattery_ifDisabled_shouldNotBeShown() {
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
index 87e4a8f..4fdf560 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
@@ -56,7 +56,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -156,7 +155,6 @@
verify(menu.findItem(UNINSTALL_UPDATES), times(1)).setVisible(true);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void onPrepareOptionsMenu_setUpdateMenuVisible_ifDisabledByDevice_shouldBeFalse() {
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppMemoryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppMemoryPreferenceControllerTest.java
index e948b7e..cc789c6 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppMemoryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppMemoryPreferenceControllerTest.java
@@ -37,7 +37,6 @@
import com.android.settings.testutils.shadow.ShadowUserManager;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -80,7 +79,6 @@
when(mFragment.getActivity()).thenReturn(mActivity);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getAvailabilityStatus_developmentSettingsEnabled_shouldReturnAvailable() {
@@ -109,7 +107,6 @@
.isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getAvailabilityStatus_developmentSettingsDisabled_shouldReturnDisabled() {
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppSettingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppSettingPreferenceControllerTest.java
index 2482945..bda1e61 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppSettingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppSettingPreferenceControllerTest.java
@@ -26,7 +26,6 @@
import androidx.preference.Preference;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -67,14 +66,12 @@
mPreference.setKey(mController.getPreferenceKey());
}
- @Ignore
@Test
public void getAvailabilityStatus_noAppSetting_shouldNotBeAvailable() {
assertThat(mController.isAvailable())
.isFalse();
}
- @Ignore
@Test
public void getAvailabilityStatus_noPackageName_shouldNotBeAvailable() {
mController.setPackageName(null);
@@ -83,7 +80,6 @@
.isFalse();
}
- @Ignore
@Test
public void getAvailabilityStatus_hasAppSetting_shouldBeAvailable() {
final ResolveInfo info = new ResolveInfo();
@@ -97,13 +93,11 @@
.isTrue();
}
- @Ignore
@Test
public void clickPreference_noAppSetting_shouldDoNothing() {
assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
}
- @Ignore
@Test
public void clickPreference_hasAppSetting_shouldLaunchIntent() {
final ResolveInfo info = new ResolveInfo();
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java
index dde5914..74c0bb5 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java
@@ -33,10 +33,8 @@
import androidx.preference.Preference;
import com.android.settings.R;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -76,8 +74,7 @@
MockitoAnnotations.initMocks(this);
ShadowApplication shadowApplication = ShadowApplication.getInstance();
shadowApplication.setSystemService(Context.ROLE_SERVICE, mRoleManager);
- mActivity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ mActivity = Robolectric.setupActivity(Activity.class);
mShadowUserManager = shadowOf(mActivity.getSystemService(UserManager.class));
mController = new TestRolePreferenceController(mActivity);
when(mPreference.getKey()).thenReturn(mController.getPreferenceKey());
@@ -104,7 +101,6 @@
DefaultAppShortcutPreferenceControllerBase.UNSUPPORTED_ON_DEVICE);
}
- @Ignore
@Test
public void
getAvailabilityStatus_noCallbackForIsRoleNotVisible_shouldReturnUnsupported() {
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 d035a64..85be59e 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonDialogFragmentTest.java
@@ -35,7 +35,6 @@
import com.android.settings.R;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -58,9 +57,7 @@
@Before
public void setUp() {
- final FragmentActivity activity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
-
+ final FragmentActivity activity = Robolectric.setupActivity(FragmentActivity.class);
mContext = spy(RuntimeEnvironment.application);
mFragment = InstantAppButtonDialogFragment.newInstance(TEST_PACKAGE);
mFragment.show(activity.getSupportFragmentManager(), "InstantAppButtonDialogFragment");
diff --git a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
index 88377b8..178a26f 100644
--- a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
@@ -44,7 +44,6 @@
import com.android.settingslib.applications.DefaultAppInfo;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -83,7 +82,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void testAssistAndVoiceInput_ifDisabled_shouldNotBeShown() {
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsControllerTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsControllerTest.java
index 523112c..ed4cbd1 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsControllerTest.java
@@ -29,7 +29,6 @@
import com.android.settings.R;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
@@ -61,7 +60,6 @@
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getAvailability_disabledByCarrier_returnUnavailable() {
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsScreenPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsScreenPreferenceControllerTest.java
index 37c3cc2..5982413 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsScreenPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsScreenPreferenceControllerTest.java
@@ -29,7 +29,6 @@
import com.android.settings.R;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
@@ -61,7 +60,6 @@
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getAvailability_disabledByCarrier_returnUnavailable() {
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/EnabledVrListenersControllerTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/EnabledVrListenersControllerTest.java
index 8c4df32..df5dfc9 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/EnabledVrListenersControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/EnabledVrListenersControllerTest.java
@@ -24,7 +24,6 @@
import android.content.Context;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -61,7 +60,6 @@
assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getAvailability_disabled_unavailable() {
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerScreenPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerScreenPreferenceControllerTest.java
index cf4e334..1e5e235 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerScreenPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerScreenPreferenceControllerTest.java
@@ -26,7 +26,6 @@
import com.android.settings.testutils.shadow.ShadowActivityManager;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -62,7 +61,6 @@
assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getAvailability_disabled_unavailable() {
diff --git a/tests/robotests/src/com/android/settings/biometrics/activeunlock/ActiveUnlockRequireBiometricSetupTest.java b/tests/robotests/src/com/android/settings/biometrics/activeunlock/ActiveUnlockRequireBiometricSetupTest.java
index 4ae1ecf..d3bbf24 100644
--- a/tests/robotests/src/com/android/settings/biometrics/activeunlock/ActiveUnlockRequireBiometricSetupTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/activeunlock/ActiveUnlockRequireBiometricSetupTest.java
@@ -29,7 +29,6 @@
import com.android.settings.R;
import com.android.settings.biometrics.BiometricEnrollActivity;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.google.android.setupcompat.PartnerCustomizationLayout;
import com.google.android.setupcompat.template.FooterBarMixin;
@@ -50,8 +49,8 @@
@Before
public void setUp() {
- mActivity = (ActiveUnlockRequireBiometricSetup) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(ActiveUnlockRequireBiometricSetup.class)).get();
+ mActivity = Robolectric.buildActivity(
+ ActiveUnlockRequireBiometricSetup.class).setup().get();
mLayout = mActivity.findViewById(R.id.setup_wizard_layout);
}
diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsFooterPreferenceControllerTest.java
index f34616f..9de2fc2 100644
--- a/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsFooterPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsFooterPreferenceControllerTest.java
@@ -41,7 +41,6 @@
import com.android.settingslib.widget.FooterPreference;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -57,7 +56,6 @@
import java.util.ArrayList;
import java.util.List;
-@Ignore
@RunWith(RobolectricTestRunner.class)
public class FaceSettingsFooterPreferenceControllerTest {
@Rule
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java
index 198bfd7..8727153 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java
@@ -57,7 +57,6 @@
import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.google.android.setupcompat.PartnerCustomizationLayout;
import com.google.android.setupcompat.template.FooterBarMixin;
@@ -120,7 +119,7 @@
props.add(newFingerprintSensorPropertiesInternal(TYPE_REAR));
doReturn(props).when(mFingerprintManager).getSensorPropertiesInternal();
- ActivityControllerWrapper.setup(mActivityController);
+ mActivityController.setup();
}
private void setupActivity_onUdfpsDevice() {
@@ -128,7 +127,7 @@
props.add(newFingerprintSensorPropertiesInternal(TYPE_UDFPS_OPTICAL));
doReturn(props).when(mFingerprintManager).getSensorPropertiesInternal();
- ActivityControllerWrapper.setup(mActivityController);
+ mActivityController.setup();
}
private void setupActivity_onSfpsDevice() {
@@ -136,7 +135,7 @@
props.add(newFingerprintSensorPropertiesInternal(TYPE_POWER_BUTTON));
doReturn(props).when(mFingerprintManager).getSensorPropertiesInternal();
- ActivityControllerWrapper.setup(mActivityController);
+ mActivityController.setup();
}
private FingerprintSensorPropertiesInternal newFingerprintSensorPropertiesInternal(
@@ -592,7 +591,7 @@
private void gotEnrollingResult_resumeActivityAndVerifyResultThenForward(
int testActivityResult) {
// resume activity
- mActivityController.start().resume();
+ mActivityController.start().resume().visible();
verifyNoSidecar();
// onActivityResult from Enrolling activity shall be forward back
@@ -612,8 +611,7 @@
int testActivityResult, @NonNull Bundle savedInstance) {
// Rebuild activity and use savedInstance to restore.
buildActivity();
- ActivityControllerWrapper.setup(mActivityController, savedInstance);
- //mActivityController.setup(savedInstance);
+ mActivityController.setup(savedInstance);
verifyNoSidecar();
// onActivityResult from Enrolling activity shall be forward back
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 d5500ad..ae580d5 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensorTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFindSensorTest.java
@@ -31,7 +31,6 @@
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.google.android.setupcompat.PartnerCustomizationLayout;
import com.google.android.setupcompat.template.FooterBarMixin;
@@ -67,8 +66,8 @@
final Intent intent = new Intent()
// Set the challenge token so the confirm screen will not be shown
.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0]);
- mActivity = (SetupFingerprintEnrollFindSensor) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(SetupFingerprintEnrollFindSensor.class, intent)).get();
+ mActivity = Robolectric.buildActivity(SetupFingerprintEnrollFindSensor.class,
+ intent).setup().get();
mTheme = mActivity.getTheme();
}
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFinishTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFinishTest.java
index ea9cb84..e238a0e 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFinishTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollFinishTest.java
@@ -30,7 +30,6 @@
import com.android.settings.R;
import com.android.settings.testutils.shadow.ShadowFingerprintManager;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.google.android.setupcompat.PartnerCustomizationLayout;
import com.google.android.setupcompat.template.FooterBarMixin;
@@ -55,8 +54,7 @@
@Before
public void setUp() {
- mActivity = (FingerprintEnrollFinish) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FingerprintEnrollFinish.class)).get();
+ mActivity = Robolectric.buildActivity(FingerprintEnrollFinish.class).setup().get();
mLayout = mActivity.findViewById(R.id.setup_wizard_layout);
Shadows.shadowOf(application.getPackageManager())
.setSystemFeature(PackageManager.FEATURE_FINGERPRINT, true);
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsDataSyncControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsDataSyncControllerTest.java
new file mode 100644
index 0000000..799f7fc
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsDataSyncControllerTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2023 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.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.companion.CompanionDeviceManager;
+import android.companion.datatransfer.PermissionSyncRequest;
+
+import androidx.preference.PreferenceCategory;
+import androidx.preference.SwitchPreference;
+
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.Collections;
+
+@RunWith(RobolectricTestRunner.class)
+public class BluetoothDetailsDataSyncControllerTest extends BluetoothDetailsControllerTestBase {
+
+ private static final String MAC_ADDRESS = "AA:BB:CC:DD:EE:FF";
+ private static final int DUMMY_ASSOCIATION_ID = -1;
+ private static final int ASSOCIATION_ID = 1;
+ private static final String KEY_PERM_SYNC = "perm_sync";
+
+ private BluetoothDetailsDataSyncController mController;
+ @Mock
+ private Lifecycle mLifecycle;
+ @Mock
+ private PreferenceCategory mPreferenceCategory;
+ @Mock
+ private CompanionDeviceManager mCompanionDeviceManager;
+
+ private PermissionSyncRequest mPermissionSyncRequest;
+ private SwitchPreference mPermSyncPreference;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mContext = spy(RuntimeEnvironment.application);
+ when(mContext.getSystemService(CompanionDeviceManager.class)).thenReturn(
+ mCompanionDeviceManager);
+ when(mCachedDevice.getAddress()).thenReturn(MAC_ADDRESS);
+ when(mCompanionDeviceManager.getAllAssociations()).thenReturn(Collections.emptyList());
+ mPermissionSyncRequest = new PermissionSyncRequest(ASSOCIATION_ID);
+ when(mCompanionDeviceManager.getPermissionSyncRequest(ASSOCIATION_ID)).thenReturn(
+ mPermissionSyncRequest);
+
+ mController = new BluetoothDetailsDataSyncController(mContext, mFragment,
+ mCachedDevice, mLifecycle);
+ mController.mAssociationId = ASSOCIATION_ID;
+ mController.mPreferenceCategory = mPreferenceCategory;
+
+ mPermSyncPreference = mController.createPermSyncPreference(mContext);
+ when(mPreferenceCategory.findPreference(KEY_PERM_SYNC)).thenReturn(mPermSyncPreference);
+ }
+
+ @Test
+ public void isAvailable_noAssociations_returnsFalse() {
+ mController.mAssociationId = DUMMY_ASSOCIATION_ID;
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void isAvailable_hasAssociations_returnTrue() {
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void refresh_permSyncNull_checkPreferenceInvisible() {
+ mPermissionSyncRequest = null;
+ when(mCompanionDeviceManager.getPermissionSyncRequest(ASSOCIATION_ID)).thenReturn(
+ mPermissionSyncRequest);
+ mController.refresh();
+
+ assertThat(mPermSyncPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void refresh_permSyncEnabled_checkPreferenceOn() {
+ mPermissionSyncRequest.setUserConsented(true);
+ mController.refresh();
+
+ assertThat(mPermSyncPreference.isVisible()).isTrue();
+ assertThat(mPermSyncPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void refresh_permSyncDisabled_checkPreferenceOff() {
+ mPermissionSyncRequest.setUserConsented(false);
+ mController.refresh();
+
+ assertThat(mPermSyncPreference.isVisible()).isTrue();
+ assertThat(mPermSyncPreference.isChecked()).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
index 89e682c..8ac56dc 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
@@ -46,7 +46,6 @@
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -231,9 +230,7 @@
doReturn(mPreferenceScreen).when(fragment).getPreferenceScreen();
doReturn(mUserManager).when(fragment).getUserManager();
- mActivity = spy((FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get());
-
+ mActivity = spy(Robolectric.setupActivity(FragmentActivity.class));
doReturn(mActivity).when(fragment).getActivity();
doReturn(mContext).when(fragment).getContext();
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothFindBroadcastsFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothFindBroadcastsFragmentTest.java
index 046a90c..f3f2b09 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothFindBroadcastsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothFindBroadcastsFragmentTest.java
@@ -36,7 +36,6 @@
import androidx.preference.PreferenceCategory;
import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -91,10 +90,7 @@
doReturn(mCachedDevice).when(mFragment).getCachedDevice(any());
doReturn(mBroadcastAssistant).when(mFragment).getLeBroadcastAssistant();
doReturn(mPreferenceCategroy).when(mFragment).findPreference(any());
-
- mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
-
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
when(mFragment.getActivity()).thenReturn(mActivity);
FragmentManager fragmentManager = mock(FragmentManager.class);
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java
index 17ab557..06dd42b 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java
@@ -17,9 +17,7 @@
import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE;
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
-
import static com.google.common.truth.Truth.assertThat;
-
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn;
@@ -44,12 +42,10 @@
import com.android.settings.R;
import com.android.settings.bluetooth.AvailableMediaBluetoothDeviceUpdater;
import com.android.settings.bluetooth.Utils;
-import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowAudioManager;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.bluetooth.BluetoothCallback;
import com.android.settingslib.bluetooth.BluetoothEventManager;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
@@ -74,7 +70,7 @@
ShadowAudioManager.class,
ShadowBluetoothAdapter.class,
ShadowBluetoothUtils.class,
- com.android.settings.testutils.shadow.ShadowFragment.class,
+ ShadowAlertDialogCompat.class,
})
public class AvailableMediaDeviceGroupControllerTest {
@@ -82,8 +78,6 @@
private static final String PREFERENCE_KEY_1 = "pref_key_1";
@Mock
- private DashboardFragment mDashboardFragment;
- @Mock
private AvailableMediaBluetoothDeviceUpdater mAvailableMediaBluetoothDeviceUpdater;
@Mock
private PreferenceScreen mPreferenceScreen;
@@ -114,16 +108,10 @@
mPreference = new Preference(mContext);
mPreference.setKey(PREFERENCE_KEY_1);
mPreferenceGroup = spy(new PreferenceScreen(mContext, null));
-
- final FragmentActivity mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
-
+ final FragmentActivity mActivity = Robolectric.setupActivity(FragmentActivity.class);
when(mPreferenceGroup.getPreferenceManager()).thenReturn(mPreferenceManager);
- doReturn(mContext).when(mDashboardFragment).getContext();
doReturn(mPackageManager).when(mContext).getPackageManager();
doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);
- when(mDashboardFragment.getParentFragmentManager()).thenReturn(
- mActivity.getSupportFragmentManager());
ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager;
mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
@@ -138,6 +126,8 @@
new AvailableMediaDeviceGroupController(mContext));
mAvailableMediaDeviceGroupController.
setBluetoothDeviceUpdater(mAvailableMediaBluetoothDeviceUpdater);
+ mAvailableMediaDeviceGroupController.setFragmentManager(
+ mActivity.getSupportFragmentManager());
mAvailableMediaDeviceGroupController.mPreferenceGroup = mPreferenceGroup;
}
@@ -251,18 +241,17 @@
}
@Test
- @Config(shadows = ShadowAlertDialogCompat.class)
public void onActiveDeviceChanged_hearingAidProfile_launchHearingAidPairingDialog() {
when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true);
when(mCachedBluetoothDevice.getDeviceMode()).thenReturn(
HearingAidInfo.DeviceMode.MODE_BINAURAL);
when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
HearingAidInfo.DeviceSide.SIDE_LEFT);
- mAvailableMediaDeviceGroupController.init(mDashboardFragment);
mAvailableMediaDeviceGroupController.onActiveDeviceChanged(mCachedBluetoothDevice,
BluetoothProfile.HEARING_AID);
shadowMainLooper().idle();
+
final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
assertThat(dialog.isShowing()).isTrue();
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/TopLevelConnectedDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/TopLevelConnectedDevicesPreferenceControllerTest.java
index eea561a..66f314d 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/TopLevelConnectedDevicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/TopLevelConnectedDevicesPreferenceControllerTest.java
@@ -24,7 +24,6 @@
import android.content.Context;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -48,7 +47,6 @@
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getAvailabilityStatus_unsupportedWhenSet() {
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java
index 42c994a..8257b43 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java
@@ -44,7 +44,6 @@
import com.android.settingslib.widget.SelectorWithWidgetPreference;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -223,7 +222,6 @@
assertThat(prefs.get(3).isChecked()).isFalse();
}
- @Ignore
@Test
public void onClickNone_mtpEnabled_shouldDisableMtp() {
when(mUsbBackend.areFunctionsSupported(anyLong())).thenReturn(true);
diff --git a/tests/robotests/src/com/android/settings/core/CategoryMixinTest.java b/tests/robotests/src/com/android/settings/core/CategoryMixinTest.java
index d8f4a90..3040039 100644
--- a/tests/robotests/src/com/android/settings/core/CategoryMixinTest.java
+++ b/tests/robotests/src/com/android/settings/core/CategoryMixinTest.java
@@ -31,7 +31,6 @@
import androidx.appcompat.app.AppCompatActivity;
import com.android.settings.core.CategoryMixin.CategoryListener;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -54,7 +53,7 @@
@Test
public void resumeActivity_shouldRegisterReceiver() {
- ActivityControllerWrapper.setup(mActivityController);
+ mActivityController.setup();
final TestActivity activity = mActivityController.get();
assertThat(activity.getRegisteredReceivers()).isNotEmpty();
@@ -62,7 +61,7 @@
@Test
public void pauseActivity_shouldUnregisterReceiver() {
- ActivityControllerWrapper.setup(mActivityController).pause();
+ mActivityController.setup().pause();
final TestActivity activity = mActivityController.get();
assertThat(activity.getRegisteredReceivers()).isEmpty();
@@ -70,7 +69,7 @@
@Test
public void onCategoriesChanged_listenerAdded_shouldNotifyChanged() {
- ActivityControllerWrapper.setup(mActivityController).pause();
+ mActivityController.setup().pause();
final CategoryMixin categoryMixin = mActivityController.get().getCategoryMixin();
final CategoryListener listener = mock(CategoryListener.class);
categoryMixin.addCategoryListener(listener);
diff --git a/tests/robotests/src/com/android/settings/core/InstrumentedActivityTest.java b/tests/robotests/src/com/android/settings/core/InstrumentedActivityTest.java
index 2f6940f..d74fab3 100644
--- a/tests/robotests/src/com/android/settings/core/InstrumentedActivityTest.java
+++ b/tests/robotests/src/com/android/settings/core/InstrumentedActivityTest.java
@@ -16,8 +16,6 @@
package com.android.settings.core;
-import com.android.settings.utils.ActivityControllerWrapper;
-
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
@@ -33,8 +31,7 @@
*/
@Test
public void canInstantiate() {
- ActivityControllerWrapper.setup(
- Robolectric.buildActivity(InstrumentedActivityTestable.class)).get();
+ Robolectric.buildActivity(InstrumentedActivityTestable.class).setup().get();
}
public static class InstrumentedActivityTestable extends InstrumentedActivity {
diff --git a/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java b/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java
index 34eab02..68dfb79 100644
--- a/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java
+++ b/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java
@@ -25,7 +25,6 @@
import com.android.settingslib.core.AbstractPreferenceController;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -45,7 +44,6 @@
mContext = RuntimeEnvironment.application;
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getControllers_shouldReturnAList() {
@@ -59,7 +57,6 @@
}
}
- @Ignore
@Test
@Config(qualifiers = "mcc998")
public void getControllers_partialFailure_shouldReturnTheRest() {
diff --git a/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java b/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java
index b1aa321..f489123 100644
--- a/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java
@@ -34,7 +34,6 @@
import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -51,7 +50,6 @@
* If changing a preference file breaks a test in this test file, please replace its reference
* with another preference with a matching replacement attribute.
*/
-@Ignore
@RunWith(RobolectricTestRunner.class)
public class PreferenceXmlParserUtilsTest {
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
index ecaf36f..cfbdd75 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
@@ -66,7 +66,6 @@
import com.android.settingslib.drawer.Tile;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -236,7 +235,6 @@
verify(mTestFragment.mScreen, never()).addPreference(nullable(Preference.class));
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void displayTilesAsPreference_shouldNotAddSuppressedTiles() {
diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
index fa61a33..6a1c0a6 100644
--- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
@@ -67,7 +67,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -83,7 +82,6 @@
import java.util.ArrayList;
import java.util.List;
-@Ignore
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowEntityHeaderController.class, ShadowRestrictedLockUtilsInternal.class})
public class AppDataUsageTest {
diff --git a/tests/robotests/src/com/android/settings/datausage/ChartDataUsagePreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/ChartDataUsagePreferenceTest.java
index aee91f3..aab67be 100644
--- a/tests/robotests/src/com/android/settings/datausage/ChartDataUsagePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/ChartDataUsagePreferenceTest.java
@@ -31,7 +31,6 @@
import com.android.settings.R;
import com.android.settings.datausage.ChartDataUsagePreference.DataUsageSummaryNode;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settings.widget.UsageView;
import com.android.settingslib.net.NetworkCycleChartData;
import com.android.settingslib.net.NetworkCycleData;
@@ -65,8 +64,8 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mActivity = spy((Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get());
+
+ mActivity = spy(Robolectric.setupActivity(Activity.class));
mPreference = new ChartDataUsagePreference(mActivity, null /* attrs */);
LayoutInflater inflater = LayoutInflater.from(mActivity);
View view = inflater.inflate(mPreference.getLayoutResource(), null /* root */,
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
index 762fbf8..4640efe 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
@@ -54,7 +54,6 @@
import com.android.settingslib.net.NetworkCycleChartData;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -71,7 +70,6 @@
import java.util.ArrayList;
import java.util.List;
-@Ignore
@RunWith(RobolectricTestRunner.class)
public class DataUsageListTest {
diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/BaseTimeZonePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/timezone/BaseTimeZonePreferenceControllerTest.java
index d952438..865c2eb 100644
--- a/tests/robotests/src/com/android/settings/datetime/timezone/BaseTimeZonePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/timezone/BaseTimeZonePreferenceControllerTest.java
@@ -18,15 +18,11 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.spy;
-
import android.app.Activity;
import android.content.Context;
import androidx.preference.Preference;
-import com.android.settings.utils.ActivityControllerWrapper;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -40,8 +36,7 @@
@Before
public void setUp() {
- mActivity = spy((Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get());
+ mActivity = Robolectric.setupActivity(Activity.class);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/FixedOffsetPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/timezone/FixedOffsetPreferenceControllerTest.java
index 5b6d8bd..4a6f92f 100644
--- a/tests/robotests/src/com/android/settings/datetime/timezone/FixedOffsetPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/timezone/FixedOffsetPreferenceControllerTest.java
@@ -23,8 +23,6 @@
import androidx.preference.Preference;
-import com.android.settings.utils.ActivityControllerWrapper;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -38,8 +36,7 @@
@Before
public void setUp() {
- mActivity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ mActivity = Robolectric.setupActivity(Activity.class);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/RegionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/timezone/RegionPreferenceControllerTest.java
index 6689a1f..ea0be24 100644
--- a/tests/robotests/src/com/android/settings/datetime/timezone/RegionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/timezone/RegionPreferenceControllerTest.java
@@ -18,14 +18,10 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.spy;
-
import android.app.Activity;
import androidx.preference.Preference;
-import com.android.settings.utils.ActivityControllerWrapper;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -39,8 +35,7 @@
@Before
public void setUp() {
- mActivity = spy((Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get());
+ mActivity = Robolectric.setupActivity(Activity.class);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/RegionSearchPickerTest.java b/tests/robotests/src/com/android/settings/datetime/timezone/RegionSearchPickerTest.java
index 69d46ea..78055cf 100644
--- a/tests/robotests/src/com/android/settings/datetime/timezone/RegionSearchPickerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/timezone/RegionSearchPickerTest.java
@@ -33,7 +33,6 @@
import com.android.settings.datetime.timezone.BaseTimeZoneAdapter.ItemViewHolder;
import com.android.settings.datetime.timezone.RegionSearchPicker.RegionItem;
import com.android.settings.datetime.timezone.model.TimeZoneData;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -143,8 +142,7 @@
@Implements(Fragment.class)
public static class ShadowFragment {
- private FragmentActivity mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ private FragmentActivity mActivity = Robolectric.setupActivity(FragmentActivity.class);
@Implementation
public final FragmentActivity getActivity() {
diff --git a/tests/robotests/src/com/android/settings/datetime/timezone/RegionZonePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/timezone/RegionZonePreferenceControllerTest.java
index f0cb6e8..6d1bf66 100644
--- a/tests/robotests/src/com/android/settings/datetime/timezone/RegionZonePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/timezone/RegionZonePreferenceControllerTest.java
@@ -23,8 +23,6 @@
import androidx.preference.Preference;
-import com.android.settings.utils.ActivityControllerWrapper;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -38,8 +36,7 @@
@Before
public void setUp() {
- mActivity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ mActivity = Robolectric.setupActivity(Activity.class);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java
index 9268a72..d469c71 100644
--- a/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java
@@ -32,7 +32,6 @@
import androidx.preference.SwitchPreference;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -60,7 +59,6 @@
mController.displayPreference(mScreen);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_withConfigNoShow_shouldReturnFalse() {
diff --git a/tests/robotests/src/com/android/settings/development/CoolColorTemperaturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/CoolColorTemperaturePreferenceControllerTest.java
index f0e8292..cf84618 100644
--- a/tests/robotests/src/com/android/settings/development/CoolColorTemperaturePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/CoolColorTemperaturePreferenceControllerTest.java
@@ -31,7 +31,6 @@
import androidx.preference.SwitchPreference;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -100,7 +99,6 @@
verify(mPreference).setChecked(false);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_shouldBeFalse() {
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPageTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPageTest.java
index 052f705..2d4ce43 100644
--- a/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPageTest.java
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPageTest.java
@@ -24,7 +24,6 @@
import com.android.settings.R;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPreferenceControllerTest.java
index 18cacc6..d4af470 100644
--- a/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentMemtagPreferenceControllerTest.java
@@ -38,7 +38,6 @@
import com.android.settingslib.testutils.shadow.ShadowInteractionJankMonitor;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -47,7 +46,6 @@
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowSystemProperties;
-@Ignore
@RunWith(RobolectricTestRunner.class)
@Config(
shadows = {
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDisabledActivityTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDisabledActivityTest.java
index ccfd68b..6b4068d 100644
--- a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDisabledActivityTest.java
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDisabledActivityTest.java
@@ -21,7 +21,6 @@
import android.content.Context;
import com.android.settings.R;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -35,8 +34,7 @@
@Test
public void launchActivity_shouldShowToast() {
- ActivityControllerWrapper.setup(
- Robolectric.buildActivity(DevelopmentSettingsDisabledActivity.class)).get();
+ Robolectric.setupActivity(DevelopmentSettingsDisabledActivity.class);
final Context context = RuntimeEnvironment.application;
assertThat(ShadowToast.getTextOfLatestToast())
diff --git a/tests/robotests/src/com/android/settings/development/RebootWithMtePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/RebootWithMtePreferenceControllerTest.java
index ad7d48e..f1e7d3f 100644
--- a/tests/robotests/src/com/android/settings/development/RebootWithMtePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/RebootWithMtePreferenceControllerTest.java
@@ -27,7 +27,6 @@
import androidx.test.core.app.ApplicationProvider;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -60,7 +59,6 @@
assertFalse(mController.isAvailable());
}
- @Ignore
@Test
public void onAvailable_sysPropEnabled() {
SystemProperties.set("ro.arm64.memtag.bootctl_supported", "1");
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceControllerTest.java
index 9da9e20..ccc91e6 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SecurityPatchLevelPreferenceControllerTest.java
@@ -35,8 +35,6 @@
import androidx.preference.Preference;
-import com.android.settings.utils.ActivityControllerWrapper;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -60,8 +58,7 @@
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- mContext = spy((Context) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get());
+ mContext = spy(Robolectric.setupActivity(Activity.class));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/legal/ModuleLicensePreferenceTest.java b/tests/robotests/src/com/android/settings/deviceinfo/legal/ModuleLicensePreferenceTest.java
index 304c5a5..08eec9e 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/legal/ModuleLicensePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/legal/ModuleLicensePreferenceTest.java
@@ -23,8 +23,6 @@
import android.content.Intent;
import android.content.pm.ModuleInfo;
-import com.android.settings.utils.ActivityControllerWrapper;
-
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
@@ -44,8 +42,7 @@
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- mContext = (Context) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ mContext = Robolectric.setupActivity(Activity.class);
mModuleInfo = new ModuleInfo();
mModuleInfo.setPackageName(PACKAGE_NAME);
mModuleInfo.setName(NAME);
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/legal/WallpaperAttributionsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/legal/WallpaperAttributionsPreferenceControllerTest.java
index 7831207..c06f069 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/legal/WallpaperAttributionsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/legal/WallpaperAttributionsPreferenceControllerTest.java
@@ -22,7 +22,6 @@
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
@@ -49,7 +48,6 @@
.isEqualTo(BasePreferenceController.AVAILABLE);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getAvailabilityStatus_ifNotVisible_false() {
diff --git a/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java
index 5d8d46b..3ad14e5 100644
--- a/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/AmbientDisplayAlwaysOnPreferenceControllerTest.java
@@ -36,7 +36,6 @@
import com.android.settings.testutils.shadow.ShadowSecureSettings;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -140,7 +139,6 @@
assertThat(controller.isSliceable()).isTrue();
}
- @Ignore
@Test
public void isSliceableIncorrectKey_returnsFalse() {
final AmbientDisplayAlwaysOnPreferenceController controller =
@@ -148,7 +146,6 @@
assertThat(controller.isSliceable()).isFalse();
}
- @Ignore
@Test
public void isPublicSlice_returnTrue() {
assertThat(mController.isPublicSlice()).isTrue();
diff --git a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java
index 1076d15..bbc9cf3 100644
--- a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java
@@ -40,7 +40,6 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.core.SettingsBaseActivity;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.transition.SettingsTransitionHelper;
import org.junit.Before;
@@ -166,9 +165,7 @@
@Test
public void handlePreferenceTreeClick_transitionTypeNone_shouldPassToNextActivity() {
- final Activity activity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
-
+ final Activity activity = Robolectric.setupActivity(Activity.class);
final BrightnessLevelPreferenceController controller =
new BrightnessLevelPreferenceController(activity, null);
final ShadowActivity shadowActivity = shadowOf(activity);
diff --git a/tests/robotests/src/com/android/settings/display/ControlsTrivialPrivacyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/ControlsTrivialPrivacyPreferenceControllerTest.java
index f276af0..a82e1f1 100644
--- a/tests/robotests/src/com/android/settings/display/ControlsTrivialPrivacyPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/ControlsTrivialPrivacyPreferenceControllerTest.java
@@ -44,7 +44,6 @@
import com.android.settings.core.BasePreferenceController;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -147,7 +146,6 @@
verify(mPreference, atLeastOnce()).setSummary(mController.getSummary());
}
- @Ignore
@Test
public void updateStateWithCustomizableLockScreenQuickAffordancesEnabled() {
setCustomizableLockScreenQuickAffordancesEnabled(true);
@@ -168,7 +166,6 @@
BasePreferenceController.DISABLED_DEPENDENT_SETTING);
}
- @Ignore
@Test
public void getAvailabilityStatusWithCustomizableLockScreenQuickAffordancesEnabled() {
setCustomizableLockScreenQuickAffordancesEnabled(true);
diff --git a/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceFragmentTest.java
index 01bb338..bdff55e 100644
--- a/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceFragmentTest.java
@@ -50,7 +50,6 @@
import com.android.settingslib.devicestate.DeviceStateRotationLockSettingsManager;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -177,7 +176,6 @@
assertThat(preferenceControllers).isEmpty();
}
- @Ignore
@Test
public void createPreferenceControllers_settableDeviceStates_returnsDeviceStateControllers() {
enableDeviceStateSettableRotationStates(new String[]{"0:1", "1:1"},
diff --git a/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
index 2ba0557..a5149b9 100644
--- a/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java
@@ -26,7 +26,6 @@
import android.content.Context;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
@@ -51,7 +50,6 @@
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getAvailabilityStatus_unsupportedWhenSet() {
diff --git a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
index 8ae2a8d..6db008d 100644
--- a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
@@ -45,7 +45,6 @@
import com.android.settings.testutils.shadow.ShadowActivity;
import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
import com.android.settings.testutils.shadow.ShadowUserManager;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import org.junit.Before;
@@ -78,8 +77,7 @@
@Before
public void setUp() {
- mActivity = (CustomActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(CustomActivity.class)).get();
+ mActivity = Robolectric.setupActivity(CustomActivity.class);
mActivityShadow = Shadow.extract(mActivity);
mHelper = new ActionDisabledByAdminDialogHelper(mActivity);
}
diff --git a/tests/robotests/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceControllerTest.java
index e91f56f..a2a0de4 100644
--- a/tests/robotests/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceControllerTest.java
@@ -31,7 +31,6 @@
import com.android.settingslib.utils.StringUtil;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -84,7 +83,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/flashlight/FlashlightHandleActivityTest.java b/tests/robotests/src/com/android/settings/flashlight/FlashlightHandleActivityTest.java
index a7bd21c..b0517cb 100644
--- a/tests/robotests/src/com/android/settings/flashlight/FlashlightHandleActivityTest.java
+++ b/tests/robotests/src/com/android/settings/flashlight/FlashlightHandleActivityTest.java
@@ -23,7 +23,6 @@
import com.android.settingslib.search.SearchIndexableRaw;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -50,7 +49,6 @@
assertThat(data).isEmpty();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getRawDataToIndex_sliceSupported_returnData() {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelDataTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelDataTest.java
index 13d60bb..7dc4eab 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelDataTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelDataTest.java
@@ -18,6 +18,10 @@
import static com.google.common.truth.Truth.assertThat;
+import android.util.Pair;
+
+import com.android.settings.testutils.BatteryTestUtils;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -211,4 +215,29 @@
assertThat(result.getHourlyBatteryLevelsPerDay().get(0).getLevels())
.isEqualTo(List.of(100, 98));
}
+
+ @Test
+ public void getIndexByTimestamps_returnExpectedResult() {
+ final BatteryLevelData batteryLevelData =
+ new BatteryLevelData(Map.of(
+ 1694354400000L, 1, // 2023-09-10 22:00:00
+ 1694361600000L, 2, // 2023-09-11 00:00:00
+ 1694368800000L, 3)); // 2023-09-11 02:00:00
+ final PowerAnomalyEvent event = BatteryTestUtils.createAppAnomalyEvent();
+
+ assertThat(batteryLevelData.getIndexByTimestamps(0L, 0L))
+ .isEqualTo(Pair.create(BatteryChartViewModel.SELECTED_INDEX_INVALID,
+ BatteryChartViewModel.SELECTED_INDEX_INVALID));
+ assertThat(batteryLevelData.getIndexByTimestamps(1694361600000L + 1L, 1694368800000L + 1L))
+ .isEqualTo(Pair.create(BatteryChartViewModel.SELECTED_INDEX_INVALID,
+ BatteryChartViewModel.SELECTED_INDEX_INVALID));
+ assertThat(batteryLevelData.getIndexByTimestamps(1694361600000L, 1694368800000L))
+ .isEqualTo(Pair.create(1, 0));
+ assertThat(batteryLevelData.getIndexByTimestamps(1694361600000L + 1L, 1694368800000L - 1L))
+ .isEqualTo(Pair.create(1, 0));
+ assertThat(batteryLevelData.getIndexByTimestamps(
+ event.getWarningItemInfo().getStartTimestamp(),
+ event.getWarningItemInfo().getEndTimestamp()))
+ .isEqualTo(Pair.create(1, 0));
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
index ac67dfd..630ff45 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
@@ -19,7 +19,9 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -45,16 +47,24 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+import java.util.Map;
+import java.util.Optional;
+
@RunWith(RobolectricTestRunner.class)
public final class BatteryTipsCardPreferenceTest {
private Context mContext;
private FakeFeatureFactory mFeatureFactory;
private BatteryTipsCardPreference mBatteryTipsCardPreference;
+ private PowerUsageAdvanced mPowerUsageAdvanced;
private BatteryTipsController mBatteryTipsController;
@Mock
private View mFakeView;
+ @Mock
+ private BatteryChartPreferenceController mBatteryChartPreferenceController;
+ @Mock
+ private BatteryUsageBreakdownController mBatteryUsageBreakdownController;
@Before
public void setUp() {
@@ -64,6 +74,14 @@
mBatteryTipsCardPreference = new BatteryTipsCardPreference(mContext, /*attrs=*/ null);
mBatteryTipsController = new BatteryTipsController(mContext);
mBatteryTipsController.mCardPreference = mBatteryTipsCardPreference;
+ mPowerUsageAdvanced = new PowerUsageAdvanced();
+ mPowerUsageAdvanced.mBatteryTipsController = mBatteryTipsController;
+ mPowerUsageAdvanced.mBatteryChartPreferenceController = mBatteryChartPreferenceController;
+ mPowerUsageAdvanced.mBatteryUsageBreakdownController = mBatteryUsageBreakdownController;
+ mPowerUsageAdvanced.mBatteryLevelData = Optional.of(new BatteryLevelData(Map.of(
+ 1694354400000L, 1, // 2023-09-10 22:00:00
+ 1694361600000L, 2, // 2023-09-11 00:00:00
+ 1694368800000L, 3))); // 2023-09-11 02:00:00
}
@Test
@@ -71,8 +89,9 @@
assertThat(mBatteryTipsCardPreference.getLayoutResource()).isEqualTo(
R.layout.battery_tips_card);
}
+
@Test
- public void onClick_mainBtn_getAdaptiveBrightnessLauncher() {
+ public void onClick_mainBtnOfSettingsAnomaly_getAdaptiveBrightnessLauncher() {
final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
PowerAnomalyEvent adaptiveBrightnessAnomaly =
BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent();
@@ -80,10 +99,10 @@
when(mFakeView.getId()).thenReturn(R.id.main_button);
doNothing().when(mContext).startActivity(captor.capture());
- mBatteryTipsController.handleBatteryTipsCardUpdated(adaptiveBrightnessAnomaly);
+ mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(adaptiveBrightnessAnomaly);
mBatteryTipsCardPreference.onClick(mFakeView);
- assertThat(mBatteryTipsCardPreference.isVisible()).isEqualTo(false);
+ assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
verify(mContext).startActivity(any(Intent.class));
final Intent intent = captor.getValue();
assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
@@ -96,21 +115,53 @@
@Test
public void onClick_dismissBtn_cardDismissAndLogged() {
- PowerAnomalyEvent screenTimeoutAnomaly =
+ final PowerAnomalyEvent screenTimeoutAnomaly =
BatteryTestUtils.createScreenTimeoutAnomalyEvent();
DatabaseUtils.removeDismissedPowerAnomalyKeys(mContext);
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
when(mFakeView.getId()).thenReturn(R.id.dismiss_button);
- mBatteryTipsController.handleBatteryTipsCardUpdated(screenTimeoutAnomaly);
+ mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(screenTimeoutAnomaly);
mBatteryTipsCardPreference.onClick(mFakeView);
- assertThat(mBatteryTipsCardPreference.isVisible()).isEqualTo(false);
- assertThat(DatabaseUtils.getDismissedPowerAnomalyKeys(mContext).size())
- .isEqualTo(1);
+ assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
+ assertThat(DatabaseUtils.getDismissedPowerAnomalyKeys(mContext)).hasSize(1);
assertThat(DatabaseUtils.getDismissedPowerAnomalyKeys(mContext))
.contains(PowerAnomalyKey.KEY_SCREEN_TIMEOUT.name());
verify(mFeatureFactory.metricsFeatureProvider).action(
mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, "ScreenTimeoutAnomaly");
}
+
+ @Test
+ public void onClick_mainBtnOfAppsAnomaly_selectHighlightSlot() {
+ final PowerAnomalyEvent appsAnomaly = BatteryTestUtils.createAppAnomalyEvent();
+ when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
+ when(mFakeView.getId()).thenReturn(R.id.main_button);
+
+ mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(appsAnomaly);
+ mBatteryTipsCardPreference.onClick(mFakeView);
+
+ assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
+ verify(mContext, never()).startActivity(any(Intent.class));
+ verify(mBatteryChartPreferenceController).selectHighlightSlotIndex();
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, "AppAnomaly");
+ }
+
+ @Test
+ public void onClick_dismissBtnOfAppsAnomaly_removeHighlightSlotIndex() {
+ final PowerAnomalyEvent appsAnomaly = BatteryTestUtils.createAppAnomalyEvent();
+ when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
+ when(mFakeView.getId()).thenReturn(R.id.dismiss_button);
+
+ mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(appsAnomaly);
+ mBatteryTipsCardPreference.onClick(mFakeView);
+
+ assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
+ verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(
+ eq(BatteryChartViewModel.SELECTED_INDEX_INVALID),
+ eq(BatteryChartViewModel.SELECTED_INDEX_INVALID));
+ verify(mFeatureFactory.metricsFeatureProvider).action(
+ mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, "AppAnomaly");
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java
index ac9de1f..913c00a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java
@@ -16,6 +16,8 @@
package com.android.settings.fuelgauge.batteryusage;
+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;
@@ -74,13 +76,25 @@
}
@Test
+ public void getDismissRecordKey_returnExpectedResult() {
+ assertThat(BatteryTipsController.getDismissRecordKey(
+ BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent()))
+ .isEqualTo("KEY_BRIGHTNESS");
+ assertThat(BatteryTipsController.getDismissRecordKey(
+ BatteryTestUtils.createScreenTimeoutAnomalyEvent()))
+ .isEqualTo("KEY_SCREEN_TIMEOUT");
+ assertThat(BatteryTipsController.getDismissRecordKey(
+ BatteryTestUtils.createAppAnomalyEvent()))
+ .isEqualTo("KEY_APP_1");
+ }
+
+ @Test
public void handleBatteryTipsCardUpdated_adaptiveBrightnessAnomaly_showAnomaly() {
PowerAnomalyEvent event = BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent();
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
mBatteryTipsController.handleBatteryTipsCardUpdated(event);
- verify(mBatteryTipsCardPreference).setAnomalyEventId("BrightnessAnomaly");
// Check pre-defined string
verify(mBatteryTipsCardPreference).setTitle(
"Turn on adaptive brightness to extend battery life");
@@ -90,9 +104,6 @@
verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
// Check proto info
- verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo(
- "com.android.settings.DisplaySettings",
- 46, "auto_brightness_entry");
verify(mBatteryTipsCardPreference).setVisible(true);
verify(mFeatureFactory.metricsFeatureProvider).action(
mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "BrightnessAnomaly");
@@ -105,16 +116,12 @@
mBatteryTipsController.handleBatteryTipsCardUpdated(event);
- verify(mBatteryTipsCardPreference).setAnomalyEventId("ScreenTimeoutAnomaly");
verify(mBatteryTipsCardPreference).setTitle("Reduce screen timeout to extend battery life");
verify(mBatteryTipsCardPreference).setIconResourceId(R.drawable.ic_battery_tips_lightbulb);
verify(mBatteryTipsCardPreference).setMainButtonStrokeColorResourceId(
R.color.color_accent_selector);
verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
- verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo(
- "com.android.settings.display.ScreenTimeoutSettings",
- 1852, "60000");
verify(mBatteryTipsCardPreference).setVisible(true);
verify(mFeatureFactory.metricsFeatureProvider).action(
mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "ScreenTimeoutAnomaly");
@@ -134,16 +141,12 @@
mBatteryTipsController.handleBatteryTipsCardUpdated(event);
- verify(mBatteryTipsCardPreference).setAnomalyEventId("ScreenTimeoutAnomaly");
verify(mBatteryTipsCardPreference).setTitle(testTitle);
verify(mBatteryTipsCardPreference).setIconResourceId(R.drawable.ic_battery_tips_lightbulb);
verify(mBatteryTipsCardPreference).setMainButtonStrokeColorResourceId(
R.color.color_accent_selector);
verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
- verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo(
- "com.android.settings.display.ScreenTimeoutSettings",
- 1852, "60000");
verify(mBatteryTipsCardPreference).setVisible(true);
verify(mFeatureFactory.metricsFeatureProvider).action(
mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "ScreenTimeoutAnomaly");
@@ -156,7 +159,6 @@
mBatteryTipsController.handleBatteryTipsCardUpdated(event);
- verify(mBatteryTipsCardPreference).setAnomalyEventId("AppAnomaly");
verify(mBatteryTipsCardPreference).setTitle(
"Chrome used more battery than usual in foreground");
verify(mBatteryTipsCardPreference).setIconResourceId(
@@ -165,8 +167,6 @@
R.color.color_battery_anomaly_yellow_selector);
verify(mBatteryTipsCardPreference).setMainButtonLabel("Check");
verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
- verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo(
- null, null, null);
verify(mBatteryTipsCardPreference).setVisible(true);
verify(mFeatureFactory.metricsFeatureProvider).action(
mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "AppAnomaly");
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvancedTest.java
index ee2a8b2..953c2d4 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvancedTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvancedTest.java
@@ -17,9 +17,15 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.ArgumentMatchers.notNull;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import android.content.Context;
+import android.util.Pair;
import com.android.settings.testutils.BatteryTestUtils;
import com.android.settings.testutils.shadow.ShadowDashboardFragment;
@@ -27,19 +33,47 @@
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 org.robolectric.annotation.Config;
+import java.util.Map;
+import java.util.Optional;
+import java.util.TimeZone;
+
@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowDashboardFragment.class)
public final class PowerUsageAdvancedTest {
private Context mContext;
+ private PowerUsageAdvanced mPowerUsageAdvanced;
+
+ @Mock
+ private BatteryTipsController mBatteryTipsController;
+ @Mock
+ private BatteryChartPreferenceController mBatteryChartPreferenceController;
+ @Mock
+ private ScreenOnTimeController mScreenOnTimeController;
+ @Mock
+ private BatteryUsageBreakdownController mBatteryUsageBreakdownController;
@Before
public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
mContext = spy(RuntimeEnvironment.application);
+
+ mPowerUsageAdvanced = new PowerUsageAdvanced();
+ mPowerUsageAdvanced.mBatteryTipsController = mBatteryTipsController;
+ mPowerUsageAdvanced.mBatteryChartPreferenceController = mBatteryChartPreferenceController;
+ mPowerUsageAdvanced.mScreenOnTimeController = mScreenOnTimeController;
+ mPowerUsageAdvanced.mBatteryUsageBreakdownController = mBatteryUsageBreakdownController;
+ mPowerUsageAdvanced.mBatteryLevelData = Optional.of(new BatteryLevelData(Map.of(
+ 1694354400000L, 1, // 2023-09-10 22:00:00
+ 1694361600000L, 2, // 2023-09-11 00:00:00
+ 1694368800000L, 3))); // 2023-09-11 02:00:00
}
@Test
@@ -87,6 +121,65 @@
final PowerAnomalyEvent highestScoreEvent =
PowerUsageAdvanced.getHighestScoreAnomalyEvent(mContext, powerAnomalyEventList);
- assertThat(highestScoreEvent).isEqualTo(null);
+ assertThat(highestScoreEvent).isNull();
+ }
+
+ @Test
+ public void onDisplayAnomalyEventUpdated_withSettingsAnomalyEvent_skipHighlightSlotEffect() {
+ final PowerAnomalyEvent event = BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent();
+
+ mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(event);
+
+ assertThat(mPowerUsageAdvanced.mPowerAnomalyEvent).isEqualTo(event);
+ verify(mBatteryTipsController).handleBatteryTipsCardUpdated(eq(event));
+ verify(mPowerUsageAdvanced.mBatteryTipsController).setOnAnomalyConfirmListener(isNull());
+ verify(mPowerUsageAdvanced.mBatteryTipsController).setOnAnomalyRejectListener(isNull());
+ verify(mPowerUsageAdvanced.mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(
+ eq(BatteryChartViewModel.SELECTED_INDEX_INVALID),
+ eq(BatteryChartViewModel.SELECTED_INDEX_INVALID));
+ }
+
+ @Test
+ public void onDisplayAnomalyEventUpdated_withAppAnomalyEvent_setHighlightSlotEffect() {
+ final PowerAnomalyEvent event = BatteryTestUtils.createAppAnomalyEvent();
+
+ mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(event);
+
+ assertThat(mPowerUsageAdvanced.mPowerAnomalyEvent).isEqualTo(event);
+ verify(mBatteryTipsController).handleBatteryTipsCardUpdated(eq(event));
+ verify(mBatteryTipsController).setOnAnomalyConfirmListener(isNull());
+ verify(mBatteryTipsController).setOnAnomalyRejectListener(isNull());
+
+ assertThat(event.getWarningItemInfo().hasStartTimestamp()).isTrue();
+ assertThat(event.getWarningItemInfo().hasEndTimestamp()).isTrue();
+ assertThat(mPowerUsageAdvanced.mBatteryLevelData.get().getIndexByTimestamps(
+ event.getWarningItemInfo().getStartTimestamp(),
+ event.getWarningItemInfo().getEndTimestamp()
+ )).isEqualTo(Pair.create(1, 0));
+ verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(eq(1), eq(0));
+ verify(mBatteryTipsController).setOnAnomalyConfirmListener(notNull());
+ verify(mBatteryTipsController).setOnAnomalyRejectListener(notNull());
+ }
+
+ @Test
+ public void onDisplayAnomalyEventUpdated_withNull_removeHighlightSlotEffect() {
+ final PowerAnomalyEvent event = BatteryTestUtils.createAppAnomalyEvent();
+
+ mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(event);
+ mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(null);
+
+ assertThat(mPowerUsageAdvanced.mPowerAnomalyEvent).isNull();
+ verify(mBatteryTipsController, times(2))
+ .setOnAnomalyConfirmListener(isNull());
+ verify(mBatteryTipsController, times(2))
+ .setOnAnomalyRejectListener(isNull());
+ verify(mBatteryTipsController).setOnAnomalyConfirmListener(notNull());
+ verify(mBatteryTipsController).setOnAnomalyRejectListener(notNull());
+
+ verify(mBatteryChartPreferenceController)
+ .onHighlightSlotIndexUpdate(eq(1), eq(0));
+ verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(
+ eq(BatteryChartViewModel.SELECTED_INDEX_INVALID),
+ eq(BatteryChartViewModel.SELECTED_INDEX_INVALID));
}
}
diff --git a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
index 6bb8cd6..c281dca 100644
--- a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java
@@ -55,7 +55,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -106,7 +105,6 @@
assertThat(avatarView.getVisibility()).isNotEqualTo(View.VISIBLE);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void launch_configEnabled_shouldShowAvatar() {
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
index f3c3e12..f18d94f 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
@@ -61,7 +61,6 @@
import com.android.settingslib.core.lifecycle.events.OnStop;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -152,7 +151,6 @@
assertThat(actual).containsExactlyElementsIn(expected);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void loadContextualCards_restartLoaderNotNeeded_shouldInitLoader() {
@@ -162,7 +160,6 @@
any(ContextualCardManager.CardContentLoaderCallbacks.class));
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void loadContextualCards_restartLoaderNeeded_shouldRestartLoaderAndSetIsFirstLaunch() {
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/BackgroundDataConditionControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/BackgroundDataConditionControllerTest.java
index 1413be3..aa4e11f 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/BackgroundDataConditionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/BackgroundDataConditionControllerTest.java
@@ -25,7 +25,6 @@
import android.net.NetworkPolicyManager;
import com.android.settings.Settings;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -53,8 +52,7 @@
MockitoAnnotations.initMocks(this);
ShadowApplication.getInstance().setSystemService(Context.NETWORK_POLICY_SERVICE,
mNetworkPolicyManager);
- mActivity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ mActivity = Robolectric.setupActivity(Activity.class);
mController = new BackgroundDataConditionController(mActivity, mConditionManager);
}
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionControllerTest.java
index aedd601..299780c 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionControllerTest.java
@@ -24,7 +24,6 @@
import android.content.ComponentName;
import com.android.settings.Settings;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -47,8 +46,7 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mActivity = spy((Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get());
+ mActivity = spy(Robolectric.setupActivity(Activity.class));
mController = new WorkModeConditionController(mActivity, mConditionManager);
}
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java
index 582c4a1..502a62b 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java
@@ -34,7 +34,6 @@
import com.android.settingslib.suggestions.SuggestionController;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -69,7 +68,6 @@
assertThat(controller.mSuggestionController).isNotNull();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void init_configOff_shouldNotCreateSuggestionController() {
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java
index b8b2aa8..8c25260 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardControllerTest.java
@@ -144,7 +144,6 @@
.isEqualTo(ContextualCardFeedbackDialog.class.getName());
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isFeedbackEnabled_hasFeedbackEmail_debug_returnTrue() {
diff --git a/tests/robotests/src/com/android/settings/inputmethod/GameControllerPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/GameControllerPreferenceControllerTest.java
index ea4675d..ae5afd2 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/GameControllerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/GameControllerPreferenceControllerTest.java
@@ -32,7 +32,6 @@
import android.view.InputDevice;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -111,7 +110,6 @@
assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getAvailabilityStatus_ifDisabled_shouldReturnDisabled() {
diff --git a/tests/robotests/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnablerTest.java b/tests/robotests/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnablerTest.java
index 5d67955..2d4af3c 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnablerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnablerTest.java
@@ -27,7 +27,6 @@
import androidx.fragment.app.FragmentActivity;
import com.android.settings.R;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -49,8 +48,7 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
mFragment = spy(new InputMethodAndSubtypeEnabler());
when(mFragment.getActivity()).thenReturn(mActivity);
}
diff --git a/tests/robotests/src/com/android/settings/inputmethod/KeyboardLayoutPickerControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/KeyboardLayoutPickerControllerTest.java
index 7840bfd..734f610 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/KeyboardLayoutPickerControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/KeyboardLayoutPickerControllerTest.java
@@ -39,7 +39,6 @@
import com.android.settings.testutils.shadow.ShadowInputDevice;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -50,7 +49,6 @@
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
-@Ignore
@RunWith(RobolectricTestRunner.class)
public class KeyboardLayoutPickerControllerTest {
diff --git a/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java
index 0a5be27..dd6da3b 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java
@@ -34,7 +34,6 @@
import androidx.preference.Preference;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -78,7 +77,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void testVirtualKeyboard_ifDisabled_shouldNotBeShown() {
diff --git a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
index e2c39ec..4429dd7 100644
--- a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
@@ -45,7 +45,6 @@
import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -115,7 +114,6 @@
assertThat(controllers.isEmpty()).isFalse();
}
- @Ignore
@Test
public void testNonIndexableKeys_existInXmlLayout() {
final Context context = spy(RuntimeEnvironment.application);
diff --git a/tests/robotests/src/com/android/settings/language/PhoneLanguagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/language/PhoneLanguagePreferenceControllerTest.java
index 8a362cd..aa4c32e 100644
--- a/tests/robotests/src/com/android/settings/language/PhoneLanguagePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/language/PhoneLanguagePreferenceControllerTest.java
@@ -31,7 +31,6 @@
import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -94,7 +93,6 @@
.isEqualTo(BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void testIsAvailable_ifDisabled_shouldReturnFalse() {
diff --git a/tests/robotests/src/com/android/settings/language/PointerSpeedControllerTest.java b/tests/robotests/src/com/android/settings/language/PointerSpeedControllerTest.java
index 9a3fe55..a917a6d 100644
--- a/tests/robotests/src/com/android/settings/language/PointerSpeedControllerTest.java
+++ b/tests/robotests/src/com/android/settings/language/PointerSpeedControllerTest.java
@@ -23,7 +23,6 @@
import android.content.Context;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
@@ -34,25 +33,24 @@
@RunWith(RobolectricTestRunner.class)
public class PointerSpeedControllerTest {
- private Context mContext;
- private PointerSpeedController mController;
+ private Context mContext;
+ private PointerSpeedController mController;
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application.getApplicationContext());
- mController = new PointerSpeedController(mContext);
- }
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application.getApplicationContext());
+ mController = new PointerSpeedController(mContext);
+ }
- @Test
- public void testDeviceAdministrators_byDefault_shouldBeShown() {
- assertThat(mController.isAvailable()).isTrue();
- }
+ @Test
+ public void testDeviceAdministrators_byDefault_shouldBeShown() {
+ assertThat(mController.isAvailable()).isTrue();
+ }
- @Ignore
- @Test
- @Config(qualifiers = "mcc999")
- public void testDeviceAdministrators_ifDisabled_shouldNotBeShown() {
- assertThat(mController.isAvailable()).isFalse();
- }
+ @Test
+ @Config(qualifiers = "mcc999")
+ public void testDeviceAdministrators_ifDisabled_shouldNotBeShown() {
+ assertThat(mController.isAvailable()).isFalse();
+ }
}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/localepicker/LocaleDialogFragmentTest.java b/tests/robotests/src/com/android/settings/localepicker/LocaleDialogFragmentTest.java
index bb22012..c8637c8 100644
--- a/tests/robotests/src/com/android/settings/localepicker/LocaleDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/localepicker/LocaleDialogFragmentTest.java
@@ -36,7 +36,6 @@
import com.android.internal.app.LocaleStore;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -65,8 +64,7 @@
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
mDialogFragment = LocaleDialogFragment.newInstance();
LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(Locale.ENGLISH);
Bundle args = new Bundle();
diff --git a/tests/robotests/src/com/android/settings/location/LocationInjectedServicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationInjectedServicesPreferenceControllerTest.java
index 49caa70..bed3346 100644
--- a/tests/robotests/src/com/android/settings/location/LocationInjectedServicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/LocationInjectedServicesPreferenceControllerTest.java
@@ -44,7 +44,6 @@
import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -115,7 +114,6 @@
verify(mContext).unregisterReceiver(mController.mInjectedSettingsReceiver);
}
- @Ignore
@Test
public void workProfileDisallowShareLocationOn_getParentUserLocationServicesOnly() {
final int fakeWorkProfileId = 123;
@@ -168,7 +166,6 @@
verify(mSettingsInjector).reloadStatusMessages();
}
- @Ignore
@Test
public void withUserRestriction_shouldDisableLocationAccuracy() {
final List<Preference> preferences = new ArrayList<>();
diff --git a/tests/robotests/src/com/android/settings/location/LocationServicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationServicesPreferenceControllerTest.java
index dacb7cf..f5868c2 100644
--- a/tests/robotests/src/com/android/settings/location/LocationServicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/LocationServicesPreferenceControllerTest.java
@@ -23,7 +23,6 @@
import android.content.Context;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -50,7 +49,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void testLocationScanning_ifDisabled_shouldNotBeShown() {
diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java
index 8d6d2d9..bf866b2 100644
--- a/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java
@@ -44,6 +44,8 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.Settings.MobileNetworkActivity;
+import com.android.settings.network.helper.SubscriptionAnnotation;
+import com.android.settings.network.helper.SubscriptionGrouping;
import com.android.settings.widget.AddPreference;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.core.lifecycle.Lifecycle;
diff --git a/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
index b5c8218..775ac47 100644
--- a/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
@@ -67,7 +67,6 @@
import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -174,7 +173,6 @@
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getAvailabilityStatus_unsupportedWhenSet() {
@@ -296,7 +294,6 @@
com.android.settingslib.R.string.private_dns_mode_opportunistic));
}
- @Ignore
@Test
public void isEnabled_canBeDisabledByAdmin() {
final int userId = UserHandle.myUserId();
diff --git a/tests/robotests/src/com/android/settings/notification/ChargingSoundPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ChargingSoundPreferenceControllerTest.java
index 1c864c9..0131bc5 100644
--- a/tests/robotests/src/com/android/settings/notification/ChargingSoundPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ChargingSoundPreferenceControllerTest.java
@@ -31,7 +31,6 @@
import androidx.preference.SwitchPreference;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -76,7 +75,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
index 982316a..ed93473 100644
--- a/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
@@ -42,7 +42,6 @@
import com.android.settingslib.media.MediaOutputConstants;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -89,7 +88,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/notification/NotificationRingtonePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/NotificationRingtonePreferenceControllerTest.java
index 783a36b..1aecad5 100644
--- a/tests/robotests/src/com/android/settings/notification/NotificationRingtonePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/NotificationRingtonePreferenceControllerTest.java
@@ -21,7 +21,6 @@
import android.media.RingtoneManager;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
@@ -45,7 +44,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/notification/RedactionInterstitialTest.java b/tests/robotests/src/com/android/settings/notification/RedactionInterstitialTest.java
index 2668e6d..9d475b8 100644
--- a/tests/robotests/src/com/android/settings/notification/RedactionInterstitialTest.java
+++ b/tests/robotests/src/com/android/settings/notification/RedactionInterstitialTest.java
@@ -27,7 +27,6 @@
import org.junit.After;
import org.junit.Assert;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -36,7 +35,6 @@
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowUserManager;
-@Ignore
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {
ShadowUtils.class,
diff --git a/tests/robotests/src/com/android/settings/notification/ScreenLockSoundPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ScreenLockSoundPreferenceControllerTest.java
index e0b7e14..0a1ce1f 100644
--- a/tests/robotests/src/com/android/settings/notification/ScreenLockSoundPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ScreenLockSoundPreferenceControllerTest.java
@@ -31,7 +31,6 @@
import androidx.preference.SwitchPreference;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -76,7 +75,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/notification/TouchSoundPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/TouchSoundPreferenceControllerTest.java
index 53359cb..09fdada 100644
--- a/tests/robotests/src/com/android/settings/notification/TouchSoundPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/TouchSoundPreferenceControllerTest.java
@@ -32,7 +32,6 @@
import androidx.preference.SwitchPreference;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -80,7 +79,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
index 301a6db..7715c62 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
@@ -39,14 +39,12 @@
import com.google.android.setupdesign.GlifLayout;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
-@Ignore
@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowUtils.class)
public class ChooseLockPatternTest {
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java
index de55435..fcab797 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java
@@ -24,7 +24,6 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.google.android.setupcompat.util.WizardManagerHelper;
import com.google.android.setupdesign.util.ThemeHelper;
@@ -44,8 +43,7 @@
@Test
public void testLaunchConfirmationActivityWithExternal() {
- final Activity activity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ final Activity activity = Robolectric.setupActivity(Activity.class);
ChooseLockSettingsHelper.Builder builder = new ChooseLockSettingsHelper.Builder(activity);
builder.setRequestCode(100)
@@ -130,8 +128,7 @@
@Test
public void launchConfirmPattern_ForceVerify_shouldLaunchInternalActivity() {
- final Activity activity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ final Activity activity = Robolectric.setupActivity(Activity.class);
ChooseLockSettingsHelper.Builder builder = new ChooseLockSettingsHelper.Builder(activity);
builder.setRequestCode(100)
@@ -151,8 +148,7 @@
@Test
public void launchConfirmPassword_ForceVerify_shouldLaunchInternalActivity() {
- final Activity activity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ final Activity activity = Robolectric.setupActivity(Activity.class);
ChooseLockSettingsHelper.Builder builder = new ChooseLockSettingsHelper.Builder(activity);
builder.setRequestCode(100)
@@ -172,8 +168,7 @@
@Test
public void launchConfirmPassword_remoteValidation_passwordLockType() throws Exception {
- final Activity activity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ Activity activity = Robolectric.setupActivity(Activity.class);
ShadowActivity shadowActivity = Shadows.shadowOf(activity);
RemoteLockscreenValidationSession request = createRemoteLockscreenValidationSession(
KeyguardManager.PASSWORD, VALID_REMAINING_ATTEMPTS);
@@ -202,9 +197,7 @@
@Test
public void launchConfirmPassword_remoteValidation_pinLockType() throws Exception {
- Activity activity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
-
+ Activity activity = Robolectric.setupActivity(Activity.class);
ShadowActivity shadowActivity = Shadows.shadowOf(activity);
RemoteLockscreenValidationSession request = createRemoteLockscreenValidationSession(
KeyguardManager.PIN, VALID_REMAINING_ATTEMPTS);
@@ -233,8 +226,7 @@
@Test
public void launchConfirmPattern_remoteValidation_patternLockType() throws Exception {
- Activity activity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ Activity activity = Robolectric.setupActivity(Activity.class);
ShadowActivity shadowActivity = Shadows.shadowOf(activity);
RemoteLockscreenValidationSession request = createRemoteLockscreenValidationSession(
KeyguardManager.PATTERN, VALID_REMAINING_ATTEMPTS);
diff --git a/tests/robotests/src/com/android/settings/password/ConfirmLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/ConfirmLockPasswordTest.java
index 2be8aba..d26c33b 100644
--- a/tests/robotests/src/com/android/settings/password/ConfirmLockPasswordTest.java
+++ b/tests/robotests/src/com/android/settings/password/ConfirmLockPasswordTest.java
@@ -62,7 +62,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -162,7 +161,6 @@
InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
}
- @Ignore
@Test
public void handleNext_normalFlow_doesNotAttemptRemoteLockscreenValidation() {
ConfirmLockPassword activity = Robolectric.buildActivity(
@@ -177,7 +175,6 @@
verifyNoInteractions(mRemoteLockscreenValidationClient);
}
- @Ignore
@Test
public void handleNext_remoteValidation_correctGuess_checkboxChecked() throws Exception {
ConfirmDeviceCredentialBaseActivity activity =
diff --git a/tests/robotests/src/com/android/settings/password/ConfirmLockPatternTest.java b/tests/robotests/src/com/android/settings/password/ConfirmLockPatternTest.java
index 68bee68..2ed7988 100644
--- a/tests/robotests/src/com/android/settings/password/ConfirmLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/password/ConfirmLockPatternTest.java
@@ -55,11 +55,9 @@
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -145,9 +143,8 @@
@Test
public void onPatternDetected_normalFlow_doesNotAttemptRemoteLockscreenValidation() {
- ConfirmLockPattern activity = (ConfirmLockPattern) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(ConfirmLockPattern.class, new Intent())).get();
-
+ ConfirmLockPattern activity = Robolectric.buildActivity(
+ ConfirmLockPattern.class, new Intent()).setup().get();
ConfirmDeviceCredentialBaseFragment fragment =
getConfirmDeviceCredentialBaseFragment(activity);
LockPatternView lockPatternView = activity.findViewById(R.id.lockPattern);
@@ -158,7 +155,6 @@
verifyNoInteractions(mRemoteLockscreenValidationClient);
}
- @Ignore
@Test
public void onPatternDetected_remoteValidation_guessValid_checkboxChecked() throws Exception {
ConfirmDeviceCredentialBaseActivity activity =
diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockGenericTest.java
index 0eb365b..c23ce9b 100644
--- a/tests/robotests/src/com/android/settings/password/SetupChooseLockGenericTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockGenericTest.java
@@ -44,7 +44,6 @@
import com.android.settings.testutils.shadow.ShadowPasswordUtils;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.google.android.setupdesign.GlifPreferenceLayout;
@@ -58,6 +57,7 @@
import org.mockito.junit.MockitoRule;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
+import org.robolectric.android.controller.ActivityController;
import org.robolectric.annotation.Config;
import java.util.List;
@@ -202,8 +202,8 @@
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, forFace);
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS, forBiometric);
- SetupChooseLockGeneric activity = (SetupChooseLockGeneric) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(SetupChooseLockGeneric.class, intent)).get();
+ SetupChooseLockGeneric activity = ActivityController.of(
+ new SetupChooseLockGeneric(), intent).setup().get();
List<Fragment> fragments = activity.getSupportFragmentManager().getFragments();
assertThat(fragments).isNotNull();
diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
index bff6991..97a326f 100644
--- a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
@@ -40,7 +40,6 @@
import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settings.widget.ScrollToParentEditText;
import com.google.android.setupcompat.PartnerCustomizationLayout;
@@ -50,7 +49,6 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.Shadows;
import org.robolectric.android.controller.ActivityController;
@@ -96,8 +94,7 @@
application,
new IntentBuilder(application).build());
- ActivityControllerWrapper.setup(
- Robolectric.buildActivity(SetupChooseLockPassword.class, intent)).get();
+ ActivityController.of(new SetupChooseLockPassword(), intent).setup().get();
}
@Test
@@ -218,8 +215,7 @@
application,
new IntentBuilder(application).build());
intent.putExtra(ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, true);
- return (SetupChooseLockPassword) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(SetupChooseLockPassword.class, intent)).get();
+ return ActivityController.of(new SetupChooseLockPassword(), intent).setup().get();
}
@Implements(ChooseLockGenericController.class)
diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
index d353a22..648c42f 100644
--- a/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
@@ -45,19 +45,17 @@
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.google.android.setupcompat.PartnerCustomizationLayout;
import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupcompat.template.FooterButton;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.Shadows;
+import org.robolectric.android.controller.ActivityController;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.LooperMode;
import org.robolectric.shadows.ShadowPackageManager;
@@ -86,9 +84,7 @@
new IntentBuilder(application)
.setUserId(UserHandle.myUserId())
.build());
-
- mActivity = (SetupChooseLockPattern) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(SetupChooseLockPattern.class, intent)).get();
+ mActivity = ActivityController.of(new SetupChooseLockPattern(), intent).setup().get();
}
@Test
@@ -102,7 +98,6 @@
assertThat(componentEnabled).isEqualTo(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
}
- @Ignore
@Test
public void optionsButton_whenPatternSelected_shouldBeVisible() {
final Button button = mActivity.findViewById(R.id.screen_lock_options);
@@ -128,14 +123,12 @@
assertWithMessage("List items shown").that(count).isEqualTo(3);
}
- @Ignore
@Config(qualifiers = "sw400dp")
@Test
public void sw400dp_shouldShowScreenLockOptions() {
verifyScreenLockOptionsShown();
}
- @Ignore
@Config(qualifiers = "sw400dp-land")
@Test
public void sw400dpLandscape_shouldShowScreenLockOptions() {
@@ -160,7 +153,6 @@
verifyScreenLockOptionsHidden();
}
- @Ignore
@Test
public void skipButton_shouldBeVisible_duringNonFingerprintFlow() {
final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
diff --git a/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java b/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java
index 2cc256b..53a80dc 100644
--- a/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java
@@ -35,7 +35,6 @@
import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Rule;
@@ -71,8 +70,7 @@
ShadowUtils.setFingerprintManager(mFingerprintManager);
ShadowUtils.setFaceManager(mFaceManager);
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
- mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
when(mFakeFeatureFactory.mFaceFeatureProvider.isSetupWizardSupported(any())).thenReturn(
true);
diff --git a/tests/robotests/src/com/android/settings/password/TestUtils.java b/tests/robotests/src/com/android/settings/password/TestUtils.java
index fa6a11d..ef08f05 100644
--- a/tests/robotests/src/com/android/settings/password/TestUtils.java
+++ b/tests/robotests/src/com/android/settings/password/TestUtils.java
@@ -27,7 +27,6 @@
import com.android.security.SecureBox;
import com.android.settings.R;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.robolectric.Robolectric;
@@ -96,11 +95,7 @@
public static ConfirmDeviceCredentialBaseActivity buildConfirmDeviceCredentialBaseActivity(
Class<? extends ConfirmDeviceCredentialBaseActivity> impl, Intent intent) {
-
- return (ConfirmDeviceCredentialBaseActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(impl, intent)).get();
-
- //return Robolectric.buildActivity(impl, intent).setup().get();
+ return Robolectric.buildActivity(impl, intent).setup().get();
}
public static ConfirmDeviceCredentialBaseFragment getConfirmDeviceCredentialBaseFragment(
diff --git a/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java b/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
index 8b8fad0..09b1ea9 100644
--- a/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
+++ b/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
@@ -31,7 +31,6 @@
import com.android.settingslib.search.SearchIndexableRaw;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
@@ -96,7 +95,6 @@
assertThat(mIndexProvider.getNonIndexableKeys(mContext)).isEqualTo(Collections.EMPTY_LIST);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getAllPreferenceControllers_shouldCreateControllerFromCodeAndXml() {
@@ -180,7 +178,6 @@
assertThat(nonIndexableKeys).contains("status_header");
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getNonIndexableKeys_hasSearchableAttributeInXml_shouldSuppressUnsearchable() {
diff --git a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
index 0aa49eb..f349600 100644
--- a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
@@ -33,7 +33,6 @@
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Ignore;
@@ -55,11 +54,7 @@
@Before
public void setUp() {
FakeFeatureFactory.setupForTest();
- mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
-
- mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
mProvider = new SearchFeatureProviderImpl();
mPackageManager = Shadows.shadowOf(mActivity.getPackageManager());
Settings.Global.putInt(mActivity.getContentResolver(),
diff --git a/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java b/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
index c70411c..21b00a3 100644
--- a/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
+++ b/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
@@ -30,7 +30,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -131,7 +130,6 @@
assertThat(cursor.getString(6)).isNull();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void testNonIndexablesColumnFetched() {
diff --git a/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java
index 67798aa..410198b 100644
--- a/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/EncryptionStatusPreferenceControllerTest.java
@@ -32,7 +32,6 @@
import com.android.settings.testutils.shadow.ShadowUserManager;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -57,7 +56,6 @@
mPreference = new Preference(mContext);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_notVisible_false() {
diff --git a/tests/robotests/src/com/android/settings/security/MemtagPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/MemtagPreferenceControllerTest.java
index 521a939..e3fc3cc 100644
--- a/tests/robotests/src/com/android/settings/security/MemtagPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/MemtagPreferenceControllerTest.java
@@ -37,7 +37,6 @@
import com.android.settingslib.testutils.shadow.ShadowInteractionJankMonitor;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -46,7 +45,6 @@
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowSystemProperties;
-@Ignore
@RunWith(RobolectricTestRunner.class)
@Config(
shadows = {
diff --git a/tests/robotests/src/com/android/settings/security/ScreenPinningPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/ScreenPinningPreferenceControllerTest.java
index 546545c..4f694bc 100644
--- a/tests/robotests/src/com/android/settings/security/ScreenPinningPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/ScreenPinningPreferenceControllerTest.java
@@ -28,7 +28,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
@@ -63,7 +62,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/security/ShowPasswordPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/ShowPasswordPreferenceControllerTest.java
index 35e1c9b..206dee1 100644
--- a/tests/robotests/src/com/android/settings/security/ShowPasswordPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/ShowPasswordPreferenceControllerTest.java
@@ -28,7 +28,6 @@
import androidx.preference.PreferenceScreen;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -62,7 +61,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/security/screenlock/PinPrivacyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/screenlock/PinPrivacyPreferenceControllerTest.java
index 73b4b9b..171fb44 100644
--- a/tests/robotests/src/com/android/settings/security/screenlock/PinPrivacyPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/screenlock/PinPrivacyPreferenceControllerTest.java
@@ -32,7 +32,6 @@
import com.android.internal.widget.LockPatternUtils;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -67,7 +66,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
public void isAvailable_lockSetToPinOrPw_shouldReturnTrue() {
when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID)).thenReturn(
diff --git a/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
index 43f5cfc..33a62f4 100644
--- a/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/trustagent/ManageTrustAgentsPreferenceControllerTest.java
@@ -32,7 +32,6 @@
import com.android.settingslib.utils.StringUtil;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -76,7 +75,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_whenNotVisible_isFalse() {
diff --git a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
index b6b9788..0463e00 100644
--- a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentListPreferenceControllerTest.java
@@ -45,7 +45,6 @@
import com.android.settingslib.search.SearchIndexableRaw;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -102,7 +101,6 @@
assertThat(mController).isInstanceOf(PreferenceControllerMixin.class);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_whenNotVisible_isFalse() {
@@ -152,7 +150,6 @@
verify(mCategory, atLeastOnce()).addPreference(any(Preference.class));
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void onResume_ifNotAvailable_shouldNotAddNewAgents() {
diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
index 4903a28..57f4e17 100644
--- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
@@ -30,6 +30,7 @@
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -63,7 +64,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -636,7 +636,6 @@
verify(mManager, never()).grantSlicePermission(anyString(), any(Uri.class));
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void grantAllowlistedPackagePermissions_hasPackageAllowlist_shouldGrant() {
@@ -664,7 +663,6 @@
assertThat(mProvider.isPrivateSlicesNeeded(uri)).isFalse();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isPrivateSlicesNeeded_correctUriWithPermissionAndIsSI_returnTrue() {
diff --git a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java
index ec828a8..69f1886 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java
@@ -41,7 +41,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -89,7 +88,6 @@
mFakeFeatureFactory.searchFeatureProvider = mock(SearchFeatureProvider.class);
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void testFakeProvider_convertsFakeData() {
diff --git a/tests/robotests/src/com/android/settings/support/SupportPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/support/SupportPreferenceControllerTest.java
index f095cc8..735dd34 100644
--- a/tests/robotests/src/com/android/settings/support/SupportPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/support/SupportPreferenceControllerTest.java
@@ -28,7 +28,6 @@
import androidx.preference.Preference;
import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -47,8 +46,7 @@
@Before
public void setUp() {
- mActivity = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ mActivity = Robolectric.setupActivity(Activity.class);
mFeatureFactory = FakeFeatureFactory.setupForTest();
mPreference = new Preference(mActivity);
mPreference.setKey("test_key");
diff --git a/tests/robotests/src/com/android/settings/survey/SurveyMixinTest.java b/tests/robotests/src/com/android/settings/survey/SurveyMixinTest.java
index 0fc3ca1..8f43268 100644
--- a/tests/robotests/src/com/android/settings/survey/SurveyMixinTest.java
+++ b/tests/robotests/src/com/android/settings/survey/SurveyMixinTest.java
@@ -11,7 +11,6 @@
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.overlay.SurveyFeatureProvider;
import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -43,8 +42,7 @@
@Test
public void onResume_noActionIfActivityDoesNotExist() {
// Pretend we are an activity that is starting up
- FragmentActivity temp = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ FragmentActivity temp = Robolectric.setupActivity(FragmentActivity.class);
when(mFragment.getActivity()).thenReturn(null);
SurveyMixin mixin = new SurveyMixin(mFragment, FAKE_KEY);
mixin.onResume();
diff --git a/tests/robotests/src/com/android/settings/system/AdditionalSystemUpdatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/AdditionalSystemUpdatePreferenceControllerTest.java
index a853b9e..0abfc20 100644
--- a/tests/robotests/src/com/android/settings/system/AdditionalSystemUpdatePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/system/AdditionalSystemUpdatePreferenceControllerTest.java
@@ -20,7 +20,6 @@
import android.content.Context;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
@@ -47,7 +46,6 @@
assertThat(mController.isAvailable()).isFalse();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void displayPrefs_ifAvailable_shouldDisplay() {
diff --git a/tests/robotests/src/com/android/settings/system/FactoryResetDemoUserPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/FactoryResetDemoUserPreferenceControllerTest.java
new file mode 100644
index 0000000..0c92b05
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/system/FactoryResetDemoUserPreferenceControllerTest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.settings.system;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import com.android.settings.testutils.shadow.ShadowUserManager;
+import com.android.settings.testutils.shadow.ShadowUtils;
+
+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;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = ShadowUserManager.class)
+public class FactoryResetDemoUserPreferenceControllerTest {
+
+ private static final String FACTORY_RESET_DEMO_USER_KEY = "factory_reset_demo_user";
+
+ private ShadowUserManager mShadowUserManager;
+
+ private Context mContext;
+ private FactoryResetDemoUserPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ mShadowUserManager = ShadowUserManager.getShadow();
+
+ mController = new FactoryResetDemoUserPreferenceController(
+ mContext, FACTORY_RESET_DEMO_USER_KEY);
+ }
+
+ @After
+ public void tearDown() {
+ ShadowUtils.reset();
+ mShadowUserManager.setIsAdminUser(false);
+ mShadowUserManager.setIsDemoUser(false);
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_DEMO_MODE, 0);
+ }
+
+ @Test
+ public void isAvailable_systemUser() {
+ mShadowUserManager.setIsAdminUser(true);
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void isAvailable_nonSystemUser() {
+ mShadowUserManager.setIsAdminUser(false);
+ mShadowUserManager.setIsDemoUser(false);
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void isAvailable_demoUser() {
+ mShadowUserManager.setIsAdminUser(false);
+
+ // Place the device in demo mode.
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_DEMO_MODE, 1);
+
+ // Indicate the user is a demo user.
+ mShadowUserManager.addUser(UserHandle.myUserId(), "test", UserInfo.FLAG_DEMO);
+
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void getPreferenceKey() {
+ assertThat(mController.getPreferenceKey()).isEqualTo(FACTORY_RESET_DEMO_USER_KEY);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java
index f2a932e..6e6fad8 100644
--- a/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java
@@ -49,7 +49,7 @@
mContext = RuntimeEnvironment.application;
mShadowUserManager = ShadowUserManager.getShadow();
- mController = new FactoryResetPreferenceController(mContext);
+ mController = new FactoryResetPreferenceController(mContext, FACTORY_RESET_KEY);
}
@After
@@ -85,7 +85,7 @@
// Indicate the user is a demo user.
mShadowUserManager.addUser(UserHandle.myUserId(), "test", UserInfo.FLAG_DEMO);
- assertThat(mController.isAvailable()).isTrue();
+ assertThat(mController.isAvailable()).isFalse();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/system/ResetPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/ResetPreferenceControllerTest.java
index 7ceac23..dd95d29 100644
--- a/tests/robotests/src/com/android/settings/system/ResetPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/system/ResetPreferenceControllerTest.java
@@ -20,7 +20,6 @@
import android.content.Context;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -46,7 +45,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_ifNotVisible_false() {
diff --git a/tests/robotests/src/com/android/settings/system/SystemUpdatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/SystemUpdatePreferenceControllerTest.java
index 544ba96..61aa294 100644
--- a/tests/robotests/src/com/android/settings/system/SystemUpdatePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/system/SystemUpdatePreferenceControllerTest.java
@@ -38,7 +38,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -112,7 +111,6 @@
assertThat(mPreference.isVisible()).isFalse();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void displayPrefs_ifAdminUser_butNotVisible_shouldNotDisplay() {
diff --git a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
index 3297d1e..1035560 100644
--- a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
@@ -283,6 +283,9 @@
.setKey(PowerAnomalyKey.KEY_APP)
.setScore(2.0f)
.setWarningItemInfo(WarningItemInfo.newBuilder()
+ .setDismissRecordKey("KEY_APP_1")
+ .setStartTimestamp(1694361600000L) // 2023-09-11 00:00:00
+ .setEndTimestamp(1694368800000L) // 2023-09-11 02:00:00
.setTitleString("Chrome used more battery than usual in foreground")
.setMainButtonString("Check")
.setCancelButtonString("Got it")
diff --git a/tests/robotests/src/com/android/settings/theme/ContrastPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/theme/ContrastPreferenceControllerTest.java
index 8f78df9..dbd3372 100644
--- a/tests/robotests/src/com/android/settings/theme/ContrastPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/theme/ContrastPreferenceControllerTest.java
@@ -38,7 +38,6 @@
import androidx.test.core.app.ApplicationProvider;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -74,7 +73,6 @@
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
- @Ignore
@Test
public void testHandlePreferenceTreeClick() {
Preference preference = new Preference(mContext);
diff --git a/tests/robotests/src/com/android/settings/users/TimeoutToDockUserPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/users/TimeoutToDockUserPreferenceControllerTest.java
index 92bdc6d..3d8e893 100644
--- a/tests/robotests/src/com/android/settings/users/TimeoutToDockUserPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/users/TimeoutToDockUserPreferenceControllerTest.java
@@ -40,7 +40,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -127,7 +126,6 @@
BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
}
- @Ignore
@Test
public void getAvailabilityStatus_isCurrentlyMainUser_returnDisabledForUser() {
when(Utils.canCurrentUserDream(mContext)).thenReturn(true);
@@ -136,7 +134,6 @@
BasePreferenceController.DISABLED_FOR_USER);
}
- @Ignore
@Test
public void getAvailabilityStatus_featureAndMultiUserEnabledAndNonMainUser_returnAvailable() {
when(Utils.canCurrentUserDream(mContext)).thenReturn(false);
diff --git a/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
index fbe4a05..256e08b 100644
--- a/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/users/UserDetailsSettingsTest.java
@@ -63,7 +63,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -662,7 +661,6 @@
assertThat(result).isTrue();
}
- @Ignore
@Test
public void canDeleteUser_adminSelectsUser_hasRemoveRestriction_shouldReturnFalse() {
setupSelectedUser();
diff --git a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
index 37af4b1..36eeac8 100644
--- a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
@@ -73,7 +73,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.AdditionalMatchers;
@@ -262,7 +261,6 @@
eq(SettingsEnums.ACTION_USER_GUEST_EXIT_CONFIRMED));
}
- @Ignore
@Test
public void withDisallowRemoveUser_ShouldDisableRemoveUser() {
// TODO(b/115781615): Tidy robolectric tests
diff --git a/tests/robotests/src/com/android/settings/utils/ActivityControllerWrapper.java b/tests/robotests/src/com/android/settings/utils/ActivityControllerWrapper.java
deleted file mode 100644
index 6ebbc65..0000000
--- a/tests/robotests/src/com/android/settings/utils/ActivityControllerWrapper.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2023 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.os.Bundle;
-
-import org.robolectric.android.controller.ActivityController;
-
-/*
- * b/275023433
- * This class is a workaround for Robolectric, in order to re-enable presubmit
- * We don't use ActivityController#visible() to avoid test crash
- */
-public class ActivityControllerWrapper {
-
- private static final boolean ENABLE_WORKAROUND = true;
-
-
- public static ActivityController setup(ActivityController controller) {
- if (ENABLE_WORKAROUND) {
- return controller.create().start().postCreate(null).resume();
- } else {
- return controller.setup();
- }
- }
-
- public static ActivityController setup(ActivityController controller, Bundle savedState) {
- return controller.create(savedState)
- .start()
- .restoreInstanceState(savedState)
- .postCreate(savedState)
- .resume();
- }
-
-}
diff --git a/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java b/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java
index ed63cc0..6201bcb 100644
--- a/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wallpaper/WallpaperSuggestionActivityTest.java
@@ -27,8 +27,6 @@
import android.content.Intent;
import android.content.res.Resources;
-import com.android.settings.utils.ActivityControllerWrapper;
-
import com.google.android.setupcompat.util.WizardManagerHelper;
import org.junit.After;
@@ -121,13 +119,10 @@
@Test
public void addExtras_intentNotFromSetupWizard_extrasHasFocusWallpaper() {
- WallpaperSuggestionActivity activity =
- (WallpaperSuggestionActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WallpaperSuggestionActivity.class,
- new Intent(Intent.ACTION_MAIN).setComponent(
+ WallpaperSuggestionActivity activity = Robolectric.buildActivity(
+ WallpaperSuggestionActivity.class, new Intent(Intent.ACTION_MAIN).setComponent(
new ComponentName(RuntimeEnvironment.application,
- PACKAGE_WALLPAPER_ACTIVITY)))).get();
-
+ PACKAGE_WALLPAPER_ACTIVITY))).setup().get();
Intent intent = Shadows.shadowOf(activity).getNextStartedActivity();
assertThat(intent).isNotNull();
diff --git a/tests/robotests/src/com/android/settings/wallpaper/WallpaperTypePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wallpaper/WallpaperTypePreferenceControllerTest.java
index fc6df9c..8871cc8 100644
--- a/tests/robotests/src/com/android/settings/wallpaper/WallpaperTypePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wallpaper/WallpaperTypePreferenceControllerTest.java
@@ -25,7 +25,6 @@
import androidx.preference.Preference;
import com.android.settings.core.BasePreferenceController;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -45,8 +44,7 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mContext = (Activity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(Activity.class)).get();
+ mContext = Robolectric.setupActivity(Activity.class);
mController = new WallpaperTypePreferenceController(mContext, "pref_key");
mIntent = new Intent();
mPreference = new Preference(mContext);
diff --git a/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java
index bc816fa..834f3d1 100644
--- a/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java
@@ -45,7 +45,6 @@
import com.android.settingslib.widget.LayoutPreference;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -204,7 +203,6 @@
verify(activity, never()).startActivity(any(Intent.class));
}
- @Ignore
@Test
public void bindButton_hasAppInfo_shouldAttachClickListener() {
final View appLinks = mLayoutInflater.inflate(
diff --git a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
index 809aa87..732defb 100644
--- a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
@@ -39,7 +39,6 @@
import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -49,7 +48,6 @@
import org.robolectric.annotation.Config;
import org.robolectric.shadows.androidx.fragment.FragmentController;
-@Ignore
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowRestrictedLockUtilsInternal.class, ShadowInteractionJankMonitor.class})
public class SeekBarPreferenceTest {
@@ -102,7 +100,6 @@
assertThat(mSeekBarPreference.isSelectable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc998")
public void isSelectable_default_returnFalse() {
diff --git a/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java
index 33c9fac..c079029 100644
--- a/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java
@@ -29,7 +29,6 @@
import com.android.settings.R;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -59,7 +58,6 @@
mHolder = PreferenceViewHolder.createInstanceForTests(rootView);
}
- @Ignore
@Test
public void onBindViewHolder_isRestricted_restrictIconShouldDisplay() {
mPreference.onBindViewHolder(mHolder);
diff --git a/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java
index 2c0ad7d..2492de1 100644
--- a/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java
@@ -40,7 +40,6 @@
import com.android.settings.testutils.shadow.ShadowSettingsMediaPlayer;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -141,7 +140,6 @@
assertThat(mAnimationController.isPlaying()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void onViewVisible_createAnimationController() {
diff --git a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java
index bb0ae1a..5e3d715 100644
--- a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java
@@ -30,7 +30,6 @@
import com.android.settingslib.core.AbstractPreferenceController;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -69,7 +68,6 @@
TestConfigureWifiSettings mSettings;
- @Ignore
@Before
public void setUp() {
when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
@@ -148,7 +146,6 @@
verify(mPreferenceScreen).removeAll();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void getNonIndexableKeys_ifPageDisabled_shouldNotIndexResource() {
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java
index fb29924..616cb0b 100644
--- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java
@@ -37,7 +37,6 @@
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settings.wifi.NetworkRequestErrorDialogFragment.ERROR_DIALOG_TYPE;
import com.android.wifitrackerlib.WifiPickerTracker;
@@ -82,8 +81,7 @@
.thenReturn(mock(WifiPickerTracker.class));
mScanResults.add(getScanResult(TEST_SSID, TEST_CAPABILITY));
- mActivity = spy((NetworkRequestDialogActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(NetworkRequestDialogActivity.class)).get());
+ mActivity = spy(Robolectric.setupActivity(NetworkRequestDialogActivity.class));
when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
}
@@ -183,8 +181,7 @@
@Test
public void onAbort_withFakeActivity_callStopAndPopShouldBeTrue() {
final FakeNetworkRequestDialogActivity fakeActivity =
- (FakeNetworkRequestDialogActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FakeNetworkRequestDialogActivity.class)).get();
+ Robolectric.setupActivity(FakeNetworkRequestDialogActivity.class);
fakeActivity.onResume();
fakeActivity.onAbort();
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
index 2679745..386f66d 100644
--- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
@@ -45,7 +45,6 @@
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiPickerTracker;
@@ -104,11 +103,10 @@
when(fakeFeatureFactory.wifiTrackerLibProvider.createWifiPickerTracker(
any(), any(), any(), any(), any(), anyLong(), anyLong(), any()))
.thenReturn(mock(WifiPickerTracker.class));
- Intent intent = new Intent();
- intent.putExtra(NetworkRequestDialogFragment.EXTRA_APP_NAME,
- TEST_APP_NAME);
- mActivity = (WifiDialogActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiDialogActivity.class, intent)).get();
+
+ mActivity = Robolectric.buildActivity(FragmentActivity.class,
+ new Intent().putExtra(NetworkRequestDialogFragment.EXTRA_APP_NAME,
+ TEST_APP_NAME)).setup().get();
networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance());
networkRequestDialogFragment.mWifiPickerTracker = mWifiPickerTracker;
}
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java
index 8b9faf2..c9cc02e 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java
@@ -41,7 +41,6 @@
import android.os.UserManager;
import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.wifi.AccessPoint;
import com.android.wifitrackerlib.WifiEntry;
@@ -99,8 +98,7 @@
when(mWifiEntry.canConnect()).thenReturn(true);
FakeFeatureFactory.setupForTest();
- mActivity = spy((WifiDialogActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiDialogActivity.class)).get());
+ mActivity = spy(Robolectric.setupActivity(WifiDialogActivity.class));
when(mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager);
when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
when(mActivity.getSystemService(KeyguardManager.class)).thenReturn(mKeyguardManager);
@@ -156,8 +154,7 @@
final Intent intent = new Intent("com.android.settings.WIFI_DIALOG");
intent.putExtra(WifiDialogActivity.KEY_CHOSEN_WIFIENTRY_KEY, "FAKE_KEY");
intent.putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, true);
- mActivity = spy((WifiDialogActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiDialogActivity.class, intent)).get());
+ mActivity = spy(Robolectric.buildActivity(WifiDialogActivity.class, intent).setup().get());
when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
mActivity.onSubmit(mWifiDialog2);
@@ -169,8 +166,7 @@
public void onSubmit_whenConnectForCallerIsFalse_shouldNotConnectToNetwork() {
final Intent intent = new Intent();
intent.putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, false);
- mActivity = spy((WifiDialogActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiDialogActivity.class, intent)).get());
+ mActivity = spy(Robolectric.buildActivity(WifiDialogActivity.class, intent).setup().get());
when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
mActivity.onSubmit(mWifiDialog);
@@ -183,8 +179,7 @@
final Intent intent = new Intent("com.android.settings.WIFI_DIALOG");
intent.putExtra(WifiDialogActivity.KEY_CHOSEN_WIFIENTRY_KEY, "FAKE_KEY");
intent.putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, false);
- mActivity = spy((WifiDialogActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiDialogActivity.class, intent)).get());
+ mActivity = spy(Robolectric.buildActivity(WifiDialogActivity.class, intent).setup().get());
when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
mActivity.onSubmit(mWifiDialog2);
@@ -198,8 +193,7 @@
intent.putExtra(WifiDialogActivity.KEY_CONNECT_FOR_CALLER, false);
intent.putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true);
intent.putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true);
- mActivity = spy((WifiDialogActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiDialogActivity.class, intent)).get());
+ mActivity = spy(Robolectric.buildActivity(WifiDialogActivity.class, intent).setup().get());
when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
doNothing().when(mActivity).createDialogWithSuwTheme();
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiNoInternetDialogTest.java b/tests/robotests/src/com/android/settings/wifi/WifiNoInternetDialogTest.java
index 1788a0d..8e52210 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiNoInternetDialogTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiNoInternetDialogTest.java
@@ -43,10 +43,8 @@
import android.os.Bundle;
import com.android.settings.R;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -57,7 +55,6 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
-@Ignore
@RunWith(RobolectricTestRunner.class)
public class WifiNoInternetDialogTest {
@@ -87,8 +84,8 @@
@Test
public void launchActivity_noIntentAction_shouldNotFatalException() {
- ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiNoInternetDialog.class)).get();
+ WifiNoInternetDialog wifiNoInternetDialog =
+ Robolectric.setupActivity(WifiNoInternetDialog.class);
}
@Test
@@ -276,7 +273,6 @@
RuntimeEnvironment.application.getPackageName(),
WifiNoInternetDialog.class.getName());
intent.putExtra(ConnectivityManager.EXTRA_NETWORK, network);
- mActivity = spy((WifiNoInternetDialog) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiNoInternetDialog.class, intent)).get());
+ mActivity = spy(Robolectric.buildActivity(WifiNoInternetDialog.class, intent).get());
}
}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiPrimarySwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiPrimarySwitchPreferenceControllerTest.java
index 2c12517..9204d43 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiPrimarySwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiPrimarySwitchPreferenceControllerTest.java
@@ -46,7 +46,6 @@
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -97,7 +96,6 @@
assertThat(mController.isAvailable()).isTrue();
}
- @Ignore
@Test
@Config(qualifiers = "mcc999")
public void testWifiPrimarySwitch_ifDisabled_shouldNotBeShown() {
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiScanModeActivityTest.java b/tests/robotests/src/com/android/settings/wifi/WifiScanModeActivityTest.java
index 1d3dadf..5937997 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiScanModeActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiScanModeActivityTest.java
@@ -30,7 +30,6 @@
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.wifi.WifiPermissionChecker;
import org.junit.After;
@@ -69,8 +68,7 @@
when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
when(mUserManager.isGuestUser()).thenReturn(false);
- mActivity = spy((WifiScanModeActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiScanModeActivity.class)).get());
+ mActivity = spy(Robolectric.setupActivity(WifiScanModeActivity.class));
when(mActivity.getApplicationContext()).thenReturn(mContext);
mActivity.mWifiPermissionChecker = mWifiPermissionChecker;
}
@@ -82,8 +80,8 @@
@Test
public void launchActivity_noIntentAction_shouldNotFatalException() {
- ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiScanModeActivity.class)).get();
+ WifiScanModeActivity wifiScanModeActivity =
+ Robolectric.setupActivity(WifiScanModeActivity.class);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java
index c5f4cd4..303963d 100644
--- a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java
@@ -43,7 +43,6 @@
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiPickerTracker;
@@ -100,8 +99,7 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
mAddAppNetworksFragment = spy(new AddAppNetworksFragment());
- mActivity = spy((FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get());
+ mActivity = spy(Robolectric.setupActivity(FragmentActivity.class));
doReturn(mActivity).when(mAddAppNetworksFragment).getActivity();
when(mWifiManager.isWifiEnabled()).thenReturn(true);
when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java
index da0bdf2..0ece537 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java
@@ -40,7 +40,6 @@
import com.android.settings.R;
import com.android.settings.testutils.shadow.ShadowDisclaimerItemFactory;
import com.android.settings.testutils.shadow.ShadowFragment;
-import com.android.settings.utils.ActivityControllerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -90,8 +89,7 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
- mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
mFragment = spy(new WifiCallingDisclaimerFragment());
doReturn(mActivity).when(mFragment).getActivity();
diff --git a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
index 56c1ec7..d8605de 100644
--- a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
@@ -28,8 +28,6 @@
import androidx.test.core.app.ApplicationProvider;
-import com.android.settings.utils.ActivityControllerWrapper;
-
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -64,15 +62,14 @@
mIntent.putExtra(WifiDppUtils.EXTRA_WIFI_SECURITY, "WPA");
mIntent.putExtra(WifiDppUtils.EXTRA_WIFI_PRE_SHARED_KEY, "\\012345678,");
- mActivity = spy((WifiDppConfiguratorActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiDppConfiguratorActivity.class)).get());
+ mActivity = spy(Robolectric.setupActivity(WifiDppConfiguratorActivity.class));
when(mActivity.getApplicationContext()).thenReturn(mContext);
}
@Test
public void launchActivity_noIntentAction_shouldNotFatalException() {
- ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiDppConfiguratorActivity.class)).get();
+ WifiDppConfiguratorActivity wifiDppConfiguratorActivity =
+ Robolectric.setupActivity(WifiDppConfiguratorActivity.class);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java
index 717e4a7..67d4678 100644
--- a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java
@@ -19,16 +19,15 @@
import static com.android.settings.wifi.dpp.WifiDppEnrolleeActivity.ACTION_ENROLLEE_QR_CODE_SCANNER;
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.Intent;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.wifi.WifiRestrictionsCache;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -58,18 +57,16 @@
when(mIntent.getAction()).thenReturn(ACTION_ENROLLEE_QR_CODE_SCANNER);
when(mIntent.getStringExtra(WifiDppUtils.EXTRA_WIFI_SSID)).thenReturn(WIFI_SSID);
- mActivity = (WifiDppEnrolleeActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiDppEnrolleeActivity.class)).get();
+ mActivity = spy(Robolectric.setupActivity(WifiDppEnrolleeActivity.class));
mActivity.mWifiRestrictionsCache = mWifiRestrictionsCache;
}
@Test
public void launchActivity_noIntentAction_shouldNotFatalException() {
- ActivityControllerWrapper.setup(
- Robolectric.buildActivity(WifiDppEnrolleeActivity.class)).get();
+ WifiDppEnrolleeActivity wifiDppEnrolleeActivity =
+ Robolectric.setupActivity(WifiDppEnrolleeActivity.class);
}
- @Ignore
@Test
public void handleIntent_noIntentAction_shouldFinish() {
when(mIntent.getAction()).thenReturn(null);
@@ -79,7 +76,6 @@
verify(mActivity).finish();
}
- @Ignore
@Test
public void handleIntent_notAllowedConfigWifi_shouldFinish() {
when(mWifiRestrictionsCache.isConfigWifiAllowed()).thenReturn(false);
@@ -89,7 +85,6 @@
verify(mActivity).finish();
}
- @Ignore
@Test
public void handleIntent_hasIntentDataAndAllowedConfigWifi_shouldShowFragment() {
when(mWifiRestrictionsCache.isConfigWifiAllowed()).thenReturn(true);
diff --git a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java
index 25a59a9..a8b1d9c 100644
--- a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2pSettingsTest.java
@@ -48,7 +48,6 @@
import com.android.settings.testutils.XmlTestUtils;
import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.core.AbstractPreferenceController;
import org.junit.Before;
@@ -90,8 +89,7 @@
mContext = RuntimeEnvironment.application;
TestWifiP2pSettings.sMockWifiP2pManager = mWifiP2pManager;
- mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
mFragment = new TestWifiP2pSettings();
mFragment.mWifiP2pManager = mWifiP2pManager;
doReturn(mChannel).when(mWifiP2pManager).initialize(any(), any(), any());
diff --git a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2Test.java b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2Test.java
index d26287d..3e6c64b 100644
--- a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints2/SavedAccessPointsWifiSettings2Test.java
@@ -34,7 +34,6 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
-import com.android.settings.utils.ActivityControllerWrapper;
import com.android.settingslib.core.AbstractPreferenceController;
import org.junit.Before;
@@ -66,8 +65,7 @@
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
mSettings = spy(new TestFragment());
- mActivity = (FragmentActivity) ActivityControllerWrapper.setup(
- Robolectric.buildActivity(FragmentActivity.class)).get();
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
doReturn(mSubscribedApController).when(mSettings)
.use(SubscribedAccessPointsPreferenceController2.class);
diff --git a/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.kt b/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.kt
index 5350bd8..0cb03fe 100644
--- a/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.kt
+++ b/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.kt
@@ -19,6 +19,7 @@
import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
@@ -30,11 +31,11 @@
@RunWith(AndroidJUnit4::class)
@SmallTest
class AboutPhoneSettingsTests {
- private lateinit var device: UiDevice
+ private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@Before
fun setUp() {
- device = startMainActivityFromHomeScreen(Settings.ACTION_DEVICE_INFO_SETTINGS)
+ device.startMainActivityFromHomeScreen(Settings.ACTION_DEVICE_INFO_SETTINGS)
}
@Test
diff --git a/tests/uitests/src/com/android/settings/ui/AppsSettingsRetainFilterTests.kt b/tests/uitests/src/com/android/settings/ui/AppsSettingsRetainFilterTests.kt
index 23d5384..43610ec 100644
--- a/tests/uitests/src/com/android/settings/ui/AppsSettingsRetainFilterTests.kt
+++ b/tests/uitests/src/com/android/settings/ui/AppsSettingsRetainFilterTests.kt
@@ -16,50 +16,40 @@
package com.android.settings.ui
-import android.os.RemoteException
import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiDevice
+import com.android.settings.ui.testutils.SettingsTestUtils.assertObject
import com.android.settings.ui.testutils.SettingsTestUtils.clickObject
import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
-import com.android.settings.ui.testutils.SettingsTestUtils.waitObject
-import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class AppsSettingsRetainFilterTests {
- private lateinit var device: UiDevice
+ private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@Before
fun setUp() {
- device = startMainActivityFromHomeScreen(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS)
+ device.startMainActivityFromHomeScreen(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS)
}
@Test
fun testDisablingSystemAppAndRotateDevice() {
device.clickObject(By.text("Calculator"))
device.clickObject(By.text("Disable"))
-
- // Click on "Disable App" on dialog.
- device.clickObject(By.text("Disable app"))
- assertThat(device.waitObject(By.text("Enable"))).isNotNull()
+ device.clickObject(By.text("Disable app")) // Click on "Disable App" on dialog.
+ device.assertObject(By.text("Enable"))
device.pressBack()
device.clickObject(By.text("All apps"))
device.clickObject(By.text("Disabled apps"))
- try {
- device.setOrientationLeft()
- } catch (e: RemoteException) {
- throw RuntimeException("Failed to freeze device orientation", e)
- }
- try {
- device.unfreezeRotation()
- } catch (e: RemoteException) {
- throw RuntimeException("Failed to un-freeze device orientation", e)
- }
- assertThat(device.waitObject(By.text("Disabled apps"))).isNotNull()
+ device.setOrientationLeft()
+ device.assertObject(By.text("Disabled apps"))
+ device.setOrientationNatural()
+ device.assertObject(By.text("Disabled apps"))
device.clickObject(By.text("Calculator"))
device.clickObject(By.text("Enable"))
}
diff --git a/tests/uitests/src/com/android/settings/ui/AppsSettingsTests.kt b/tests/uitests/src/com/android/settings/ui/AppsSettingsTests.kt
index 9c2dc5f..9c22247 100644
--- a/tests/uitests/src/com/android/settings/ui/AppsSettingsTests.kt
+++ b/tests/uitests/src/com/android/settings/ui/AppsSettingsTests.kt
@@ -17,30 +17,31 @@
package com.android.settings.ui
import android.provider.Settings
+import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiDevice
import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
+import com.android.settings.ui.testutils.SettingsTestUtils.assertObject
import com.android.settings.ui.testutils.SettingsTestUtils.clickObject
import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
import com.android.settings.ui.testutils.SettingsTestUtils.waitObject
-import com.google.common.truth.Truth.assertWithMessage
import org.junit.Before
import org.junit.Test
/** Verifies basic functionality of the About Phone screen */
class AppsSettingsTests {
- private lateinit var device: UiDevice
+ private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@Before
fun setUp() {
- device = startMainActivityFromHomeScreen(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS)
- val title = device.waitObject(By.text("All apps"))
- assertWithMessage("Could not find Settings > Apps screen").that(title).isNotNull()
+ device.startMainActivityFromHomeScreen(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS)
+ device.assertObject(By.text("All apps"))
}
@Test
fun testAppSettingsListForCalculator() {
device.clickObject(By.text("Calculator"))
+ device.waitObject(By.text("Open"))
device.assertHasTexts(ON_SCREEN_TEXTS)
}
@@ -50,8 +51,7 @@
device.clickObject(By.text("Disable"))
device.clickObject(By.text("Disable app")) // Click on "Disable app" on dialog.
device.clickObject(By.text("Enable"))
- val disableButton = device.waitObject(By.text("Disable"))
- assertWithMessage("App not enabled successfully").that(disableButton).isNotNull()
+ device.assertObject(By.text("Disable"))
}
private companion object {
@@ -63,7 +63,7 @@
"Screen time",
"App battery usage",
"Language",
- "Open by default"
+ "Unused app settings",
)
}
}
diff --git a/tests/uitests/src/com/android/settings/ui/BatterySettingsTest.kt b/tests/uitests/src/com/android/settings/ui/BatterySettingsTest.kt
index fbdd2e5..d677fb5 100644
--- a/tests/uitests/src/com/android/settings/ui/BatterySettingsTest.kt
+++ b/tests/uitests/src/com/android/settings/ui/BatterySettingsTest.kt
@@ -18,6 +18,7 @@
import android.content.Intent
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
@@ -27,11 +28,11 @@
@RunWith(AndroidJUnit4::class)
class BatterySettingsTest {
- private lateinit var device: UiDevice
+ private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@Before
fun setUp() {
- device = startMainActivityFromHomeScreen(Intent.ACTION_POWER_USAGE_SUMMARY)
+ device.startMainActivityFromHomeScreen(Intent.ACTION_POWER_USAGE_SUMMARY)
}
@Test
diff --git a/tests/uitests/src/com/android/settings/ui/DataSaverSettingsTest.kt b/tests/uitests/src/com/android/settings/ui/DataSaverSettingsTest.kt
index 2312291..f3d2d9d 100644
--- a/tests/uitests/src/com/android/settings/ui/DataSaverSettingsTest.kt
+++ b/tests/uitests/src/com/android/settings/ui/DataSaverSettingsTest.kt
@@ -18,26 +18,26 @@
import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiDevice
+import com.android.settings.ui.testutils.SettingsTestUtils.assertObject
import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
-import com.android.settings.ui.testutils.SettingsTestUtils.waitObject
-import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class DataSaverSettingsTest {
- private lateinit var device: UiDevice
+ private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@Before
fun setUp() {
- device = startMainActivityFromHomeScreen(Settings.ACTION_DATA_SAVER_SETTINGS)
+ device.startMainActivityFromHomeScreen(Settings.ACTION_DATA_SAVER_SETTINGS)
}
@Test
fun hasSwitchBar() {
- assertThat(device.waitObject(By.text("Use Data Saver"))).isNotNull()
+ device.assertObject(By.text("Use Data Saver"))
}
}
diff --git a/tests/uitests/src/com/android/settings/ui/DevelopmentSettingsTest.kt b/tests/uitests/src/com/android/settings/ui/DevelopmentSettingsTest.kt
new file mode 100644
index 0000000..1afa3ab
--- /dev/null
+++ b/tests/uitests/src/com/android/settings/ui/DevelopmentSettingsTest.kt
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2023 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.ui
+
+import android.os.SystemClock
+import android.provider.Settings
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
+import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
+import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class DevelopmentSettingsTest {
+ private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+
+ @Before
+ fun setUp() {
+ device.executeShellCommand("settings put global development_settings_enabled 1")
+ SystemClock.sleep(1000)
+ device.startMainActivityFromHomeScreen(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)
+ }
+
+ @Test
+ fun hasTexts() {
+ device.assertHasTexts(ON_SCREEN_TEXTS)
+ }
+
+ private companion object {
+ val ON_SCREEN_TEXTS = listOf(
+ "Use developer options",
+ "Memory",
+ "Stay awake",
+ "USB debugging",
+ "App Compatibility Changes",
+ )
+ }
+}
diff --git a/tests/uitests/src/com/android/settings/ui/HomepageDisplayTests.kt b/tests/uitests/src/com/android/settings/ui/HomepageDisplayTests.kt
index e3ee159..72a84dc 100644
--- a/tests/uitests/src/com/android/settings/ui/HomepageDisplayTests.kt
+++ b/tests/uitests/src/com/android/settings/ui/HomepageDisplayTests.kt
@@ -18,6 +18,7 @@
import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
@@ -27,11 +28,11 @@
@RunWith(AndroidJUnit4::class)
class HomepageDisplayTests {
- private lateinit var device: UiDevice
+ private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@Before
fun setUp() {
- device = startMainActivityFromHomeScreen(Settings.ACTION_SETTINGS)
+ device.startMainActivityFromHomeScreen(Settings.ACTION_SETTINGS)
}
@Test
diff --git a/tests/uitests/src/com/android/settings/ui/SecuritySettingsTest.kt b/tests/uitests/src/com/android/settings/ui/SecuritySettingsTest.kt
index 1fb1a54..5339e95 100644
--- a/tests/uitests/src/com/android/settings/ui/SecuritySettingsTest.kt
+++ b/tests/uitests/src/com/android/settings/ui/SecuritySettingsTest.kt
@@ -18,6 +18,7 @@
import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
@@ -27,11 +28,11 @@
@RunWith(AndroidJUnit4::class)
class SecuritySettingsTest {
- private lateinit var device: UiDevice
+ private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@Before
fun setUp() {
- device = startMainActivityFromHomeScreen(Settings.ACTION_SECURITY_SETTINGS)
+ device.startMainActivityFromHomeScreen(Settings.ACTION_SECURITY_SETTINGS)
}
@Test
diff --git a/tests/uitests/src/com/android/settings/ui/StorageSettingsTest.kt b/tests/uitests/src/com/android/settings/ui/StorageSettingsTest.kt
index db0472d..771512a 100644
--- a/tests/uitests/src/com/android/settings/ui/StorageSettingsTest.kt
+++ b/tests/uitests/src/com/android/settings/ui/StorageSettingsTest.kt
@@ -18,6 +18,7 @@
import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
@@ -27,11 +28,11 @@
@RunWith(AndroidJUnit4::class)
class StorageSettingsTest {
- private lateinit var device: UiDevice
+ private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@Before
fun setUp() {
- device = startMainActivityFromHomeScreen(Settings.ACTION_INTERNAL_STORAGE_SETTINGS)
+ device.startMainActivityFromHomeScreen(Settings.ACTION_INTERNAL_STORAGE_SETTINGS)
}
@Test
diff --git a/tests/uitests/src/com/android/settings/ui/SyncSettingsTest.kt b/tests/uitests/src/com/android/settings/ui/SyncSettingsTest.kt
index 384b386..5de5ba5 100644
--- a/tests/uitests/src/com/android/settings/ui/SyncSettingsTest.kt
+++ b/tests/uitests/src/com/android/settings/ui/SyncSettingsTest.kt
@@ -18,6 +18,7 @@
import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
@@ -27,11 +28,11 @@
@RunWith(AndroidJUnit4::class)
class SyncSettingsTest {
- private lateinit var device: UiDevice
+ private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@Before
fun setUp() {
- device = startMainActivityFromHomeScreen(Settings.ACTION_SYNC_SETTINGS)
+ device.startMainActivityFromHomeScreen(Settings.ACTION_SYNC_SETTINGS)
}
@Test
diff --git a/tests/uitests/src/com/android/settings/ui/inputmethods/SpellCheckerSettingsTest.kt b/tests/uitests/src/com/android/settings/ui/inputmethods/SpellCheckerSettingsTest.kt
new file mode 100644
index 0000000..d65efb7
--- /dev/null
+++ b/tests/uitests/src/com/android/settings/ui/inputmethods/SpellCheckerSettingsTest.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2023 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.ui.inputmethods
+
+import android.content.Intent
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.UiDevice
+import com.android.settings.ui.testutils.SettingsTestUtils.SETTINGS_PACKAGE
+import com.android.settings.ui.testutils.SettingsTestUtils.assertObject
+import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class SpellCheckerSettingsTest {
+ private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+
+ @Before
+ fun setUp() {
+ device.startMainActivityFromHomeScreen(Intent().apply {
+ setClassName(
+ SETTINGS_PACKAGE,
+ "com.android.settings.Settings\$SpellCheckersSettingsActivity",
+ )
+ })
+ }
+
+ @Test
+ fun hasSwitchBar() {
+ device.assertObject(By.text("Use spell checker"))
+ }
+}
diff --git a/tests/uitests/src/com/android/settings/ui/inputmethods/SpellCheckerSettingsUITest.java b/tests/uitests/src/com/android/settings/ui/inputmethods/SpellCheckerSettingsUITest.java
deleted file mode 100644
index a46a00d..0000000
--- a/tests/uitests/src/com/android/settings/ui/inputmethods/SpellCheckerSettingsUITest.java
+++ /dev/null
@@ -1,60 +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.ui.inputmethods;
-
-import static com.android.settings.ui.testutils.SettingsTestUtils.TIMEOUT;
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.Instrumentation;
-import android.content.Intent;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
-import androidx.test.uiautomator.By;
-import androidx.test.uiautomator.UiDevice;
-import androidx.test.uiautomator.UiObject2;
-import androidx.test.uiautomator.Until;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class SpellCheckerSettingsUITest {
-
- private Instrumentation mInstrumentation;
- private Intent mIntent;
- private UiDevice mUiDevice;
-
- @Before
- public void setUp() {
- mInstrumentation = InstrumentationRegistry.getInstrumentation();
- mUiDevice = UiDevice.getInstance(mInstrumentation);
- mIntent = new Intent().setClassName("com.android.settings",
- "com.android.settings.Settings$SpellCheckersSettingsActivity")
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- }
-
- @Test
- public void launchSettings_hasSwitchBar() {
- mInstrumentation.getContext().startActivity(mIntent);
- final UiObject2 switchBar =
- mUiDevice.wait(Until.findObject(By.text("Use spell checker")), TIMEOUT);
-
- assertThat(switchBar).isNotNull();
- }
-}
diff --git a/tests/uitests/src/com/android/settings/ui/testutils/SettingsTestUtils.kt b/tests/uitests/src/com/android/settings/ui/testutils/SettingsTestUtils.kt
index c749ff8..1dd07cd 100644
--- a/tests/uitests/src/com/android/settings/ui/testutils/SettingsTestUtils.kt
+++ b/tests/uitests/src/com/android/settings/ui/testutils/SettingsTestUtils.kt
@@ -20,14 +20,12 @@
import android.content.Intent
import android.view.KeyEvent
import androidx.test.core.app.ApplicationProvider
-import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.BySelector
import androidx.test.uiautomator.Direction
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.UiObject2
import androidx.test.uiautomator.Until
-import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
object SettingsTestUtils {
@@ -37,40 +35,45 @@
fun UiDevice.waitObject(bySelector: BySelector): UiObject2? =
wait(Until.findObject(bySelector), TIMEOUT)
- fun UiDevice.clickObject(bySelector: BySelector) = checkNotNull(waitObject(bySelector)).click()
+ fun UiDevice.assertObject(bySelector: BySelector): UiObject2 =
+ checkNotNull(waitObject(bySelector)) { "$bySelector not found" }
- fun startMainActivityFromHomeScreen(action: String): UiDevice {
- // Initialize UiDevice instance
- val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
- device.pressKeyCodes(intArrayOf(KeyEvent.KEYCODE_MENU, KeyEvent.KEYCODE_MENU)) // unlock
+ fun UiDevice.clickObject(bySelector: BySelector) = assertObject(bySelector).click()
+
+ fun UiDevice.startMainActivityFromHomeScreen(action: String) {
+ startMainActivityFromHomeScreen(Intent(action))
+ }
+
+ fun UiDevice.startMainActivityFromHomeScreen(intent: Intent) {
+ pressKeyCodes(intArrayOf(KeyEvent.KEYCODE_MENU, KeyEvent.KEYCODE_MENU)) // unlock
// Start from the home screen
- device.pressHome()
+ pressHome()
// Wait for launcher
- val launcherPackage: String = device.launcherPackageName
- assertThat(launcherPackage).isNotNull()
- device.waitObject(By.pkg(launcherPackage).depth(0))
+ waitObject(By.pkg(launcherPackageName).depth(0))
// Launch the app
- val context = ApplicationProvider.getApplicationContext<Context>()
- val intent = Intent(action).apply {
+ ApplicationProvider.getApplicationContext<Context>().startActivity(Intent(intent).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- }
- context.startActivity(intent)
+ })
// Wait for the app to appear
- device.waitObject(By.pkg(SETTINGS_PACKAGE).depth(0))
-
- return device
+ waitObject(By.pkg(SETTINGS_PACKAGE).depth(0))
}
fun UiDevice.assertHasTexts(texts: List<String>) {
- val scrollableObj = findObject(By.scrollable(true))
+ val scrollableObj =
+ findObject(By.res(SETTINGS_PACKAGE, "main_content"))
+ ?: findObject(By.scrollable(true))
for (text in texts) {
- scrollableObj.scrollUntil(Direction.DOWN, Until.findObject(By.text(text)))
- assertWithMessage("Missing text: $text").that(waitObject(By.text(text))).isNotNull()
+ val selector = By.text(text)
+ assertWithMessage("Missing text: $text").that(
+ findObject(selector)
+ ?: scrollableObj.scrollUntil(Direction.DOWN, Until.findObject(selector))
+ ?: waitObject(selector)
+ ).isNotNull()
}
}
}
diff --git a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FakeFingerprintManagerInteractor.kt b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FakeFingerprintManagerInteractor.kt
index 759306e..e2bdd17 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FakeFingerprintManagerInteractor.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FakeFingerprintManagerInteractor.kt
@@ -23,7 +23,7 @@
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.flow.flowOf
/** Fake to be used by other classes to easily fake the FingerprintManager implementation. */
class FakeFingerprintManagerInteractor : FingerprintManagerInteractor {
@@ -53,15 +53,16 @@
override suspend fun generateChallenge(gateKeeperPasswordHandle: Long): Pair<Long, ByteArray> {
return challengeToGenerate
}
- override val enrolledFingerprints: Flow<List<FingerprintViewModel>> = flow {
- emit(enrolledFingerprintsInternal)
- }
+ override val enrolledFingerprints: Flow<List<FingerprintViewModel>> =
+ flowOf(enrolledFingerprintsInternal)
- override fun canEnrollFingerprints(numFingerprints: Int): Flow<Boolean> = flow {
- emit(numFingerprints < enrollableFingerprints)
- }
+ override val canEnrollFingerprints: Flow<Boolean> =
+ flowOf(enrolledFingerprintsInternal.size < enrollableFingerprints)
- override val maxEnrollableFingerprints: Flow<Int> = flow { emit(enrollableFingerprints) }
+ override val sensorPropertiesInternal: Flow<FingerprintSensorPropertiesInternal?> =
+ flowOf(sensorProps.first())
+
+ override val maxEnrollableFingerprints: Flow<Int> = flowOf(enrollableFingerprints)
override suspend fun removeFingerprint(fp: FingerprintViewModel): Boolean {
return enrolledFingerprintsInternal.remove(fp)
@@ -80,7 +81,4 @@
override suspend fun pressToAuthEnabled(): Boolean {
return pressToAuthEnabled
}
-
- override suspend fun sensorPropertiesInternal(): List<FingerprintSensorPropertiesInternal> =
- sensorProps
}
diff --git a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
index cc6f42a..70943f0 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
@@ -18,7 +18,6 @@
import android.content.Context
import android.content.Intent
-import android.content.res.Resources
import android.hardware.fingerprint.Fingerprint
import android.hardware.fingerprint.FingerprintManager
import android.hardware.fingerprint.FingerprintManager.CryptoObject
@@ -51,8 +50,11 @@
import org.mockito.ArgumentMatchers.nullable
import org.mockito.Mock
import org.mockito.Mockito
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoJUnitRunner
+import org.mockito.stubbing.OngoingStubbing
@RunWith(MockitoJUnitRunner::class)
class FingerprintManagerInteractorTest {
@@ -82,8 +84,7 @@
@Test
fun testEmptyFingerprints() =
testScope.runTest {
- Mockito.`when`(fingerprintManager.getEnrolledFingerprints(Mockito.anyInt()))
- .thenReturn(emptyList())
+ whenever(fingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(emptyList())
val emptyFingerprintList: List<Fingerprint> = emptyList()
assertThat(underTest.enrolledFingerprints.last()).isEqualTo(emptyFingerprintList)
@@ -94,8 +95,7 @@
testScope.runTest {
val expected = Fingerprint("Finger 1,", 2, 3L)
val fingerprintList: List<Fingerprint> = listOf(expected)
- Mockito.`when`(fingerprintManager.getEnrolledFingerprints(Mockito.anyInt()))
- .thenReturn(fingerprintList)
+ whenever(fingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(fingerprintList)
val list = underTest.enrolledFingerprints.last()
assertThat(list.size).isEqualTo(fingerprintList.size)
@@ -108,21 +108,22 @@
@Test
fun testCanEnrollFingerprint() =
testScope.runTest {
- val mockContext = Mockito.mock(Context::class.java)
- val resources = Mockito.mock(Resources::class.java)
- Mockito.`when`(mockContext.resources).thenReturn(resources)
- Mockito.`when`(resources.getInteger(anyInt())).thenReturn(3)
- underTest =
- FingerprintManagerInteractorImpl(
- mockContext,
- backgroundDispatcher,
- fingerprintManager,
- gateKeeperPasswordProvider,
- pressToAuthProvider,
+ val fingerprintList1: List<Fingerprint> =
+ listOf(
+ Fingerprint("Finger 1,", 2, 3L),
+ Fingerprint("Finger 2,", 3, 3L),
+ Fingerprint("Finger 3,", 4, 3L)
)
+ val fingerprintList2: List<Fingerprint> =
+ fingerprintList1.plus(
+ listOf(Fingerprint("Finger 4,", 5, 3L), Fingerprint("Finger 5,", 6, 3L))
+ )
+ whenever(fingerprintManager.getEnrolledFingerprints(anyInt()))
+ .thenReturn(fingerprintList1)
+ .thenReturn(fingerprintList2)
- assertThat(underTest.canEnrollFingerprints(2).last()).isTrue()
- assertThat(underTest.canEnrollFingerprints(3).last()).isFalse()
+ assertThat(underTest.canEnrollFingerprints.last()).isTrue()
+ assertThat(underTest.canEnrollFingerprints.last()).isFalse()
}
@Test
@@ -132,7 +133,7 @@
val challenge = 100L
val intent = Intent()
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, challenge)
- Mockito.`when`(
+ whenever(
gateKeeperPasswordProvider.requestGatekeeperHat(
any(Intent::class.java),
anyLong(),
@@ -148,8 +149,7 @@
val job = testScope.launch { result = underTest.generateChallenge(1L) }
runCurrent()
- Mockito.verify(fingerprintManager)
- .generateChallenge(anyInt(), capture(generateChallengeCallback))
+ verify(fingerprintManager).generateChallenge(anyInt(), capture(generateChallengeCallback))
generateChallengeCallback.value.onChallengeGenerated(1, 2, challenge)
runCurrent()
@@ -173,7 +173,7 @@
testScope.launch { result = underTest.removeFingerprint(fingerprintViewModelToRemove) }
runCurrent()
- Mockito.verify(fingerprintManager)
+ verify(fingerprintManager)
.remove(any(Fingerprint::class.java), anyInt(), capture(removalCallback))
removalCallback.value.onRemovalSucceeded(fingerprintToRemove, 1)
@@ -197,7 +197,7 @@
testScope.launch { result = underTest.removeFingerprint(fingerprintViewModelToRemove) }
runCurrent()
- Mockito.verify(fingerprintManager)
+ verify(fingerprintManager)
.remove(any(Fingerprint::class.java), anyInt(), capture(removalCallback))
removalCallback.value.onRemovalError(
fingerprintToRemove,
@@ -218,8 +218,7 @@
underTest.renameFingerprint(fingerprintToRename, "Woo")
- Mockito.verify(fingerprintManager)
- .rename(eq(fingerprintToRename.fingerId), anyInt(), safeEq("Woo"))
+ verify(fingerprintManager).rename(eq(fingerprintToRename.fingerId), anyInt(), safeEq("Woo"))
}
@Test
@@ -235,7 +234,7 @@
runCurrent()
- Mockito.verify(fingerprintManager)
+ verify(fingerprintManager)
.authenticate(
nullable(CryptoObject::class.java),
any(CancellationSignal::class.java),
@@ -263,7 +262,7 @@
runCurrent()
- Mockito.verify(fingerprintManager)
+ verify(fingerprintManager)
.authenticate(
nullable(CryptoObject::class.java),
any(CancellationSignal::class.java),
@@ -284,4 +283,5 @@
private fun <T : Any> safeEq(value: T): T = eq(value) ?: value
private fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture()
private fun <T> any(type: Class<T>): T = Mockito.any<T>(type)
+ private fun <T> whenever(methodCall: T): OngoingStubbing<T> = `when`(methodCall)
}
diff --git a/tests/unit/src/com/android/settings/privatespace/DeletePrivateSpaceControllerTest.java b/tests/unit/src/com/android/settings/privatespace/DeletePrivateSpaceControllerTest.java
new file mode 100644
index 0000000..8fb3eae
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privatespace/DeletePrivateSpaceControllerTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_INTERNAL;
+import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDeletingPrivateSpace.DELETE_PS_ERROR_NONE;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class DeletePrivateSpaceControllerTest {
+ @Mock private PrivateSpaceMaintainer mPrivateSpaceMaintainer;
+ @Mock private Context mContext;
+
+ private Preference mPreference;
+ private DeletePrivateSpaceController mDeletePrivateSpaceController;
+
+ /** Required setup before a test. */
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = ApplicationProvider.getApplicationContext();
+ final String preferenceKey = "private_space_delete";
+
+ mPreference = new Preference(ApplicationProvider.getApplicationContext());
+ mPreference.setKey(preferenceKey);
+
+ mDeletePrivateSpaceController =
+ new DeletePrivateSpaceController(
+ mContext,
+ preferenceKey,
+ new DeletePrivateSpaceController.Injector() {
+ @Override
+ PrivateSpaceMaintainer injectPrivateSpaceMaintainer(Context context) {
+ return mPrivateSpaceMaintainer;
+ }
+ });
+ }
+
+ /** Tests that the controller is always available. */
+ @Test
+ public void getAvailabilityStatus_returnsAvailable() {
+ assertThat(mDeletePrivateSpaceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ /** Tests that on click it attempts to delete the PS. */
+ @Test
+ public void handlePreferenceTreeClick_attemptsToDeletePrivateSpace() {
+ doReturn(DELETE_PS_ERROR_NONE).when(mPrivateSpaceMaintainer).deletePrivateSpace();
+ DeletePrivateSpaceController spy = Mockito.spy(mDeletePrivateSpaceController);
+ doNothing().when(spy).showSuccessfulDeletionToast();
+ spy.handlePreferenceTreeClick(mPreference);
+
+ verify(mPrivateSpaceMaintainer).deletePrivateSpace();
+ }
+
+ /** Tests that on deletion of PS relevant toast is shown. */
+ @Test
+ public void handlePreferenceTreeClick_onDeletion_showsDeletedToast() {
+ doReturn(DELETE_PS_ERROR_NONE).when(mPrivateSpaceMaintainer).deletePrivateSpace();
+ DeletePrivateSpaceController spy = Mockito.spy(mDeletePrivateSpaceController);
+ doNothing().when(spy).showSuccessfulDeletionToast();
+ spy.handlePreferenceTreeClick(mPreference);
+
+ verify(spy).showSuccessfulDeletionToast();
+ }
+
+ /** Tests that on failing to delete the PS relevant toast is shown. */
+ @Test
+ public void handlePreferenceTreeClick_onDeletionError_showsDeletionFailedToast() {
+ doReturn(DELETE_PS_ERROR_INTERNAL).when(mPrivateSpaceMaintainer).deletePrivateSpace();
+ DeletePrivateSpaceController spy = Mockito.spy(mDeletePrivateSpaceController);
+ doNothing().when(spy).showDeletionInternalErrorToast();
+ spy.handlePreferenceTreeClick(mPreference);
+
+ verify(spy).showDeletionInternalErrorToast();
+ }
+}
diff --git a/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceControllerTest.java b/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceControllerTest.java
new file mode 100644
index 0000000..1a1769e
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceControllerTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+@RunWith(AndroidJUnit4.class)
+public class HidePrivateSpaceControllerTest {
+ @Mock private Context mContext;
+ private HidePrivateSpaceController mHidePrivateSpaceController;
+
+ /** Required setup before a test. */
+ @Before
+ public void setUp() {
+ mContext = ApplicationProvider.getApplicationContext();
+ final String preferenceKey = "private_space_hidden";
+
+ mHidePrivateSpaceController = new HidePrivateSpaceController(mContext, preferenceKey);
+ }
+
+ /** Tests that the controller is always available. */
+ @Test
+ public void getAvailabilityStatus_returnsAvailable() {
+ assertThat(mHidePrivateSpaceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+}
diff --git a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceSafetySourceTest.java b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceSafetySourceTest.java
new file mode 100644
index 0000000..2dc00e1
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceSafetySourceTest.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+
+import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_DEVICE_REBOOTED;
+import static com.android.settings.privatespace.PrivateSpaceSafetySource.SAFETY_SOURCE_ID;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.safetycenter.SafetyEvent;
+import android.safetycenter.SafetySourceData;
+import android.safetycenter.SafetySourceStatus;
+import android.util.FeatureFlagUtils;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.safetycenter.SafetyCenterManagerWrapper;
+
+import org.junit.After;
+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;
+
+@RunWith(AndroidJUnit4.class)
+public class PrivateSpaceSafetySourceTest {
+ private static final SafetyEvent EVENT_TYPE_DEVICE_REBOOTED =
+ new SafetyEvent.Builder(SAFETY_EVENT_TYPE_DEVICE_REBOOTED).build();
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ @Mock private SafetyCenterManagerWrapper mSafetyCenterManagerWrapper;
+
+ /** Required setup before a test. */
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ SafetyCenterManagerWrapper.sInstance = mSafetyCenterManagerWrapper;
+
+ FeatureFlagUtils
+ .setEnabled(mContext, FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS, true);
+ }
+
+ /** Required setup after a test. */
+ @After
+ public void tearDown() {
+ SafetyCenterManagerWrapper.sInstance = null;
+ }
+
+ /** Tests that when SC is disabled we don't set any data. */
+ @Test
+ public void onDeviceRebootedEvent_whenSafetyCenterDisabled_doesNotSetData() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(false);
+
+ PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
+
+ verify(mSafetyCenterManagerWrapper, never()).setSafetySourceData(
+ any(), any(), any(), any());
+ }
+
+ /** Tests that when SC is enabled we set data. */
+ @Test
+ public void onDeviceRebootedEvent_whenSafetyCenterEnabled_setsData() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(true);
+
+ PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
+
+ verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+ any(), eq(SAFETY_SOURCE_ID), any(), eq(EVENT_TYPE_DEVICE_REBOOTED));
+ }
+
+ // TODO(b/295516544): Modify this test for the new trunk stable flag instead when available.
+ /** Tests that when the feature is disabled null data is set. */
+ @Test
+ public void setSafetySourceData_whenFeatureDisabled_setsNullData() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(true);
+ FeatureFlagUtils
+ .setEnabled(mContext, FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS, false);
+
+ PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
+
+ ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+ verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+ any(), eq(SAFETY_SOURCE_ID), captor.capture(), eq(EVENT_TYPE_DEVICE_REBOOTED));
+ SafetySourceData safetySourceData = captor.getValue();
+ assertThat(safetySourceData).isNull();
+
+ FeatureFlagUtils
+ .setEnabled(mContext, FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS, true);
+ }
+
+ /** Tests that setSafetySourceData sets the source status enabled. */
+ @Test
+ public void setSafetySourceData_setsEnabled() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(true);
+
+ PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
+
+ ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+ verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+ any(), eq(SAFETY_SOURCE_ID), captor.capture(), eq(EVENT_TYPE_DEVICE_REBOOTED));
+ SafetySourceData safetySourceData = captor.getValue();
+ SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
+ assertThat(safetySourceStatus.isEnabled()).isTrue();
+ }
+
+ /** Tests that setSafetySourceData sets the PS settings page intent. */
+ @Test
+ public void setSafetySourceData_setsPsIntent() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(true);
+
+ PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
+
+ ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+ verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+ any(), eq(SAFETY_SOURCE_ID), captor.capture(), eq(EVENT_TYPE_DEVICE_REBOOTED));
+ SafetySourceData safetySourceData = captor.getValue();
+ SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
+ assertThat(safetySourceStatus.getPendingIntent().getIntent().getIdentifier())
+ .isEqualTo(SAFETY_SOURCE_ID);
+ }
+}
diff --git a/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java b/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java
new file mode 100644
index 0000000..e7ebb37
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2023 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.privatespace;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+@RunWith(AndroidJUnit4.class)
+public class UseOneLockControllerTest {
+ @Mock private Context mContext;
+ private UseOneLockController mUseOneLockController;
+
+ /** Required setup before a test. */
+ @Before
+ public void setUp() {
+ mContext = ApplicationProvider.getApplicationContext();
+ final String preferenceKey = "private_space_use_one_lock";
+
+ mUseOneLockController = new UseOneLockController(mContext, preferenceKey);
+ }
+
+ /** Tests that the controller is always available. */
+ @Test
+ public void getAvailabilityStatus_returnsAvailable() {
+ assertThat(mUseOneLockController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+}
diff --git a/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java b/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
index 3ad1874..caae44a 100644
--- a/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
+++ b/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
@@ -21,9 +21,7 @@
import static android.safetycenter.SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCE_IDS;
import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_DEVICE_REBOOTED;
import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_REFRESH_REQUESTED;
-
import static com.google.common.truth.Truth.assertThat;
-
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@@ -33,11 +31,14 @@
import android.content.Context;
import android.content.Intent;
import android.safetycenter.SafetyEvent;
+import android.safetycenter.SafetySourceData;
+import android.util.FeatureFlagUtils;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.privatespace.PrivateSpaceSafetySource;
import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.After;
@@ -216,6 +217,62 @@
assertThat(captor.getValue()).isEqualTo(BiometricsSafetySource.SAFETY_SOURCE_ID);
}
+ /**
+ * Tests that on receiving the refresh broadcast request with the PS source id, the PS data
+ * is set.
+ */
+ @Test
+ public void onReceive_onRefresh_withPrivateSpaceSourceId_setsPrivateSpaceData() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+ Intent intent =
+ new Intent()
+ .setAction(ACTION_REFRESH_SAFETY_SOURCES)
+ .putExtra(
+ EXTRA_REFRESH_SAFETY_SOURCE_IDS,
+ new String[] {PrivateSpaceSafetySource.SAFETY_SOURCE_ID})
+ .putExtra(EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID, REFRESH_BROADCAST_ID);
+
+ new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
+ ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+ verify(mSafetyCenterManagerWrapper, times(1))
+ .setSafetySourceData(any(), captor.capture(), any(), any());
+
+ assertThat(captor.getValue()).isEqualTo(PrivateSpaceSafetySource.SAFETY_SOURCE_ID);
+ }
+
+ /** Tests that the PS source sets null data when it's disabled. */
+ // TODO(b/295516544): Modify this test for the new trunk stable flag instead when available.
+ @Test
+ public void onReceive_onRefresh_withPrivateSpaceFeatureDisabled_setsNullData() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+ FeatureFlagUtils
+ .setEnabled(
+ mApplicationContext,
+ FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS,
+ false);
+
+ Intent intent =
+ new Intent()
+ .setAction(ACTION_REFRESH_SAFETY_SOURCES)
+ .putExtra(
+ EXTRA_REFRESH_SAFETY_SOURCE_IDS,
+ new String[] {PrivateSpaceSafetySource.SAFETY_SOURCE_ID})
+ .putExtra(EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID, REFRESH_BROADCAST_ID);
+
+ new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
+ ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+ verify(mSafetyCenterManagerWrapper, times(1))
+ .setSafetySourceData(any(), any(), captor.capture(), any());
+
+ assertThat(captor.getValue()).isEqualTo(null);
+
+ FeatureFlagUtils
+ .setEnabled(
+ mApplicationContext,
+ FeatureFlagUtils.SETTINGS_PRIVATE_SPACE_SETTINGS,
+ true);
+ }
+
@Test
public void onReceive_onBootCompleted_setsBootCompleteEvent() {
when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
@@ -223,22 +280,22 @@
new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
ArgumentCaptor<SafetyEvent> captor = ArgumentCaptor.forClass(SafetyEvent.class);
- verify(mSafetyCenterManagerWrapper, times(2))
+ verify(mSafetyCenterManagerWrapper, times(3))
.setSafetySourceData(any(), any(), any(), captor.capture());
SafetyEvent bootEvent = new SafetyEvent.Builder(SAFETY_EVENT_TYPE_DEVICE_REBOOTED).build();
assertThat(captor.getAllValues())
- .containsExactlyElementsIn(Arrays.asList(bootEvent, bootEvent));
+ .containsExactlyElementsIn(Arrays.asList(bootEvent, bootEvent, bootEvent));
}
@Test
- public void onReceive_onBootCompleted_sendsBiometricAndLockscreenData() {
+ public void onReceive_onBootCompleted_sendsAllSafetySourcesData() {
when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
Intent intent = new Intent().setAction(Intent.ACTION_BOOT_COMPLETED);
new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent);
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
- verify(mSafetyCenterManagerWrapper, times(2))
+ verify(mSafetyCenterManagerWrapper, times(3))
.setSafetySourceData(any(), captor.capture(), any(), any());
List<String> safetySourceIdList = captor.getAllValues();
@@ -246,5 +303,7 @@
id -> id.equals(LockScreenSafetySource.SAFETY_SOURCE_ID))).isTrue();
assertThat(safetySourceIdList.stream().anyMatch(
id -> id.equals(BiometricsSafetySource.SAFETY_SOURCE_ID))).isTrue();
+ assertThat(safetySourceIdList.stream().anyMatch(
+ id -> id.equals(PrivateSpaceSafetySource.SAFETY_SOURCE_ID))).isTrue();
}
}