Merge "Fix the flicker of FingerprintSettings before FingerprintEnrollIntro." into tm-qpr-dev
diff --git a/res/layout/search_bar_two_pane_version.xml b/res/layout/search_bar_two_pane_version.xml
index 9ce220c..f98985c 100644
--- a/res/layout/search_bar_two_pane_version.xml
+++ b/res/layout/search_bar_two_pane_version.xml
@@ -38,6 +38,6 @@
android:layout_height="wrap_content"
android:paddingStart="@dimen/search_bar_title_padding_start_regular_two_pane"
android:layout_gravity="start"
- android:text="@string/search_menu"/>
+ android:text="@string/search_settings"/>
</Toolbar>
</com.google.android.material.card.MaterialCardView>
\ No newline at end of file
diff --git a/res/layout/sfps_enroll_finish_base.xml b/res/layout/sfps_enroll_finish_base.xml
index 1773337..f442e90 100644
--- a/res/layout/sfps_enroll_finish_base.xml
+++ b/res/layout/sfps_enroll_finish_base.xml
@@ -30,22 +30,13 @@
android:clipToPadding="false"
android:clipChildren="false">
- <com.android.settings.biometrics.fingerprint.FingerprintRequireScreenOnToAuthToggle
- style="@style/SudSwitchStyle"
- android:id="@+id/require_screen_on_to_auth_toggle"
- android:layout_gravity="start"
- android:paddingLeft="0dp"
- android:paddingStart="0dp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-
<com.google.android.setupdesign.view.FillContentLayout
android:layout_width="@dimen/sfps_enrollment_finished_icon_max_size"
android:layout_height="@dimen/sfps_enrollment_finished_icon_max_size"
android:layout_marginTop="24dp"
android:paddingTop="0dp"
android:paddingBottom="0dp"
- android:gravity="center">
+ android:layout_gravity="center">
<ImageView
android:id="@+id/fingerprint_in_app_indicator"
diff --git a/res/layout/sfps_require_screen_on_to_auth_toggle.xml b/res/layout/sfps_require_screen_on_to_auth_toggle.xml
deleted file mode 100644
index 02bb979..0000000
--- a/res/layout/sfps_require_screen_on_to_auth_toggle.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<!--
- ~ Copyright (C) 2022 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.
- -->
-
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="start"
- style="?attr/fingerprint_layout_theme">
-
- <!-- Title -->
- <com.google.android.setupdesign.view.RichTextView
- android:id="@+id/title"
- android:paddingTop="8dp"
- android:paddingBottom="4dp"
- android:layout_alignParentStart="true"
- android:textAlignment="viewStart"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/security_settings_require_screen_on_to_auth_title"
- android:textColor="?android:attr/textColorPrimary"
- android:textSize="@dimen/sud_description_text_size"
- />
-
- <!-- Subtitle -->
- <TextView
- android:id="@+id/subtitle"
- android:paddingBottom="8dp"
- android:layout_alignParentStart="true"
- android:textAlignment="viewStart"
- android:layout_toStartOf="@+id/toggle"
- android:layout_below="@+id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/security_settings_require_screen_on_to_auth_description"
- android:textColor="?android:attr/textColorSecondary"/>
-
- <!-- Toggle -->
- <Switch
- android:layout_alignParentEnd="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/toggle"
- android:layout_centerVertical="true"
- android:checked="false"
- style="@style/SudSwitchStyle"/>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 96ffb8d..5fafdbf 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1287,14 +1287,12 @@
<string name="security_settings_udfps_enroll_progress_a11y_message">Enrolling fingerprint <xliff:g id="percentage" example="10">%d</xliff:g> percent</string>
<!-- Title shown in fingerprint enrollment dialog once enrollment is completed [CHAR LIMIT=29] -->
<string name="security_settings_fingerprint_enroll_finish_title">Fingerprint added</string>
- <!-- Message shown in SFPS enrollment dialog once enrollment is completed [CHAR LIMIT=NONE] -->
- <string name="security_settings_sfps_enroll_finish">Now you can use your fingerprint to unlock your tablet or verify it\u2019s you, like when you sign in to apps or approve a purchase</string>
<!-- Message shown in fingerprint enrollment dialog once enrollment is completed (tablet) [CHAR LIMIT=NONE] -->
- <string name="security_settings_fingerprint_enroll_finish_v2_message" product="tablet">Now you can use your fingerprint to unlock your tablet or verify it\u2019s you, like when you sign in to apps</string>
+ <string name="security_settings_fingerprint_enroll_finish_v2_message" product="tablet">Now you can use your fingerprint to unlock your tablet or verify it\u2019s you, like when you sign in to apps or approve a purchase</string>
<!-- Message shown in fingerprint enrollment dialog once enrollment is completed (device) [CHAR LIMIT=NONE] -->
- <string name="security_settings_fingerprint_enroll_finish_v2_message" product="device">Now you can use your fingerprint to unlock your device or verify it\u2019s you, like when you sign in to apps</string>
+ <string name="security_settings_fingerprint_enroll_finish_v2_message" product="device">Now you can use your fingerprint to unlock your device or verify it\u2019s you, like when you sign in to apps or approve a purchase</string>
<!-- Message shown in fingerprint enrollment dialog once enrollment is completed (default) [CHAR LIMIT=NONE] -->
- <string name="security_settings_fingerprint_enroll_finish_v2_message" product="default">Now you can use your fingerprint to unlock your phone or verify it\u2019s you, like when you sign in to apps</string>
+ <string name="security_settings_fingerprint_enroll_finish_v2_message" product="default">Now you can use your fingerprint to unlock your phone or verify it\u2019s you, like when you sign in to apps or approve a purchase</string>
<!-- Title for require screen on to auth toggle shown in fingerprint enrollment dialog once enrollment is completed. [CHAR LIMIT=NONE] -->
<string name="security_settings_require_screen_on_to_auth_title">Unlock only when screen is on</string>
<!-- Description for require screen on to auth toggle shown in fingerprint enrollment dialog once enrollment is completed. [CHAR LIMIT=NONE] -->
@@ -6372,8 +6370,8 @@
<string name="advanced_battery_preference_title">Battery usage</string>
<!-- Preference summary for advanced battery usage, for past 24 hours [CHAR LIMIT=40] -->
<string name="advanced_battery_preference_summary_with_hours">View usage for past 24 hours</string>
- <!-- Preference summary for advanced battery usage, from last full charge [CHAR LIMIT=40] -->
- <string name="advanced_battery_preference_summary">View usage from last full charge</string>
+ <!-- Preference summary for advanced battery usage, since last full charge [CHAR LIMIT=40] -->
+ <string name="advanced_battery_preference_summary">View usage since last full charge</string>
<!-- Activity title for battery usage details for an app. or power consumer -->
<string name="battery_details_title">App battery usage</string>
@@ -6748,50 +6746,50 @@
<!-- Title for the battery management group [CHAR LIMIT=40] -->
<string name ="battery_detail_manage_title">Manage battery usage</string>
- <!-- Description for battery total and background usage time for an app, i.e. 1 hr 15 min total • 39 min background from last full charge. Note: ^1 and ^2 should be used in all translations [CHAR LIMIT=120] -->
- <string name="battery_total_and_bg_usage"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total • <xliff:g id="time" example="39 min">^2</xliff:g> background\nfrom last full charge</string>
+ <!-- Description for battery total and background usage time for an app, i.e. 1 hr 15 min total • 39 min background since last full charge. Note: ^1 and ^2 should be used in all translations [CHAR LIMIT=120] -->
+ <string name="battery_total_and_bg_usage"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total • <xliff:g id="time" example="39 min">^2</xliff:g> background\nsince last full charge</string>
<!-- Description for battery total and background usage time for an app, i.e. 1 hr 15 min total • 39 min background for past 24 hr. Note: ^1 and ^2 should be used in all translations [CHAR LIMIT=120] -->
<string name="battery_total_and_bg_usage_24hr"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total • <xliff:g id="time" example="39 min">^2</xliff:g> background\nfor past 24 hr</string>
<!-- Description for battery total and background usage time in a time period for an app, i.e. 1 hr 15 min total • 39 min background for 12 am-2 am. Note: ^1, ^2 and ^3 should be used in all translations [CHAR LIMIT=120] -->
<string name="battery_total_and_bg_usage_with_period"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total • <xliff:g id="time" example="39 min">^2</xliff:g> background\nfor <xliff:g id="time_period" example="12 am-2 am">^3</xliff:g></string>
- <!-- Description for battery total usage time is less than a minute for an app from last full charge [CHAR LIMIT=120] -->
- <string name="battery_total_usage_less_minute">Total less than a minute from last full charge</string>
+ <!-- Description for battery total usage time is less than a minute for an app since last full charge [CHAR LIMIT=120] -->
+ <string name="battery_total_usage_less_minute">Total less than a minute since last full charge</string>
<!-- Description for battery total usage time is less than a minute for an app for past 24 hr [CHAR LIMIT=120] -->
<string name="battery_total_usage_less_minute_24hr">Total less than a minute for past 24 hr</string>
<!-- Description for battery total usage time is less than a minute in a time period for an app, i.e. Total less than a minute for 12 am-2 am. Note: ^1 should be used in all translations[CHAR LIMIT=120] -->
<string name="battery_total_usage_less_minute_with_period">Total less than a minute for <xliff:g id="time_period" example="12 am-2 am">^1</xliff:g></string>
- <!-- Description for battery background usage time is less than a minute for an app from last full charge [CHAR LIMIT=120] -->
- <string name="battery_bg_usage_less_minute">Background less than a minute from last full charge</string>
+ <!-- Description for battery background usage time is less than a minute for an app since last full charge [CHAR LIMIT=120] -->
+ <string name="battery_bg_usage_less_minute">Background less than a minute since last full charge</string>
<!-- Description for battery background usage time is less than a minute for an app for past 24 hr [CHAR LIMIT=120] -->
<string name="battery_bg_usage_less_minute_24hr">Background less than a minute for past 24 hr</string>
<!-- Description for battery background usage time is less than a minute in a time period for an app, i.e. Background less than a minute for 12 am-2 am. Note: ^1 should be used in all translations[CHAR LIMIT=120] -->
<string name="battery_bg_usage_less_minute_with_period">Background less than a minute for <xliff:g id="time_period" example="12 am-2 am">^1</xliff:g></string>
- <!-- Description for battery total usage time for an app, i.e. 1 hr 15 min total from last full charge. Note: ^1 should be used in all translations [CHAR LIMIT=120] -->
- <string name="battery_total_usage"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total from last full charge</string>
+ <!-- Description for battery total usage time for an app, i.e. 1 hr 15 min total since last full charge. Note: ^1 should be used in all translations [CHAR LIMIT=120] -->
+ <string name="battery_total_usage"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total since last full charge</string>
<!-- Description for battery total usage time for an app, i.e. 1 hr 15 min total for past 24 hr. Note: ^1 should be used in all translations [CHAR LIMIT=120] -->
<string name="battery_total_usage_24hr"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total for past 24 hr</string>
<!-- Description for battery total usage time in a time period for an app, i.e. 1 hr 15 min total for 12 am-2 am. Note: ^1 and ^2 should be used in all translations [CHAR LIMIT=120] -->
<string name="battery_total_usage_with_period"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total for <xliff:g id="time_period" example="12 am-2 am">^2</xliff:g></string>
- <!-- Description for battery background usage time for an app, i.e. 1 hr 15 min background from last full charge. Note: ^1 should be used in all translations [CHAR LIMIT=120] -->
- <string name="battery_bg_usage"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> background from last full charge</string>
+ <!-- Description for battery background usage time for an app, i.e. 1 hr 15 min background since last full charge. Note: ^1 should be used in all translations [CHAR LIMIT=120] -->
+ <string name="battery_bg_usage"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> background since last full charge</string>
<!-- Description for battery background usage time for an app, i.e. 1 hr 15 min background for past 24 hr. Note: ^1 should be used in all translations [CHAR LIMIT=120] -->
<string name="battery_bg_usage_24hr"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> background for past 24 hr</string>
<!-- Description for battery background usage time in a time period for an app, i.e. 1 hr 15 min background for 12 am-2 am. Note: ^1 and ^2 should be used in all translations [CHAR LIMIT=120] -->
<string name="battery_bg_usage_with_period"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> background for <xliff:g id="time_period" example="12 am-2 am">^2</xliff:g></string>
- <!-- Description for battery total usage with background usage time less than a minute for an app, i.e. 1 hr 15 min total • background less than a minute from last full charge. Note: ^1 should be used in all translations [CHAR LIMIT=120] -->
- <string name="battery_total_usage_and_bg_less_minute_usage"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total • background less than a minute\nfrom last full charge</string>
+ <!-- Description for battery total usage with background usage time less than a minute for an app, i.e. 1 hr 15 min total • background less than a minute since last full charge. Note: ^1 should be used in all translations [CHAR LIMIT=120] -->
+ <string name="battery_total_usage_and_bg_less_minute_usage"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total • background less than a minute\nsince last full charge</string>
<!-- Description for battery total usage with background usage time less than a minute for an app, i.e. 1 hr 15 min total • background less than a minute for past 24 hr. Note: ^1 should be used in all translations [CHAR LIMIT=120] -->
<string name="battery_total_usage_and_bg_less_minute_usage_24hr"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total • background less than a minute\nfor past 24 hr</string>
<!-- Description for battery total usage with background usage time less than a minute in a time period for an app, i.e. 1 hr 15 min total • background less than a minute for 12 am-2 am. Note: ^1 and ^2 should be used in all translations [CHAR LIMIT=120] -->
<string name="battery_total_usage_and_bg_less_minute_usage_with_period"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total • background less than a minute\nfor <xliff:g id="time_period" example="12 am-2 am">^2</xliff:g></string>
- <!-- Description for no any battery usage from last full charge [CHAR LIMIT=120] -->
- <string name="battery_not_usage">No usage from last full charge</string>
+ <!-- Description for no any battery usage since last full charge [CHAR LIMIT=120] -->
+ <string name="battery_not_usage">No usage since last full charge</string>
<!-- Description for no any battery usage for past 24 hr [CHAR LIMIT=120] -->
<string name="battery_not_usage_24hr">No usage for past 24 hr</string>
<!-- Description for no usage time but have battery usage [CHAR LIMIT=120] -->
diff --git a/res/xml/app_data_usage.xml b/res/xml/app_data_usage.xml
index e94c4ff..aacc1f6 100644
--- a/res/xml/app_data_usage.xml
+++ b/res/xml/app_data_usage.xml
@@ -51,6 +51,7 @@
<PreferenceCategory
android:key="app_data_usage_settings_category"
+ settings:isPreferenceVisible="@bool/config_show_sim_info"
android:layout="@layout/preference_category_no_label">
<Preference
diff --git a/res/xml/network_provider_internet.xml b/res/xml/network_provider_internet.xml
index c9c576e..981afb3 100644
--- a/res/xml/network_provider_internet.xml
+++ b/res/xml/network_provider_internet.xml
@@ -99,6 +99,7 @@
android:title="@string/data_saver_title"
android:icon="@drawable/ic_settings_data_usage"
android:order="10"
+ settings:isPreferenceVisible="@bool/config_show_data_saver"
android:fragment="com.android.settings.datausage.DataSaverSummary"/>
<com.android.settings.vpn2.VpnInfoPreference
diff --git a/res/xml/special_access.xml b/res/xml/special_access.xml
index 5b37f6a..3dd6e18 100644
--- a/res/xml/special_access.xml
+++ b/res/xml/special_access.xml
@@ -97,12 +97,14 @@
android:key="premium_sms"
android:title="@string/premium_sms_access"
android:fragment="com.android.settings.applications.specialaccess.premiumsms.PremiumSmsAccess"
+ settings:isPreferenceVisible="@bool/config_show_premium_sms"
settings:controller="com.android.settings.applications.specialaccess.premiumsms.PremiumSmsController" />
<Preference
android:key="data_saver"
android:title="@string/unrestricted_data_saver"
android:fragment="com.android.settings.datausage.UnrestrictedDataAccess"
+ settings:isPreferenceVisible="@bool/config_show_data_saver"
settings:controller="com.android.settings.applications.specialaccess.DataSaverController" />
<Preference
diff --git a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
index 732163b..747bd78 100644
--- a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
@@ -153,7 +153,7 @@
} else {
Log.i(TAG, "Launch : " + mPackageName + " with package name");
AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent,
- mPackageName);
+ mPackageName, UserHandle.CURRENT);
}
return true;
}
diff --git a/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java b/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java
index e827325..32662a2 100644
--- a/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceController.java
@@ -35,6 +35,7 @@
import com.android.settings.Utils;
import com.android.settings.datausage.AppDataUsage;
import com.android.settings.datausage.DataUsageUtils;
+import com.android.settings.network.SubscriptionUtil;
import com.android.settingslib.AppItem;
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -147,7 +148,8 @@
}
private static NetworkTemplate getTemplate(Context context) {
- if (DataUsageUtils.hasReadyMobileRadio(context)) {
+ if (SubscriptionUtil.isSimHardwareVisible(context)
+ && DataUsageUtils.hasReadyMobileRadio(context)) {
return new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE).setMeteredness(
NetworkStats.METERED_YES).build();
}
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index 6b032fb..d335324 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -659,7 +659,8 @@
break;
case LIST_TYPE_BATTERY_OPTIMIZATION:
AdvancedPowerUsageDetail.startBatteryDetailPage(
- getActivity(), this, mCurrentPkgName);
+ getActivity(), this, mCurrentPkgName,
+ UserHandle.getUserHandleForUid(mCurrentUid));
break;
// TODO: Figure out if there is a way where we can spin up the profile's settings
// process ahead of time, to avoid a long load of data when user clicks on a managed
diff --git a/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java b/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java
index 94fbb76..5d0b63c 100644
--- a/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java
+++ b/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java
@@ -96,15 +96,17 @@
// FLAG_UPDATE_CURRENT ensures it is launched with the most recent values.
final Intent faceIntent = BiometricUtils.getFaceIntroIntent(mActivity,
mActivity.getIntent());
- faceIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, mGkPwHandle);
+ faceIntent.putExtra(Intent.EXTRA_USER_ID, mUserId);
+ faceIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE,
+ mGkPwHandle);
final PendingIntent faceAfterFp = PendingIntent.getActivity(mActivity,
0 /* requestCode */, faceIntent,
PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
intent.putExtra(EXTRA_ENROLL_AFTER_FINGERPRINT, faceAfterFp);
- }
- BiometricUtils.launchEnrollForResult(mActivity, intent, REQUEST_FINGERPRINT_ENROLL,
- hardwareAuthToken, mGkPwHandle, mUserId);
+ BiometricUtils.launchEnrollForResult(mActivity, intent, REQUEST_FINGERPRINT_ENROLL,
+ hardwareAuthToken, mGkPwHandle, mUserId);
+ }
}));
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
index 4506310..b8ec5e6 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
@@ -25,7 +25,6 @@
import android.os.Bundle;
import android.util.Log;
import android.view.View;
-import android.widget.CompoundButton;
import androidx.annotation.VisibleForTesting;
@@ -45,7 +44,6 @@
public class FingerprintEnrollFinish extends BiometricEnrollBase {
private static final String TAG = "FingerprintEnrollFinish";
- private static final String KEY_REQUIRE_SCREEN_ON_TO_AUTH = "require_screen_on_to_auth_toggle";
private static final String ACTION_FINGERPRINT_SETTINGS =
"android.settings.FINGERPRINT_SETTINGS";
@VisibleForTesting
@@ -54,15 +52,10 @@
private FingerprintManager mFingerprintManager;
- private FingerprintSettingsRequireScreenOnToAuthPreferenceController
- mRequireScreenOnToAuthPreferenceController;
- private FingerprintRequireScreenOnToAuthToggle mRequireScreenOnToAuthToggle;
private boolean mCanAssumeSfps;
private boolean mIsAddAnotherOrFinish;
- private CompoundButton.OnCheckedChangeListener mRequireScreenOnToAuthToggleListener;
-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -72,20 +65,11 @@
mCanAssumeSfps = props != null && props.size() == 1 && props.get(0).isAnySidefpsType();
if (mCanAssumeSfps) {
setContentView(R.layout.sfps_enroll_finish);
- mRequireScreenOnToAuthPreferenceController =
- new FingerprintSettingsRequireScreenOnToAuthPreferenceController(
- getApplicationContext(),
- KEY_REQUIRE_SCREEN_ON_TO_AUTH
- );
} else {
setContentView(R.layout.fingerprint_enroll_finish);
}
setHeaderText(R.string.security_settings_fingerprint_enroll_finish_title);
- if (mCanAssumeSfps) {
- setDescriptionText(R.string.security_settings_sfps_enroll_finish);
- } else {
- setDescriptionText(R.string.security_settings_fingerprint_enroll_finish_v2_message);
- }
+ setDescriptionText(R.string.security_settings_fingerprint_enroll_finish_v2_message);
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
mFooterBarMixin.setSecondaryButton(
@@ -104,20 +88,6 @@
.setTheme(R.style.SudGlifButton_Primary)
.build()
);
-
- if (mCanAssumeSfps) {
- mRequireScreenOnToAuthToggleListener =
- (buttonView, isChecked) -> {
- mRequireScreenOnToAuthPreferenceController.setChecked(isChecked);
- };
- mRequireScreenOnToAuthToggle = findViewById(R.id.require_screen_on_to_auth_toggle);
- mRequireScreenOnToAuthToggle.setChecked(
- mRequireScreenOnToAuthPreferenceController.isChecked());
- mRequireScreenOnToAuthToggle.setListener(mRequireScreenOnToAuthToggleListener);
- mRequireScreenOnToAuthToggle.setOnClickListener(v -> {
- mRequireScreenOnToAuthToggle.getSwitch().toggle();
- });
- }
}
@Override
@@ -131,13 +101,6 @@
@Override
protected void onResume() {
super.onResume();
- if (mCanAssumeSfps) {
- mRequireScreenOnToAuthToggleListener.onCheckedChanged(
- mRequireScreenOnToAuthToggle.getSwitch(),
- mRequireScreenOnToAuthToggle.isChecked()
- );
- }
-
FooterButton addButton = mFooterBarMixin.getSecondaryButton();
final FingerprintManager fpm = Utils.getFingerprintManagerOrNull(this);
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintRequireScreenOnToAuthToggle.java b/src/com/android/settings/biometrics/fingerprint/FingerprintRequireScreenOnToAuthToggle.java
deleted file mode 100644
index f88c9aa..0000000
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintRequireScreenOnToAuthToggle.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2022 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.fingerprint;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.widget.CompoundButton;
-import android.widget.LinearLayout;
-import android.widget.Switch;
-
-import com.android.settings.R;
-
-/**
- * A layout that contains a start-justified title, and an end-justified switch.
- */
-public class FingerprintRequireScreenOnToAuthToggle extends LinearLayout {
- private Switch mSwitch;
-
- public FingerprintRequireScreenOnToAuthToggle(Context context) {
- this(context, null /* attrs */);
- }
-
- public FingerprintRequireScreenOnToAuthToggle(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public FingerprintRequireScreenOnToAuthToggle(
- Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
-
- LayoutInflater.from(context).inflate(R.layout.sfps_require_screen_on_to_auth_toggle,
- this, true /* attachToRoot */);
-
- mSwitch = findViewById(R.id.toggle);
- mSwitch.setClickable(true);
- mSwitch.setFocusable(false);
- }
-
- public boolean isChecked() {
- return mSwitch.isChecked();
- }
-
- /**
- *
- * @param checked
- */
- public void setChecked(boolean checked) {
- mSwitch.setChecked(checked);
- }
-
- /**
- *
- * @param listener
- */
- public void setListener(CompoundButton.OnCheckedChangeListener listener) {
- mSwitch.setOnCheckedChangeListener(listener);
- }
-
- public Switch getSwitch() {
- return mSwitch;
- }
-}
diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java
index d57a2a1..e15cead 100644
--- a/src/com/android/settings/datausage/AppDataUsage.java
+++ b/src/com/android/settings/datausage/AppDataUsage.java
@@ -45,6 +45,7 @@
import com.android.settings.R;
import com.android.settings.applications.AppInfoBase;
+import com.android.settings.network.SubscriptionUtil;
import com.android.settings.widget.EntityHeaderController;
import com.android.settingslib.AppItem;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
@@ -109,6 +110,10 @@
private long mSelectedCycle;
private boolean mIsLoading;
+ public boolean isSimHardwareVisible(Context context) {
+ return SubscriptionUtil.isSimHardwareVisible(context);
+ }
+
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -161,7 +166,7 @@
final UidDetailProvider uidDetailProvider = getUidDetailProvider();
if (mAppItem.key > 0) {
- if (!UserHandle.isApp(mAppItem.key)) {
+ if ((!isSimHardwareVisible(mContext)) || !UserHandle.isApp(mAppItem.key)) {
final UidDetail uidDetail = uidDetailProvider.getUidDetail(mAppItem.key, true);
mIcon = uidDetail.icon;
mLabel = uidDetail.label;
@@ -328,6 +333,9 @@
}
private void updatePrefs(boolean restrictBackground, boolean unrestrictData) {
+ if (!isSimHardwareVisible(mContext)) {
+ return;
+ }
setBackPreferenceListAnimatorIfLoaded();
final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfMeteredDataRestricted(
mContext, mPackageName, UserHandle.getUserId(mAppItem.key));
diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java
index 57931c1..baf8e7e 100644
--- a/src/com/android/settings/datausage/BillingCycleSettings.java
+++ b/src/com/android/settings/datausage/BillingCycleSettings.java
@@ -42,6 +42,7 @@
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.network.SubscriptionUtil;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.NetworkPolicyEditor;
import com.android.settingslib.net.DataUsageController;
@@ -102,6 +103,10 @@
super.onCreate(icicle);
final Context context = getContext();
+ if (!SubscriptionUtil.isSimHardwareVisible(context)) {
+ finish();
+ return;
+ }
mDataUsageController = new DataUsageController(context);
Bundle args = getArguments();
@@ -498,7 +503,8 @@
@Override
protected boolean isPageSearchEnabled(Context context) {
- return DataUsageUtils.hasMobileData(context);
+ return SubscriptionUtil.isSimHardwareVisible(context)
+ && DataUsageUtils.hasMobileData(context);
}
};
diff --git a/src/com/android/settings/datausage/DataSaverSummary.java b/src/com/android/settings/datausage/DataSaverSummary.java
index 744f692..4712e6f 100644
--- a/src/com/android/settings/datausage/DataSaverSummary.java
+++ b/src/com/android/settings/datausage/DataSaverSummary.java
@@ -59,6 +59,11 @@
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
+ if (!isDataSaverVisible(getContext())) {
+ finishFragment();
+ return;
+ }
+
addPreferencesFromResource(R.xml.data_saver);
mUnrestrictedAccess = findPreference(KEY_UNRESTRICTED_ACCESS);
mApplicationsState = ApplicationsState.getInstance(
@@ -192,12 +197,18 @@
}
+ public static boolean isDataSaverVisible(Context context) {
+ return context.getResources()
+ .getBoolean(R.bool.config_show_data_saver);
+ }
+
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.data_saver) {
@Override
protected boolean isPageSearchEnabled(Context context) {
- return DataUsageUtils.hasMobileData(context)
+ return isDataSaverVisible(context)
+ && DataUsageUtils.hasMobileData(context)
&& DataUsageUtils.getDefaultSubscriptionId(context)
!= SubscriptionManager.INVALID_SUBSCRIPTION_ID;
}
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index abcc45f..fabf059 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -75,11 +75,19 @@
return R.string.help_url_data_usage;
}
+ public boolean isSimHardwareVisible(Context context) {
+ return SubscriptionUtil.isSimHardwareVisible(context);
+ }
+
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Context context = getContext();
+ if (!isSimHardwareVisible(context)) {
+ finish();
+ return;
+ }
enableProxySubscriptionManager(context);
boolean hasMobileData = DataUsageUtils.hasMobileData(context);
@@ -137,6 +145,9 @@
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final Activity activity = getActivity();
final ArrayList<AbstractPreferenceController> controllers = new ArrayList<>();
+ if (!isSimHardwareVisible(context)) {
+ return controllers;
+ }
mSummaryController =
new DataUsageSummaryPreferenceController(activity, getSettingsLifecycle(), this,
DataUsageUtils.getDefaultSubscriptionId(activity));
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index f6ed2a1..3705dfc 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -227,7 +227,8 @@
* Start packageName's battery detail page.
*/
public static void startBatteryDetailPage(
- Activity caller, Instrumentable instrumentable, String packageName) {
+ Activity caller, Instrumentable instrumentable, String packageName,
+ UserHandle userHandle) {
final Bundle args = new Bundle(3);
final PackageManager packageManager = caller.getPackageManager();
args.putString(EXTRA_PACKAGE_NAME, packageName);
@@ -243,6 +244,7 @@
.setTitleRes(R.string.battery_details_title)
.setArguments(args)
.setSourceMetricsCategory(instrumentable.getMetricsCategory())
+ .setUserHandle(userHandle)
.launch();
}
@@ -531,7 +533,6 @@
private CharSequence getAppActiveTime(Bundle bundle) {
final long foregroundTimeMs = bundle.getLong(EXTRA_FOREGROUND_TIME);
final long backgroundTimeMs = bundle.getLong(EXTRA_BACKGROUND_TIME);
- final int consumedPower = bundle.getInt(EXTRA_POWER_USAGE_AMOUNT);
final int uid = bundle.getInt(EXTRA_UID, 0);
final String slotTime = bundle.getString(EXTRA_SLOT_TIME, null);
final long totalTimeMs = foregroundTimeMs + backgroundTimeMs;
@@ -543,9 +544,7 @@
return null;
}
if (totalTimeMs == 0) {
- usageTimeSummary = getText(
- isChartGraphEnabled && consumedPower > 0 ? R.string.battery_usage_without_time
- : R.string.battery_not_usage);
+ usageTimeSummary = getText(R.string.battery_usage_without_time);
} else if (slotTime == null) {
// Shows summary text with last full charge if slot time is null.
usageTimeSummary = getAppFullChargeActiveSummary(
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
index b9c3a6f..86533ba 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
@@ -67,6 +67,7 @@
private static final int MAX_DIFF_SECONDS_OF_UPPER_TIMESTAMP = 5;
// Maximum total time value for each hourly slot cumulative data at most 2 hours.
private static final float TOTAL_HOURLY_TIME_THRESHOLD = DateUtils.HOUR_IN_MILLIS * 2;
+ private static final long MIN_TIME_SLOT = DateUtils.HOUR_IN_MILLIS * 2;
private static final Map<String, BatteryHistEntry> EMPTY_BATTERY_MAP = new HashMap<>();
private static final BatteryHistEntry EMPTY_BATTERY_HIST_ENTRY =
new BatteryHistEntry(new ContentValues());
@@ -270,13 +271,31 @@
}
final long startTime = timestampList.get(0);
final long endTime = timestampList.get(timestampList.size() - 1);
+ // If the timestamp diff is smaller than MIN_TIME_SLOT, returns the empty list directly.
+ if (endTime - startTime < MIN_TIME_SLOT) {
+ return dailyTimestampList;
+ }
long nextDay = getTimestampOfNextDay(startTime);
- dailyTimestampList.add(startTime);
+ // Only if the timestamp diff in the first day is bigger than MIN_TIME_SLOT, start from the
+ // first day. Otherwise, start from the second day.
+ if (nextDay - startTime >= MIN_TIME_SLOT) {
+ dailyTimestampList.add(startTime);
+ }
while (nextDay < endTime) {
dailyTimestampList.add(nextDay);
nextDay += DateUtils.DAY_IN_MILLIS;
}
- dailyTimestampList.add(endTime);
+ final long lastDailyTimestamp = dailyTimestampList.get(dailyTimestampList.size() - 1);
+ // Only if the timestamp diff in the last day is bigger than MIN_TIME_SLOT, add the
+ // last day.
+ if (endTime - lastDailyTimestamp >= MIN_TIME_SLOT) {
+ dailyTimestampList.add(endTime);
+ }
+ // The dailyTimestampList must have the start and end timestamp, otherwise, return an empty
+ // list.
+ if (dailyTimestampList.size() < MIN_TIMESTAMP_DATA_SIZE) {
+ return new ArrayList<>();
+ }
return dailyTimestampList;
}
@@ -721,7 +740,7 @@
final List<Long> hourlyTimestampsPerDay = new ArrayList<>();
while (currentTimestamp <= dailyEndTimestamp) {
hourlyTimestampsPerDay.add(currentTimestamp);
- currentTimestamp += 2 * DateUtils.HOUR_IN_MILLIS;
+ currentTimestamp += MIN_TIME_SLOT;
}
hourlyTimestamps.add(hourlyTimestampsPerDay);
}
diff --git a/src/com/android/settings/notification/history/NotificationHistoryActivity.java b/src/com/android/settings/notification/history/NotificationHistoryActivity.java
index 4fecfc9..1f83cc7 100644
--- a/src/com/android/settings/notification/history/NotificationHistoryActivity.java
+++ b/src/com/android/settings/notification/history/NotificationHistoryActivity.java
@@ -73,6 +73,10 @@
public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity {
private static String TAG = "NotifHistory";
+ // MAX_RECENT_DISMISS_ITEM_COUNT needs to be less or equals than
+ // R.integer.config_notificationServiceArchiveSize, which is the Number of notifications kept
+ // in the notification service historical archive
+ private static final int MAX_RECENT_DISMISS_ITEM_COUNT = 50;
private ViewGroup mHistoryOn;
private ViewGroup mHistoryOff;
@@ -388,7 +392,8 @@
snoozed = getSnoozedNotifications();
dismissed = mNm.getHistoricalNotificationsWithAttribution(
NotificationHistoryActivity.this.getPackageName(),
- NotificationHistoryActivity.this.getAttributionTag(), 6, false);
+ NotificationHistoryActivity.this.getAttributionTag(),
+ MAX_RECENT_DISMISS_ITEM_COUNT, false);
} catch (SecurityException | RemoteException e) {
Log.d(TAG, "OnPaused called while trying to retrieve notifications");
}
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/DataSaverControllerTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/DataSaverControllerTest.java
index 39d51fa..ed04910 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/DataSaverControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/DataSaverControllerTest.java
@@ -18,9 +18,13 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
import static org.mockito.Mockito.spy;
import android.content.Context;
+import android.content.res.Resources;
+
+import com.android.settings.R;
import org.junit.Before;
import org.junit.Test;
@@ -34,23 +38,35 @@
public class DataSaverControllerTest {
private Context mContext;
+ private Resources mResources;
private DataSaverController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application.getApplicationContext());
+
+ mResources = spy(mContext.getResources());
+ when(mContext.getResources()).thenReturn(mResources);
+
mController = new DataSaverController(mContext, "key");
}
@Test
public void testDataSaver_byDefault_shouldBeShown() {
+ when(mResources.getBoolean(R.bool.config_show_data_saver)).thenReturn(true);
assertThat(mController.isAvailable()).isTrue();
}
@Test
@Config(qualifiers = "mcc999")
+ public void testDataSaver_ifDisabledByCarrier_shouldNotBeShown() {
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
public void testDataSaver_ifDisabled_shouldNotBeShown() {
+ when(mResources.getBoolean(R.bool.config_show_data_saver)).thenReturn(false);
assertThat(mController.isAvailable()).isFalse();
}
}
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 4c4acc7..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
@@ -21,8 +21,12 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
import android.content.Context;
+import android.content.res.Resources;
+
+import com.android.settings.R;
import org.junit.Before;
import org.junit.Test;
@@ -36,23 +40,35 @@
public class PremiumSmsControllerTest {
private Context mContext;
+ private Resources mResources;
private PremiumSmsController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application.getApplicationContext());
+
+ mResources = spy(mContext.getResources());
+ when(mContext.getResources()).thenReturn(mResources);
+
mController = new PremiumSmsController(mContext, "key");
}
@Test
public void getAvailability_byDefault_shouldBeShown() {
+ when(mResources.getBoolean(R.bool.config_show_premium_sms)).thenReturn(true);
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@Test
@Config(qualifiers = "mcc999")
+ public void getAvailability_disabledByCarrier_returnUnavailable() {
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
public void getAvailability_disabled_returnUnavailable() {
+ when(mResources.getBoolean(R.bool.config_show_premium_sms)).thenReturn(false);
assertThat(mController.isAvailable()).isFalse();
}
}
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 53d46ca..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
@@ -21,8 +21,12 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
import android.content.Context;
+import android.content.res.Resources;
+
+import com.android.settings.R;
import org.junit.Before;
import org.junit.Test;
@@ -36,23 +40,35 @@
public class PremiumSmsScreenPreferenceControllerTest {
private Context mContext;
+ private Resources mResources;
private PremiumSmsScreenPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application.getApplicationContext());
+
+ mResources = spy(mContext.getResources());
+ when(mContext.getResources()).thenReturn(mResources);
+
mController = new PremiumSmsScreenPreferenceController(mContext, "key");
}
@Test
public void getAvailability_byDefault_shouldBeShown() {
+ when(mResources.getBoolean(R.bool.config_show_premium_sms)).thenReturn(true);
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@Test
@Config(qualifiers = "mcc999")
+ public void getAvailability_disabledByCarrier_returnUnavailable() {
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
public void getAvailability_disabled_returnUnavailable() {
+ when(mResources.getBoolean(R.bool.config_show_premium_sms)).thenReturn(false);
assertThat(mController.isAvailable()).isFalse();
}
}
diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
index 483d746..bccec3e 100644
--- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
@@ -110,7 +110,10 @@
@Test
@Config(shadows = ShadowFragment.class)
public void onCreate_appUid_shouldGetAppLabelFromAppInfo() throws NameNotFoundException {
- mFragment = spy(new AppDataUsage());
+ mFragment = spy(new AppDataUsage() {
+ @Override
+ public boolean isSimHardwareVisible(Context context) { return true; }
+ });
final FragmentActivity activity = spy(Robolectric.setupActivity(FragmentActivity.class));
doReturn(mPackageManager).when(activity).getPackageManager();
doReturn(activity).when(mFragment).getActivity();
@@ -140,7 +143,10 @@
@Test
@Config(shadows = ShadowFragment.class)
public void onCreate_notAppUid_shouldGetAppLabelFromUidDetailProvider() {
- mFragment = spy(new AppDataUsage());
+ mFragment = spy(new AppDataUsage() {
+ @Override
+ public boolean isSimHardwareVisible(Context context) { return true; }
+ });
ReflectionHelpers.setField(mFragment, "mDashboardFeatureProvider",
FakeFeatureFactory.setupForTest().dashboardFeatureProvider);
doReturn(Robolectric.setupActivity(FragmentActivity.class)).when(mFragment).getActivity();
@@ -167,7 +173,10 @@
@Test
public void bindAppHeader_allWorkApps_shouldNotShowAppInfoLink() {
- mFragment = spy(new AppDataUsage());
+ mFragment = spy(new AppDataUsage() {
+ @Override
+ public boolean isSimHardwareVisible(Context context) { return true; }
+ });
when(mFragment.getPreferenceManager())
.thenReturn(mock(PreferenceManager.class, RETURNS_DEEP_STUBS));
@@ -184,7 +193,10 @@
throws PackageManager.NameNotFoundException {
final int fakeUserId = 100;
- mFragment = spy(new AppDataUsage());
+ mFragment = spy(new AppDataUsage() {
+ @Override
+ public boolean isSimHardwareVisible(Context context) { return true; }
+ });
final ArraySet<String> packages = new ArraySet<>();
packages.add("pkg");
final AppItem appItem = new AppItem(123456789);
@@ -210,7 +222,10 @@
@Test
public void changePreference_backgroundData_shouldUpdateUI() {
- mFragment = spy(new AppDataUsage());
+ mFragment = spy(new AppDataUsage() {
+ @Override
+ public boolean isSimHardwareVisible(Context context) { return true; }
+ });
final AppItem appItem = new AppItem(123456789);
final RestrictedSwitchPreference pref = mock(RestrictedSwitchPreference.class);
final DataSaverBackend dataSaverBackend = mock(DataSaverBackend.class);
@@ -227,7 +242,10 @@
@Test
public void updatePrefs_restrictedByAdmin_shouldDisablePreference() {
- mFragment = spy(new AppDataUsage());
+ mFragment = spy(new AppDataUsage() {
+ @Override
+ public boolean isSimHardwareVisible(Context context) { return true; }
+ });
final int testUid = 123123;
final AppItem appItem = new AppItem(testUid);
final RestrictedSwitchPreference restrictBackgroundPref
@@ -255,7 +273,10 @@
@Test
public void bindData_noAppUsageData_shouldHideCycleSpinner() {
- mFragment = spy(new AppDataUsage());
+ mFragment = spy(new AppDataUsage() {
+ @Override
+ public boolean isSimHardwareVisible(Context context) { return true; }
+ });
final SpinnerPreference cycle = mock(SpinnerPreference.class);
ReflectionHelpers.setField(mFragment, "mCycle", cycle);
final Preference preference = mock(Preference.class);
@@ -271,7 +292,10 @@
@Test
public void bindData_hasAppUsageData_shouldShowCycleSpinnerAndUpdateUsageSummary() {
- mFragment = spy(new AppDataUsage());
+ mFragment = spy(new AppDataUsage() {
+ @Override
+ public boolean isSimHardwareVisible(Context context) { return true; }
+ });
final Context context = RuntimeEnvironment.application;
ReflectionHelpers.setField(mFragment, "mContext", context);
final long backgroundBytes = 1234L;
@@ -300,7 +324,10 @@
@Test
public void onCreateLoader_categoryApp_shouldQueryDataUsageUsingAppKey() {
- mFragment = new AppDataUsage();
+ mFragment = new AppDataUsage() {
+ @Override
+ public boolean isSimHardwareVisible(Context context) { return true; }
+ };
final Context context = RuntimeEnvironment.application;
final int testUid = 123123;
final AppItem appItem = new AppItem(testUid);
@@ -323,7 +350,10 @@
@Test
public void onCreateLoader_categoryUser_shouldQueryDataUsageUsingAssociatedUids() {
- mFragment = new AppDataUsage();
+ mFragment = new AppDataUsage() {
+ @Override
+ public boolean isSimHardwareVisible(Context context) { return true; }
+ };
final Context context = RuntimeEnvironment.application;
final int testUserId = 11;
final AppItem appItem = new AppItem(testUserId);
@@ -360,7 +390,10 @@
appItem.category = AppItem.CATEGORY_APP;
appItem.addUid(uid);
- mFragment = new AppDataUsage();
+ mFragment = new AppDataUsage() {
+ @Override
+ public boolean isSimHardwareVisible(Context context) { return true; }
+ };
ReflectionHelpers.setField(mFragment, "mContext", RuntimeEnvironment.application);
ReflectionHelpers.setField(mFragment, "mCycles", testCycles);
ReflectionHelpers.setField(mFragment, "mAppItem", appItem);
@@ -393,7 +426,10 @@
builder.setStartTime(tenDaysAgo).setEndTime(now).setTotalUsage(1234L);
data.add(builder.build());
- mFragment = new AppDataUsage();
+ mFragment = new AppDataUsage() {
+ @Override
+ public boolean isSimHardwareVisible(Context context) { return true; }
+ };
ReflectionHelpers.setField(mFragment, "mContext", RuntimeEnvironment.application);
ReflectionHelpers.setField(mFragment, "mCycleAdapter", mock(CycleAdapter.class));
ReflectionHelpers.setField(mFragment, "mSelectedCycle", tenDaysAgo);
@@ -420,7 +456,10 @@
ShadowDataUsageUtils.HAS_SIM = false;
ShadowSubscriptionManager.setDefaultDataSubscriptionId(
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
- mFragment = spy(new AppDataUsage());
+ mFragment = spy(new AppDataUsage() {
+ @Override
+ public boolean isSimHardwareVisible(Context context) { return true; }
+ });
doReturn(Robolectric.setupActivity(FragmentActivity.class)).when(mFragment).getActivity();
doReturn(RuntimeEnvironment.application).when(mFragment).getContext();
final UidDetailProvider uidDetailProvider = mock(UidDetailProvider.class);
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
index 6d10814..68d49fc 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
@@ -29,12 +29,15 @@
import android.app.usage.NetworkStatsManager;
import android.content.Context;
+import android.content.res.Resources;
import android.net.NetworkPolicyManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import androidx.fragment.app.FragmentActivity;
+import com.android.settings.R;
+
import com.android.settings.testutils.shadow.ShadowDashboardFragment;
import com.android.settings.testutils.shadow.ShadowDataUsageUtils;
import com.android.settings.testutils.shadow.ShadowUserManager;
@@ -70,6 +73,7 @@
private NetworkStatsManager mNetworkStatsManager;
private TelephonyManager mTelephonyManager;
private Context mContext;
+ private Resources mResources;
private FragmentActivity mActivity;
/**
@@ -84,13 +88,18 @@
ShadowUserManager.getShadow().setIsAdminUser(true);
shadowContext.setSystemService(Context.NETWORK_POLICY_SERVICE, mNetworkPolicyManager);
- mContext = RuntimeEnvironment.application;
+ mContext = spy(RuntimeEnvironment.application);
mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
final ShadowTelephonyManager shadowTelephonyManager = Shadows.shadowOf(mTelephonyManager);
shadowTelephonyManager.setTelephonyManagerForSubscriptionId(
SubscriptionManager.INVALID_SUBSCRIPTION_ID, mTelephonyManager);
shadowTelephonyManager.setTelephonyManagerForSubscriptionId(1, mTelephonyManager);
mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).get());
+
+ mResources = spy(mContext.getResources());
+ doReturn(mResources).when(mContext).getResources();
+ doReturn(true).when(mResources).getBoolean(R.bool.config_show_sim_info);
+
doReturn(mNetworkStatsManager).when(mActivity).getSystemService(NetworkStatsManager.class);
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 7c56ab3..90e8caf 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -434,8 +434,7 @@
ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
verify(mEntityHeaderController).setSummary(captor.capture());
- assertThat(captor.getValue().toString())
- .isEqualTo("No usage from last full charge");
+ assertThat(captor.getValue().toString()).isEmpty();
}
@Test
@@ -467,7 +466,7 @@
ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
verify(mEntityHeaderController).setSummary(captor.capture());
assertThat(captor.getValue().toString())
- .isEqualTo("2 min background from last full charge");
+ .isEqualTo("2 min background since last full charge");
}
@Test
@@ -485,7 +484,7 @@
ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
verify(mEntityHeaderController).setSummary(captor.capture());
assertThat(captor.getValue().toString())
- .isEqualTo("Background less than a minute from last full charge");
+ .isEqualTo("Background less than a minute since last full charge");
}
@Test
@@ -504,7 +503,7 @@
ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
verify(mEntityHeaderController).setSummary(captor.capture());
assertThat(captor.getValue().toString())
- .isEqualTo("Total less than a minute from last full charge");
+ .isEqualTo("Total less than a minute since last full charge");
}
@Test
@@ -520,8 +519,8 @@
ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
verify(mEntityHeaderController).setSummary(captor.capture());
- assertThat(captor.getValue().toString())
- .isEqualTo("1 min total • background less than a minute\nfrom last full charge");
+ assertThat(captor.getValue().toString()).isEqualTo(
+ "1 min total • background less than a minute\nsince last full charge");
}
@Test
@@ -538,7 +537,7 @@
ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
verify(mEntityHeaderController).setSummary(captor.capture());
assertThat(captor.getValue().toString())
- .isEqualTo("1 min total from last full charge");
+ .isEqualTo("1 min total since last full charge");
}
@Test
@@ -555,7 +554,7 @@
ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
verify(mEntityHeaderController).setSummary(captor.capture());
assertThat(captor.getValue().toString())
- .isEqualTo("6 min total • 4 min background\nfrom last full charge");
+ .isEqualTo("6 min total • 4 min background\nsince last full charge");
}
@Test
@@ -742,7 +741,8 @@
public void startBatteryDetailPage_noBatteryUsage_hasBasicData() {
final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
- AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment, PACKAGE_NAME[0]);
+ AdvancedPowerUsageDetail.startBatteryDetailPage(
+ mActivity, mFragment, PACKAGE_NAME[0], UserHandle.OWNER);
verify(mActivity).startActivity(captor.capture());
@@ -760,7 +760,8 @@
PackageManager.NameNotFoundException {
doReturn(UID).when(mPackageManager).getPackageUid(PACKAGE_NAME[0], 0 /* no flag */);
- AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment, PACKAGE_NAME[0]);
+ AdvancedPowerUsageDetail.startBatteryDetailPage(
+ mActivity, mFragment, PACKAGE_NAME[0], UserHandle.OWNER);
assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
index df9d865..7ac8fde 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
@@ -329,6 +329,18 @@
public void getDailyTimestamps_notEnoughData_returnEmptyList() {
assertThat(DataProcessor.getDailyTimestamps(new ArrayList<>())).isEmpty();
assertThat(DataProcessor.getDailyTimestamps(List.of(100L))).isEmpty();
+ assertThat(DataProcessor.getDailyTimestamps(List.of(100L, 5400000L))).isEmpty();
+ }
+
+ @Test
+ public void getDailyTimestamps_OneHourDataPerDay_returnEmptyList() {
+ // Timezone GMT+8
+ final List<Long> timestamps = List.of(
+ 1641049200000L, // 2022-01-01 23:00:00
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641056400000L // 2022-01-02 01:00:00
+ );
+ assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEmpty();
}
@Test
@@ -353,14 +365,33 @@
public void getDailyTimestamps_MultipleDaysData_returnExpectedList() {
// Timezone GMT+8
final List<Long> timestamps = List.of(
- 1640988000000L, // 2022-01-01 06:00:00
+ 1641045600000L, // 2022-01-01 22:00:00
+ 1641060000000L, // 2022-01-02 02:00:00
+ 1641160800000L, // 2022-01-03 06:00:00
+ 1641232800000L // 2022-01-04 02:00:00
+ );
+
+ final List<Long> expectedTimestamps = List.of(
+ 1641045600000L, // 2022-01-01 22:00:00
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641139200000L, // 2022-01-03 00:00:00
+ 1641225600000L, // 2022-01-04 00:00:00
+ 1641232800000L // 2022-01-04 02:00:00
+ );
+ assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
+ }
+
+ @Test
+ public void getDailyTimestamps_FirstDayOneHourData_returnExpectedList() {
+ // Timezone GMT+8
+ final List<Long> timestamps = List.of(
+ 1641049200000L, // 2022-01-01 23:00:00
1641060000000L, // 2022-01-02 02:00:00
1641160800000L, // 2022-01-03 06:00:00
1641254400000L // 2022-01-04 08:00:00
);
final List<Long> expectedTimestamps = List.of(
- 1640988000000L, // 2022-01-01 06:00:00
1641052800000L, // 2022-01-02 00:00:00
1641139200000L, // 2022-01-03 00:00:00
1641225600000L, // 2022-01-04 00:00:00
@@ -370,6 +401,44 @@
}
@Test
+ public void getDailyTimestamps_LastDayNoData_returnExpectedList() {
+ // Timezone GMT+8
+ final List<Long> timestamps = List.of(
+ 1640988000000L, // 2022-01-01 06:00:00
+ 1641060000000L, // 2022-01-02 02:00:00
+ 1641160800000L, // 2022-01-03 06:00:00
+ 1641225600000L // 2022-01-04 00:00:00
+ );
+
+ final List<Long> expectedTimestamps = List.of(
+ 1640988000000L, // 2022-01-01 06:00:00
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641139200000L, // 2022-01-03 00:00:00
+ 1641225600000L // 2022-01-04 00:00:00
+ );
+ assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
+ }
+
+ @Test
+ public void getDailyTimestamps_LastDayOneHourData_returnExpectedList() {
+ // Timezone GMT+8
+ final List<Long> timestamps = List.of(
+ 1640988000000L, // 2022-01-01 06:00:00
+ 1641060000000L, // 2022-01-02 02:00:00
+ 1641160800000L, // 2022-01-03 06:00:00
+ 1641229200000L // 2022-01-04 01:00:00
+ );
+
+ final List<Long> expectedTimestamps = List.of(
+ 1640988000000L, // 2022-01-01 06:00:00
+ 1641052800000L, // 2022-01-02 00:00:00
+ 1641139200000L, // 2022-01-03 00:00:00
+ 1641225600000L // 2022-01-04 00:00:00
+ );
+ assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
+ }
+
+ @Test
public void isFromFullCharge_emptyData_returnFalse() {
assertThat(DataProcessor.isFromFullCharge(null)).isFalse();
assertThat(DataProcessor.isFromFullCharge(new HashMap<>())).isFalse();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java
index c049497..fa049f8 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java
@@ -142,7 +142,7 @@
public void initPreference_hasCorrectSummary() {
mFragment.initPreference();
- verify(mBatteryUsagePreference).setSummary("View usage from last full charge");
+ verify(mBatteryUsagePreference).setSummary("View usage since last full charge");
}
@Test