Merge "Refactor FingerprintEnrollEnrolling to fragment"
diff --git a/res/drawable/ic_battery_charging.xml b/res/drawable/ic_battery_charging.xml
new file mode 100644
index 0000000..06e0e71
--- /dev/null
+++ b/res/drawable/ic_battery_charging.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M8,22q-0.425,0 -0.713,-0.288Q7,21.425 7,21L7,5q0,-0.425 0.287,-0.713Q7.575,4 8,4h2L10,2h4v2h2q0.425,0 0.712,0.287Q17,4.575 17,5v16q0,0.425 -0.288,0.712Q16.425,22 16,22zM11,20l4,-7.5h-2L13,7l-4,7.5h2z"/>
+</vector>
diff --git a/res/drawable/ic_edit.xml b/res/drawable/ic_edit.xml
index abc1980..0d7cd1c 100644
--- a/res/drawable/ic_edit.xml
+++ b/res/drawable/ic_edit.xml
@@ -15,6 +15,12 @@
~ limitations under the License.
-->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" android:tint="?attr/colorControlNormal">
- <path android:fillColor="@android:color/white" android:pathData="M9,39H11.2L35.45,14.75L34.35,13.65L33.25,12.55L9,36.8ZM6,42V35.6L35.4,6.2Q36.25,5.35 37.525,5.375Q38.8,5.4 39.65,6.25L41.8,8.4Q42.65,9.25 42.65,10.5Q42.65,11.75 41.8,12.6L12.4,42ZM39.5,10.45 L37.45,8.4ZM35.45,14.75 L34.35,13.65 33.25,12.55 35.45,14.75Z"/>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="?android:attr/colorControlNormal">
+ <path android:fillColor="#FFFFFFFF"
+ android:pathData="M5,19H6.4L16.45,8.975L15.75,8.25L15.025,7.55L5,17.6ZM3,21V16.75L16.45,3.325Q17.025,2.75 17.863,2.75Q18.7,2.75 19.275,3.325L20.675,4.75Q21.25,5.325 21.25,6.15Q21.25,6.975 20.675,7.55L7.25,21ZM19.25,6.15 L17.85,4.75ZM16.45,8.975 L15.75,8.25 15.025,7.55 16.45,8.975Z"/>
</vector>
\ No newline at end of file
diff --git a/res/drawable/work_challenge_emergency_button_background.xml b/res/drawable/work_challenge_emergency_button_background.xml
new file mode 100644
index 0000000..1a92fed
--- /dev/null
+++ b/res/drawable/work_challenge_emergency_button_background.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+<inset xmlns:android="http://schemas.android.com/apk/res/android">
+ <shape android:shape="rectangle">
+ <corners android:radius="25dp"/>
+ <solid android:color="@android:color/system_accent3_100" />
+ </shape>
+</inset>
\ No newline at end of file
diff --git a/res/layout-land/confirm_lock_pattern_base.xml b/res/layout-land/confirm_lock_pattern_base.xml
index f79fc72..9961769 100644
--- a/res/layout-land/confirm_lock_pattern_base.xml
+++ b/res/layout-land/confirm_lock_pattern_base.xml
@@ -89,6 +89,19 @@
android:layout_marginTop="12dp"
android:gravity="center_vertical"/>
+ <Button
+ android:id="@+id/emergencyCallButton"
+ style="@style/WorkChallengeEmergencyButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
+ android:layout_marginTop="60dp"
+ android:layout_marginBottom="14dp"
+ android:visibility="gone"
+ android:layout_gravity="center_horizontal"
+ android:text="@string/work_challenge_emergency_button_text"/>
+
</LinearLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/layout-land/confirm_lock_pattern_normal_base.xml b/res/layout-land/confirm_lock_pattern_normal_base.xml
index ced0e2c..9a5097e 100644
--- a/res/layout-land/confirm_lock_pattern_normal_base.xml
+++ b/res/layout-land/confirm_lock_pattern_normal_base.xml
@@ -70,6 +70,19 @@
android:layout_marginBottom="80dp"
android:text="@string/cancel" />
+ <Button
+ android:id="@+id/emergencyCallButton"
+ style="@style/WorkChallengeEmergencyButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
+ android:layout_marginTop="60dp"
+ android:layout_marginBottom="14dp"
+ android:visibility="gone"
+ android:layout_gravity="center_horizontal"
+ android:text="@string/work_challenge_emergency_button_text"/>
+
</LinearLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/layout/confirm_lock_password_base.xml b/res/layout/confirm_lock_password_base.xml
index a3e5659..84b6668 100644
--- a/res/layout/confirm_lock_password_base.xml
+++ b/res/layout/confirm_lock_password_base.xml
@@ -91,5 +91,17 @@
android:layout_gravity="center_horizontal"
android:text="@string/cancel" />
+ <Button
+ android:id="@+id/emergencyCallButton"
+ style="@style/WorkChallengeEmergencyButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
+ android:layout_marginBottom="12dp"
+ android:visibility="gone"
+ android:layout_gravity="center_horizontal"
+ android:text="@string/work_challenge_emergency_button_text"/>
+
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/confirm_lock_password_normal.xml b/res/layout/confirm_lock_password_normal.xml
index 645c444..c2a7b5d 100644
--- a/res/layout/confirm_lock_password_normal.xml
+++ b/res/layout/confirm_lock_password_normal.xml
@@ -84,5 +84,17 @@
android:layout_gravity="center_horizontal"
android:text="@string/cancel" />
+ <Button
+ android:id="@+id/emergencyCallButton"
+ style="@style/WorkChallengeEmergencyButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
+ android:layout_marginBottom="12dp"
+ android:visibility="gone"
+ android:layout_gravity="center_horizontal"
+ android:text="@string/work_challenge_emergency_button_text"/>
+
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/confirm_lock_pattern_base.xml b/res/layout/confirm_lock_pattern_base.xml
index 5b19105..01f028e 100644
--- a/res/layout/confirm_lock_pattern_base.xml
+++ b/res/layout/confirm_lock_pattern_base.xml
@@ -89,6 +89,19 @@
android:layout_marginTop="12dp"
android:gravity="center_vertical"/>
+ <Button
+ android:id="@+id/emergencyCallButton"
+ style="@style/WorkChallengeEmergencyButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
+ android:layout_marginTop="60dp"
+ android:layout_marginBottom="14dp"
+ android:visibility="gone"
+ android:layout_gravity="center_horizontal"
+ android:text="@string/work_challenge_emergency_button_text"/>
+
</LinearLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/layout/confirm_lock_pattern_normal_base.xml b/res/layout/confirm_lock_pattern_normal_base.xml
index 5d1ca7c..44d9ab7 100644
--- a/res/layout/confirm_lock_pattern_normal_base.xml
+++ b/res/layout/confirm_lock_pattern_normal_base.xml
@@ -71,6 +71,18 @@
android:layout_marginBottom="80dp"
android:text="@string/cancel" />
+ <Button
+ android:id="@+id/emergencyCallButton"
+ style="@style/WorkChallengeEmergencyButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
+ android:layout_marginBottom="12dp"
+ android:visibility="gone"
+ android:layout_gravity="center_horizontal"
+ android:text="@string/work_challenge_emergency_button_text"/>
+
</LinearLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/values/config.xml b/res/values/config.xml
index aa345ca..5c5a07f 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -600,13 +600,7 @@
<!-- The option list for switch screen resolution -->
<string-array name="config_screen_resolution_options_strings" translatable="false">
<item>@string/screen_resolution_option_high</item>
- <item>@string/screen_resolution_option_highest</item>
- </string-array>
-
- <!-- The option summary list for screen resolution -->
- <string-array name="config_screen_resolution_summaries_strings" translatable="false">
- <item>@string/screen_resolution_summary_high</item>
- <item>@string/screen_resolution_summary_highest</item>
+ <item>@string/screen_resolution_option_full</item>
</string-array>
<!-- Whether to aggregate for network selection list-->
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 273e3ae..9c6b03b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -839,6 +839,8 @@
<string name="biometric_settings_intro">When you set up Face Unlock and Fingerprint Unlock, your phone will ask for your fingerprint when you wear a mask or are in a dark area</string>
<!-- Biometric category title - biometric options for unlocking the device. [CHAR LIMIT=50] -->
<string name="biometric_settings_category_ways_to_unlock">Ways to unlock</string>
+ <!-- Biometric category title - biometric options for unlocking the device. [CHAR LIMIT=60] -->
+ <string name="biometric_settings_category_use_face_fingerprint">Use face or fingerprint to</string>
<!-- Text shown on a toggle which allows or disallows the device to use biometric for unlocking the device. [CHAR LIMIT=50] -->
<string name="biometric_settings_use_biometric_unlock_phone">Unlock your phone</string>
<!-- Text shown on a toggle which allows or disallows the device to use biometric for authentication. [CHAR LIMIT=50] -->
@@ -2208,14 +2210,10 @@
<!-- Display settings screen, screen resolution settings title [CHAR LIMIT=30] -->
<string name="screen_resolution_title">Screen resolution</string>
- <!-- Display settings screen, screen resolution option for "FHD+" [CHAR LIMIT=45] -->
+ <!-- Display settings screen, screen resolution option for high resolution [CHAR LIMIT=45] -->
<string name="screen_resolution_option_high">High resolution</string>
- <!-- Display settings screen, screen resolution option for "QHD+" [CHAR LIMIT=45] -->
- <string name="screen_resolution_option_highest">Full resolution</string>
- <!-- Display settings screen, "FHD+" screen resolution summary [CHAR LIMIT=NONE] -->
- <string name="screen_resolution_summary_high">1080p FHD+</string>
- <!-- Display settings screen, "QHD+" screen resolution summary [CHAR LIMIT=NONE] -->
- <string name="screen_resolution_summary_highest">1440p QHD+</string>
+ <!-- Display settings screen, screen resolution option for full resolution [CHAR LIMIT=45] -->
+ <string name="screen_resolution_option_full">Full resolution</string>
<!-- The footer message for switch screen resolution [CHAR LIMIT=NONE] -->
<string name="screen_resolution_footer">Full resolution uses more of your battery. Switching your resolution may cause some apps to restart.</string>
<!-- Message announced to a11y users when they selected one resolution [CHAR LIMIT=NONE] -->
@@ -3350,6 +3348,8 @@
<!-- Security & location settings screen, change unlock pattern screen instruction if user
draws incorrect pattern [CHAR LIMIT=30] -->
<string name="lockpattern_need_to_unlock_wrong">Wrong pattern</string>
+ <!-- Work challenge screen, this string is the label for an emergency call button, which opens the personal safety app to allow the user to make an emergency call. [CHAR LIMIT=20] -->
+ <string name="work_challenge_emergency_button_text">Emergency</string>
<!-- Lock Pattern settings -->
<!-- Security & location settings screen, header -->
@@ -5086,6 +5086,12 @@
<string name="battery_tip_unrestrict_app_dialog_cancel">Cancel</string>
<!-- Charge to full button for battery defender tips [CHAR LIMIT=NONE] -->
<string name="battery_tip_charge_to_full_button">Charge to full</string>
+ <!-- Title of incompatible charging battery tip [CHAR LIMIT=NONE] -->
+ <string name="battery_tip_incompatible_charging_title">Incompatible charging setup</string>
+ <!-- Message of incompatible charging battery tip [CHAR LIMIT=NONE] -->
+ <string name="battery_tip_incompatible_charging_message">Your battery is not charging or is charging very slowly</string>
+ <!-- Content description for the incompatible charging battery tip button [CHAR LIMIT=NONE] -->
+ <string name="battery_tip_incompatible_charging_content_description">Learn more about incompatible charging</string>
<!-- Title for the smart battery manager preference [CHAR LIMIT=NONE] -->
<string name="smart_battery_manager_title">Battery Manager</string>
@@ -6388,6 +6394,8 @@
<string name="help_url_battery_defender" translatable="false"></string>
<!-- Help URL, Dock Defender [DO NOT TRANSLATE] -->
<string name="help_url_dock_defender" translatable="false"></string>
+ <!-- Help URL, Incompatible charging [DO NOT TRANSLATE] -->
+ <string name="help_url_incompatible_charging" translatable="false"></string>
<!-- Help URL, Accounts [DO NOT TRANSLATE] -->
<string name="help_url_accounts" translatable="false"></string>
<!-- Help URL, Choose lockscreen [DO NOT TRANSLATE] -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 0dc19be..42ccf0d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -406,6 +406,17 @@
<item name="android:layout_gravity">start|top</item>
</style>
+ <style name="WorkChallengeEmergencyButtonStyle">
+ <item name="android:background">@drawable/work_challenge_emergency_button_background</item>
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
+ <item name="android:outlineProvider">none</item>
+ <item name="android:paddingTop">15dp</item>
+ <item name="android:paddingBottom">15dp</item>
+ <item name="android:paddingLeft">30dp</item>
+ <item name="android:paddingRight">30dp</item>
+ <item name="android:textSize">16dp</item>
+ </style>
+
<style name="device_info_dialog_label">
<item name="android:textAlignment">viewStart</item>
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
diff --git a/res/xml/security_settings_combined_biometric.xml b/res/xml/security_settings_combined_biometric.xml
index 1bbe7b3..5041778 100644
--- a/res/xml/security_settings_combined_biometric.xml
+++ b/res/xml/security_settings_combined_biometric.xml
@@ -50,7 +50,8 @@
</PreferenceCategory>
<PreferenceCategory
- android:key="biometric_ways_to_use">
+ android:key="biometric_ways_to_use"
+ android:title="@string/biometric_settings_category_use_face_fingerprint">
<com.android.settingslib.RestrictedSwitchPreference
android:key="biometric_settings_biometric_keyguard"
diff --git a/src/com/android/settings/SettingsApplication.java b/src/com/android/settings/SettingsApplication.java
index e6e6df3..49cb85e 100644
--- a/src/com/android/settings/SettingsApplication.java
+++ b/src/com/android/settings/SettingsApplication.java
@@ -53,7 +53,7 @@
setSpaEnvironment();
if (FeatureFlagUtils.isEnabled(this, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN)
- && SplitController.getInstance().isSplitSupported()) {
+ && SplitController.getInstance(this).isSplitSupported()) {
if (WizardManagerHelper.isUserSetupComplete(this)) {
new ActivityEmbeddingRulesController(this).initRules();
} else {
diff --git a/src/com/android/settings/SettingsInitialize.java b/src/com/android/settings/SettingsInitialize.java
index 2c10502..1d23523 100644
--- a/src/com/android/settings/SettingsInitialize.java
+++ b/src/com/android/settings/SettingsInitialize.java
@@ -166,7 +166,7 @@
DeepLinkHomepageActivity.class);
final ComponentName searchStateReceiver = new ComponentName(context,
SearchStateReceiver.class);
- final int enableState = SplitController.getInstance().isSplitSupported()
+ final int enableState = SplitController.getInstance(context).isSplitSupported()
? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
pm.setComponentEnabledSetting(deepLinkHome, enableState, PackageManager.DONT_KILL_APP);
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
index 1e2a0c9..7bbd31b 100644
--- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
@@ -22,12 +22,12 @@
import android.content.Context;
import android.content.Intent;
import android.util.FeatureFlagUtils;
-import android.util.LayoutDirection;
import android.util.Log;
import androidx.window.embedding.ActivityFilter;
import androidx.window.embedding.ActivityRule;
-import androidx.window.embedding.SplitController;
+import androidx.window.embedding.RuleController;
+import androidx.window.embedding.SplitAttributes;
import androidx.window.embedding.SplitPairFilter;
import androidx.window.embedding.SplitPairRule;
import androidx.window.embedding.SplitPlaceholderRule;
@@ -50,6 +50,7 @@
import com.android.settings.password.ChooseLockPattern;
import com.android.settingslib.users.AvatarPickerActivity;
+import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
@@ -60,11 +61,11 @@
private static final ComponentName COMPONENT_NAME_WILDCARD = new ComponentName(
"*" /* pkg */, "*" /* cls */);
private final Context mContext;
- private final SplitController mSplitController;
+ private final RuleController mRuleController;
public ActivityEmbeddingRulesController(Context context) {
mContext = context;
- mSplitController = SplitController.getInstance();
+ mRuleController = RuleController.getInstance(context);
}
/**
@@ -76,7 +77,7 @@
return;
}
- mSplitController.clearRegisteredRules();
+ mRuleController.clearRules();
// Set a placeholder for home page.
registerHomepagePlaceholderRule();
@@ -89,8 +90,8 @@
ComponentName primaryComponent,
ComponentName secondaryComponent,
String secondaryIntentAction,
- int finishPrimaryWithSecondary,
- int finishSecondaryWithPrimary,
+ SplitRule.FinishBehavior finishPrimaryWithSecondary,
+ SplitRule.FinishBehavior finishSecondaryWithPrimary,
boolean clearTop) {
if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) {
return;
@@ -99,14 +100,20 @@
filters.add(new SplitPairFilter(primaryComponent, secondaryComponent,
secondaryIntentAction));
- SplitController.getInstance().registerRule(new SplitPairRule(filters,
- finishPrimaryWithSecondary,
- finishSecondaryWithPrimary,
- clearTop,
- ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context),
- ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context),
- ActivityEmbeddingUtils.getSplitRatio(context),
- LayoutDirection.LOCALE));
+ SplitAttributes attributes = new SplitAttributes.Builder()
+ .setSplitType(SplitAttributes.SplitType.ratio(
+ ActivityEmbeddingUtils.getSplitRatio(context)))
+ .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
+ .build();
+ SplitPairRule splitPairRule = new SplitPairRule.Builder(filters)
+ .setFinishPrimaryWithSecondary(finishPrimaryWithSecondary)
+ .setFinishSecondaryWithPrimary(finishSecondaryWithPrimary)
+ .setClearTop(clearTop)
+ .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp())
+ .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp())
+ .setDefaultSplitAttributes(attributes)
+ .build();
+ RuleController.getInstance(context).addRule(splitPairRule);
}
/**
@@ -127,8 +134,10 @@
new ComponentName(context, Settings.class),
secondaryComponent,
secondaryIntentAction,
- finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
- finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
+ finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT
+ : SplitRule.FinishBehavior.NEVER,
+ finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT
+ : SplitRule.FinishBehavior.NEVER,
clearTop);
registerTwoPanePairRule(
@@ -136,8 +145,10 @@
new ComponentName(context, SettingsHomepageActivity.class),
secondaryComponent,
secondaryIntentAction,
- finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
- finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
+ finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT
+ : SplitRule.FinishBehavior.NEVER,
+ finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT
+ : SplitRule.FinishBehavior.NEVER,
clearTop);
// We should finish HomePageActivity altogether even if it shows in single pane for all deep
@@ -147,8 +158,10 @@
new ComponentName(context, DeepLinkHomepageActivity.class),
secondaryComponent,
secondaryIntentAction,
- finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER,
- finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER,
+ finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS
+ : SplitRule.FinishBehavior.NEVER,
+ finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS
+ : SplitRule.FinishBehavior.NEVER,
clearTop);
registerTwoPanePairRule(
@@ -156,8 +169,10 @@
new ComponentName(context, DeepLinkHomepageActivityInternal.class),
secondaryComponent,
secondaryIntentAction,
- finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER,
- finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER,
+ finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS
+ : SplitRule.FinishBehavior.NEVER,
+ finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS
+ : SplitRule.FinishBehavior.NEVER,
clearTop);
}
@@ -208,17 +223,20 @@
final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class);
intent.putExtra(SettingsActivity.EXTRA_IS_SECOND_LAYER_PAGE, true);
- final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule(
- activityFilters,
- intent,
- false /* stickyPlaceholder */,
- SplitRule.FINISH_ADJACENT,
- ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(mContext),
- ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(mContext),
- ActivityEmbeddingUtils.getSplitRatio(mContext),
- LayoutDirection.LOCALE);
+ SplitAttributes attributes = new SplitAttributes.Builder()
+ .setSplitType(SplitAttributes.SplitType.ratio(
+ ActivityEmbeddingUtils.getSplitRatio(mContext)))
+ .build();
+ final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule.Builder(
+ activityFilters, intent)
+ .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp())
+ .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp())
+ .setSticky(false)
+ .setFinishPrimaryWithPlaceholder(SplitRule.FinishBehavior.ADJACENT)
+ .setDefaultSplitAttributes(attributes)
+ .build();
- mSplitController.registerRule(placeholderRule);
+ mRuleController.addRule(placeholderRule);
}
private void registerAlwaysExpandRule() {
@@ -237,14 +255,16 @@
addActivityFilter(activityFilters, FaceEnrollIntroduction.class);
addActivityFilter(activityFilters, AvatarPickerActivity.class);
addActivityFilter(activityFilters, ChooseLockPattern.class);
- mSplitController.registerRule(new ActivityRule(activityFilters, true /* alwaysExpand */));
+ ActivityRule activityRule = new ActivityRule.Builder(activityFilters).setAlwaysExpand(true)
+ .build();
+ mRuleController.addRule(activityRule);
}
private static void addActivityFilter(Set<ActivityFilter> activityFilters, Intent intent) {
activityFilters.add(new ActivityFilter(COMPONENT_NAME_WILDCARD, intent.getAction()));
}
- private void addActivityFilter(Set<ActivityFilter> activityFilters,
+ private void addActivityFilter(Collection<ActivityFilter> activityFilters,
Class<? extends Activity> activityClass) {
activityFilters.add(new ActivityFilter(new ComponentName(mContext, activityClass),
null /* intentAction */));
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
index f00542d..370392b 100644
--- a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
@@ -32,29 +32,25 @@
/** An util class collecting all common methods for the embedding activity features. */
public class ActivityEmbeddingUtils {
// The smallest value of current width of the window when the split should be used.
- private static final float MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 720f;
+ private static final int MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 720;
// The smallest value of the smallest-width (sw) of the window in any rotation when
// the split should be used.
- private static final float MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP = 600f;
+ private static final int MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP = 600;
// The minimum width of the activity to show the regular homepage layout.
private static final float MIN_REGULAR_HOMEPAGE_LAYOUT_WIDTH_DP = 380f;
private static final String TAG = "ActivityEmbeddingUtils";
- /** Get the smallest pixel value of width of the window when the split should be used. */
- public static int getMinCurrentScreenSplitWidthPx(Context context) {
- final DisplayMetrics dm = context.getResources().getDisplayMetrics();
- return (int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_DIP, MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP, dm);
+ /** Get the smallest width dp of the window when the split should be used. */
+ public static int getMinCurrentScreenSplitWidthDp() {
+ return MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP;
}
/**
- * Get the smallest pixel value of the smallest-width (sw) of the window in any rotation when
+ * Get the smallest dp value of the smallest-width (sw) of the window in any rotation when
* the split should be used.
*/
- public static int getMinSmallestScreenSplitWidthPx(Context context) {
- final DisplayMetrics dm = context.getResources().getDisplayMetrics();
- return (int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_DIP, MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP, dm);
+ public static int getMinSmallestScreenSplitWidthDp() {
+ return MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP;
}
/**
@@ -69,7 +65,7 @@
public static boolean isEmbeddingActivityEnabled(Context context) {
boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context,
FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN);
- boolean isSplitSupported = SplitController.getInstance().isSplitSupported();
+ boolean isSplitSupported = SplitController.getInstance(context).isSplitSupported();
boolean isUserSetupComplete = WizardManagerHelper.isUserSetupComplete(context);
Log.d(TAG, "isFlagEnabled = " + isFlagEnabled);
diff --git a/src/com/android/settings/datausage/DataUsageUtils.java b/src/com/android/settings/datausage/DataUsageUtils.java
index 5227284..9fec27e 100644
--- a/src/com/android/settings/datausage/DataUsageUtils.java
+++ b/src/com/android/settings/datausage/DataUsageUtils.java
@@ -15,6 +15,7 @@
package com.android.settings.datausage;
import static android.content.pm.PackageManager.FEATURE_ETHERNET;
+import static android.content.pm.PackageManager.FEATURE_USB_HOST;
import static android.content.pm.PackageManager.FEATURE_WIFI;
import static android.telephony.TelephonyManager.SIM_STATE_READY;
@@ -70,7 +71,9 @@
return SystemProperties.get(DataUsageUtils.TEST_RADIOS_PROP).contains(ETHERNET);
}
- if (!context.getPackageManager().hasSystemFeature(FEATURE_ETHERNET)) {
+ // See ConnectivityService#deviceSupportsEthernet.
+ final PackageManager pm = context.getPackageManager();
+ if (!pm.hasSystemFeature(FEATURE_ETHERNET) && !pm.hasSystemFeature(FEATURE_USB_HOST)) {
return false;
}
diff --git a/src/com/android/settings/display/ScreenResolutionController.java b/src/com/android/settings/display/ScreenResolutionController.java
index dca1275..a3433d4 100644
--- a/src/com/android/settings/display/ScreenResolutionController.java
+++ b/src/com/android/settings/display/ScreenResolutionController.java
@@ -17,7 +17,9 @@
package com.android.settings.display;
import android.content.Context;
+import android.graphics.Point;
import android.hardware.display.DisplayManager;
+import android.util.Log;
import android.view.Display;
import androidx.annotation.VisibleForTesting;
@@ -25,32 +27,63 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
/** Controller that switch the screen resolution. */
public class ScreenResolutionController extends BasePreferenceController {
-
- static final int FHD_WIDTH = 1080;
- static final int QHD_WIDTH = 1440;
+ private static final String TAG = "ScreenResolutionController";
+ static final int HIGHRESOLUTION_IDX = 0;
+ static final int FULLRESOLUTION_IDX = 1;
private Display mDisplay;
+ private Set<Point> mSupportedResolutions = null;
+ private int mHighWidth = 0;
+ private int mFullWidth = 0;
+ private int mHighHeight = 0;
+ private int mFullHeight = 0;
public ScreenResolutionController(Context context, String key) {
super(context, key);
mDisplay =
mContext.getSystemService(DisplayManager.class).getDisplay(Display.DEFAULT_DISPLAY);
+
+ initSupportedResolutionData();
}
- /** Check if the width is supported by the display. */
- private boolean isSupportedMode(int width) {
+ /**
+ * Initialize the resolution data. So far, we support two resolution switching. Save the width
+ * and the height for high resolution and full resolution.
+ */
+ private void initSupportedResolutionData() {
+ // Collect and filter the resolutions
+ Set<Point> resolutions = new HashSet<>();
for (Display.Mode mode : getSupportedModes()) {
- if (mode.getPhysicalWidth() == width) return true;
+ resolutions.add(new Point(mode.getPhysicalWidth(), mode.getPhysicalHeight()));
}
- return false;
+ mSupportedResolutions = resolutions;
+
+ // Get the width and height for high resolution and full resolution
+ List<Point> resolutionList = new ArrayList<>(resolutions);
+ if (resolutionList == null || resolutionList.size() != 2) {
+ Log.e(TAG, "No support");
+ return;
+ }
+
+ Collections.sort(resolutionList, (p1, p2) -> p1.x * p1.y - p2.x * p2.y);
+ mHighWidth = resolutionList.get(HIGHRESOLUTION_IDX).x;
+ mHighHeight = resolutionList.get(HIGHRESOLUTION_IDX).y;
+ mFullWidth = resolutionList.get(FULLRESOLUTION_IDX).x;
+ mFullHeight = resolutionList.get(FULLRESOLUTION_IDX).y;
}
/** Return true if the device contains two (or more) resolutions. */
protected boolean checkSupportedResolutions() {
- return isSupportedMode(FHD_WIDTH) && isSupportedMode(QHD_WIDTH);
+ return getHighWidth() != 0 && getFullWidth() != 0;
}
@Override
@@ -61,20 +94,43 @@
@Override
public CharSequence getSummary() {
String summary = null;
- switch (getDisplayWidth()) {
- case FHD_WIDTH:
- summary = mContext.getString(R.string.screen_resolution_summary_high);
- break;
- case QHD_WIDTH:
- summary = mContext.getString(R.string.screen_resolution_summary_highest);
- break;
- default:
- summary = mContext.getString(R.string.screen_resolution_title);
+ int width = getDisplayWidth();
+ if (width == mHighWidth) {
+ summary = mContext.getString(R.string.screen_resolution_option_high);
+ } else if (width == mFullWidth) {
+ summary = mContext.getString(R.string.screen_resolution_option_full);
+ } else {
+ summary = mContext.getString(R.string.screen_resolution_title);
}
return summary;
}
+ /** Return all supported resolutions of the device. */
+ public Set<Point> getAllSupportedResolutions() {
+ return this.mSupportedResolutions;
+ }
+
+ /** Return the high resolution width of the device. */
+ public int getHighWidth() {
+ return this.mHighWidth;
+ }
+
+ /** Return the full resolution width of the device. */
+ public int getFullWidth() {
+ return this.mFullWidth;
+ }
+
+ /** Return the high resolution height of the device. */
+ public int getHighHeight() {
+ return this.mHighHeight;
+ }
+
+ /** Return the full resolution height of the device. */
+ public int getFullHeight() {
+ return this.mFullHeight;
+ }
+
@VisibleForTesting
public int getDisplayWidth() {
return mDisplay.getMode().getPhysicalWidth();
diff --git a/src/com/android/settings/display/ScreenResolutionFragment.java b/src/com/android/settings/display/ScreenResolutionFragment.java
index 13191ce..b40b48f 100644
--- a/src/com/android/settings/display/ScreenResolutionFragment.java
+++ b/src/com/android/settings/display/ScreenResolutionFragment.java
@@ -16,9 +16,6 @@
package com.android.settings.display;
-import static com.android.settings.display.ScreenResolutionController.FHD_WIDTH;
-import static com.android.settings.display.ScreenResolutionController.QHD_WIDTH;
-
import android.annotation.Nullable;
import android.app.settings.SettingsEnums;
import android.content.Context;
@@ -48,7 +45,6 @@
import com.android.settingslib.widget.SelectorWithWidgetPreference;
import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
@@ -59,9 +55,8 @@
private static final String TAG = "ScreenResolution";
private Resources mResources;
- private static final int FHD_INDEX = 0;
- private static final int QHD_INDEX = 1;
private static final String SCREEN_RESOLUTION = "user_selected_resolution";
+ private static final String SCREEN_RESOLUTION_KEY = "screen_resolution";
private Display mDefaultDisplay;
private String[] mScreenResolutionOptions;
private Set<Point> mResolutions;
@@ -71,6 +66,9 @@
private DisplayObserver mDisplayObserver;
private AccessibilityManager mAccessibilityManager;
+ private int mHighWidth;
+ private int mFullWidth;
+
@Override
public void onAttach(Context context) {
super.onAttach(context);
@@ -81,11 +79,19 @@
mResources = context.getResources();
mScreenResolutionOptions =
mResources.getStringArray(R.array.config_screen_resolution_options_strings);
- mScreenResolutionSummaries =
- mResources.getStringArray(R.array.config_screen_resolution_summaries_strings);
- mResolutions = getAllSupportedResolution();
mImagePreference = new IllustrationPreference(context);
mDisplayObserver = new DisplayObserver(context);
+ ScreenResolutionController controller =
+ new ScreenResolutionController(context, SCREEN_RESOLUTION_KEY);
+ mResolutions = controller.getAllSupportedResolutions();
+ mHighWidth = controller.getHighWidth();
+ mFullWidth = controller.getFullWidth();
+ Log.i(TAG, "mHighWidth:" + mHighWidth + "mFullWidth:" + mFullWidth);
+ mScreenResolutionSummaries =
+ new String[] {
+ mHighWidth + " x " + controller.getHighHeight(),
+ mFullWidth + " x " + controller.getFullHeight()
+ };
}
@Override
@@ -133,16 +139,6 @@
return candidates;
}
- /** Get all supported resolutions on the device. */
- private Set<Point> getAllSupportedResolution() {
- Set<Point> resolutions = new HashSet<>();
- for (Display.Mode mode : mDefaultDisplay.getSupportedModes()) {
- resolutions.add(new Point(mode.getPhysicalWidth(), mode.getPhysicalHeight()));
- }
-
- return resolutions;
- }
-
/** Get prefer display mode. */
private Display.Mode getPreferMode(int width) {
for (Point resolution : mResolutions) {
@@ -177,6 +173,7 @@
try {
/** Apply the resolution change. */
+ Log.i(TAG, "setUserPreferredDisplayMode: " + mode);
mDefaultDisplay.setUserPreferredDisplayMode(mode);
} catch (Exception e) {
Log.e(TAG, "setUserPreferredDisplayMode() failed", e);
@@ -194,16 +191,20 @@
/** Get the key corresponding to the resolution. */
@VisibleForTesting
String getKeyForResolution(int width) {
- return width == FHD_WIDTH
- ? mScreenResolutionOptions[FHD_INDEX]
- : width == QHD_WIDTH ? mScreenResolutionOptions[QHD_INDEX] : null;
+ return width == mHighWidth
+ ? mScreenResolutionOptions[ScreenResolutionController.HIGHRESOLUTION_IDX]
+ : width == mFullWidth
+ ? mScreenResolutionOptions[ScreenResolutionController.FULLRESOLUTION_IDX]
+ : null;
}
/** Get the width corresponding to the resolution key. */
int getWidthForResoluitonKey(String key) {
- return mScreenResolutionOptions[FHD_INDEX].equals(key)
- ? FHD_WIDTH
- : mScreenResolutionOptions[QHD_INDEX].equals(key) ? QHD_WIDTH : -1;
+ return mScreenResolutionOptions[ScreenResolutionController.HIGHRESOLUTION_IDX].equals(key)
+ ? mHighWidth
+ : mScreenResolutionOptions[ScreenResolutionController.FULLRESOLUTION_IDX].equals(
+ key)
+ ? mFullWidth : -1;
}
@Override
@@ -248,9 +249,11 @@
private void updateIllustrationImage(IllustrationPreference preference) {
String key = getDefaultKey();
- if (TextUtils.equals(mScreenResolutionOptions[FHD_INDEX], key)) {
+ if (TextUtils.equals(
+ mScreenResolutionOptions[ScreenResolutionController.HIGHRESOLUTION_IDX], key)) {
preference.setLottieAnimationResId(R.drawable.screen_resolution_1080p);
- } else if (TextUtils.equals(mScreenResolutionOptions[QHD_INDEX], key)) {
+ } else if (TextUtils.equals(
+ mScreenResolutionOptions[ScreenResolutionController.FULLRESOLUTION_IDX], key)) {
preference.setLottieAnimationResId(R.drawable.screen_resolution_1440p);
}
}
@@ -300,7 +303,7 @@
@Override
protected boolean isPageSearchEnabled(Context context) {
ScreenResolutionController mController =
- new ScreenResolutionController(context, "fragment");
+ new ScreenResolutionController(context, SCREEN_RESOLUTION_KEY);
return mController.checkSupportedResolutions();
}
};
@@ -408,6 +411,8 @@
return false;
}
+ Log.i(TAG,
+ "resolution changed from " + mPreviousWidth.get() + " to " + getCurrentWidth());
return true;
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
index c525be6..da646cb 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
@@ -30,7 +30,6 @@
import com.android.settings.fuelgauge.batterytip.detectors.SmartBatteryDetector;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip;
-import com.android.settings.fuelgauge.batterytip.tips.SummaryTip;
import com.android.settingslib.fuelgauge.EstimateKt;
import com.android.settingslib.utils.AsyncLoaderCompat;
@@ -45,8 +44,6 @@
public class BatteryTipLoader extends AsyncLoaderCompat<List<BatteryTip>> {
private static final String TAG = "BatteryTipLoader";
- private static final boolean USE_FAKE_DATA = false;
-
private BatteryUsageStats mBatteryUsageStats;
@VisibleForTesting
BatteryUtils mBatteryUtils;
@@ -59,9 +56,6 @@
@Override
public List<BatteryTip> loadInBackground() {
- if (USE_FAKE_DATA) {
- return getFakeData();
- }
final List<BatteryTip> tips = new ArrayList<>();
final BatteryTipPolicy policy = new BatteryTipPolicy(getContext());
final BatteryInfo batteryInfo = mBatteryUtils.getBatteryInfo(TAG);
@@ -81,14 +75,4 @@
@Override
protected void onDiscardResult(List<BatteryTip> result) {
}
-
- private List<BatteryTip> getFakeData() {
- final List<BatteryTip> tips = new ArrayList<>();
- tips.add(new SummaryTip(BatteryTip.StateType.NEW,
- EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN));
- tips.add(new LowBatteryTip(BatteryTip.StateType.NEW, false /* powerSaveModeOn */));
-
- return tips;
- }
-
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java
deleted file mode 100644
index 70ae0ec..0000000
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java
+++ /dev/null
@@ -1,96 +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.fuelgauge.batterytip.detectors;
-
-import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
-
-import android.content.Context;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
-import com.android.settings.fuelgauge.batterytip.AppInfo;
-import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
-import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
-import com.android.settings.fuelgauge.batterytip.BatteryTipUtils;
-import com.android.settings.fuelgauge.batterytip.tips.AppLabelPredicate;
-import com.android.settings.fuelgauge.batterytip.tips.AppRestrictionPredicate;
-import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
-import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Detector whether to show summary tip. This detector should be executed as the last
- * {@link BatteryTipDetector} since it need the most up-to-date {@code visibleTips}
- */
-public class RestrictAppDetector implements BatteryTipDetector {
- @VisibleForTesting
- static final boolean USE_FAKE_DATA = false;
- private BatteryTipPolicy mPolicy;
- @VisibleForTesting
- BatteryDatabaseManager mBatteryDatabaseManager;
- private Context mContext;
-
- private AppRestrictionPredicate mAppRestrictionPredicate;
- private AppLabelPredicate mAppLabelPredicate;
-
- public RestrictAppDetector(Context context, BatteryTipPolicy policy) {
- mContext = context;
- mPolicy = policy;
- mBatteryDatabaseManager = BatteryDatabaseManager.getInstance(context);
- mAppRestrictionPredicate = AppRestrictionPredicate.getInstance(context);
- mAppLabelPredicate = AppLabelPredicate.getInstance(context);
- }
-
- @Override
- public BatteryTip detect() {
- if (USE_FAKE_DATA) {
- return getFakeData();
- }
- if (mPolicy.appRestrictionEnabled) {
- final long oneDayBeforeMs = System.currentTimeMillis()
- - TimeUnit.HOURS.toMillis(mPolicy.appRestrictionActiveHour);
- final List<AppInfo> highUsageApps = BatteryTipUtils.detectAnomalies(mContext,
- oneDayBeforeMs);
- if (!highUsageApps.isEmpty()) {
- // If there are new anomalies, show them
- return new RestrictAppTip(BatteryTip.StateType.NEW, highUsageApps);
- } else {
- // Otherwise, show auto-handled one if it exists
- final List<AppInfo> autoHandledApps = mBatteryDatabaseManager.queryAllAnomalies(
- oneDayBeforeMs, AnomalyDatabaseHelper.State.AUTO_HANDLED);
- // Remove it if it doesn't have label or unrestricted
- autoHandledApps.removeIf(mAppLabelPredicate.or(mAppRestrictionPredicate.negate()));
- return new RestrictAppTip(autoHandledApps.isEmpty() ? BatteryTip.StateType.INVISIBLE
- : BatteryTip.StateType.HANDLED, autoHandledApps);
- }
- } else {
- return new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>());
- }
- }
-
- private BatteryTip getFakeData() {
- final List<AppInfo> highUsageApps = new ArrayList<>();
- highUsageApps.add(new AppInfo.Builder()
- .setPackageName(SETTINGS_PACKAGE_NAME)
- .build());
- return new RestrictAppTip(BatteryTip.StateType.NEW, highUsageApps);
- }
-}
diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetector.java
deleted file mode 100644
index 0a20aac..0000000
--- a/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetector.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.batterytip.detectors;
-
-import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
-import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
-import com.android.settings.fuelgauge.batterytip.tips.SummaryTip;
-
-/**
- * Detector whether to show summary tip. This detector should be executed as the last
- * {@link BatteryTipDetector} since it need the most up-to-date {@code visibleTips}
- */
-public class SummaryDetector implements BatteryTipDetector {
- private BatteryTipPolicy mPolicy;
- private long mAverageTimeMs;
-
- public SummaryDetector(BatteryTipPolicy policy, long averageTimeMs) {
- mPolicy = policy;
- mAverageTimeMs = averageTimeMs;
- }
-
- @Override
- public BatteryTip detect() {
- // Show it if there is no other tips shown
- final int state = mPolicy.summaryEnabled
- ? BatteryTip.StateType.NEW
- : BatteryTip.StateType.INVISIBLE;
- return new SummaryTip(state, mAverageTimeMs);
- }
-}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
index 1ccc29c..2035f23 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
@@ -106,10 +106,6 @@
R.string.battery_tip_limited_temporarily_sec_button_content_description));
}
- private CardPreference castToCardPreferenceSafely(Preference preference) {
- return preference instanceof CardPreference ? (CardPreference) preference : null;
- }
-
private void resumeCharging(Context context) {
final Intent intent =
FeatureFactory.getFactory(context)
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
index fcf5e09..c869b92 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
@@ -27,6 +27,7 @@
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
+import com.android.settings.widget.CardPreference;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.lang.annotation.Retention;
@@ -59,7 +60,8 @@
TipType.LOW_BATTERY,
TipType.REMOVE_APP_RESTRICTION,
TipType.BATTERY_DEFENDER,
- TipType.DOCK_DEFENDER})
+ TipType.DOCK_DEFENDER,
+ TipType.INCOMPATIBLE_CHARGER})
public @interface TipType {
int SMART_BATTERY_MANAGER = 0;
int APP_RESTRICTION = 1;
@@ -71,6 +73,7 @@
int REMOVE_APP_RESTRICTION = 7;
int BATTERY_DEFENDER = 8;
int DOCK_DEFENDER = 9;
+ int INCOMPATIBLE_CHARGER = 10;
}
@VisibleForTesting
@@ -81,12 +84,13 @@
TIP_ORDER.append(TipType.LOW_BATTERY, 1);
TIP_ORDER.append(TipType.BATTERY_DEFENDER, 2);
TIP_ORDER.append(TipType.DOCK_DEFENDER, 3);
- TIP_ORDER.append(TipType.APP_RESTRICTION, 4);
- TIP_ORDER.append(TipType.HIGH_DEVICE_USAGE, 5);
- TIP_ORDER.append(TipType.SUMMARY, 6);
- TIP_ORDER.append(TipType.SMART_BATTERY_MANAGER, 7);
- TIP_ORDER.append(TipType.REDUCED_BATTERY, 8);
- TIP_ORDER.append(TipType.REMOVE_APP_RESTRICTION, 9);
+ TIP_ORDER.append(TipType.INCOMPATIBLE_CHARGER, 4);
+ TIP_ORDER.append(TipType.APP_RESTRICTION, 5);
+ TIP_ORDER.append(TipType.HIGH_DEVICE_USAGE, 6);
+ TIP_ORDER.append(TipType.SUMMARY, 7);
+ TIP_ORDER.append(TipType.SMART_BATTERY_MANAGER, 8);
+ TIP_ORDER.append(TipType.REDUCED_BATTERY, 9);
+ TIP_ORDER.append(TipType.REMOVE_APP_RESTRICTION, 10);
}
private static final String KEY_PREFIX = "key_battery_tip";
@@ -203,4 +207,8 @@
public String toString() {
return "type=" + mType + " state=" + mState;
}
+
+ CardPreference castToCardPreferenceSafely(Preference preference) {
+ return preference instanceof CardPreference ? (CardPreference) preference : null;
+ }
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTip.java
index bc0ba08..327f974 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/DockDefenderTip.java
@@ -151,10 +151,6 @@
}
- private CardPreference castToCardPreferenceSafely(Preference preference) {
- return preference instanceof CardPreference ? (CardPreference) preference : null;
- }
-
private void resumeCharging(Context context) {
final Intent intent =
FeatureFactory.getFactory(context)
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java
new file mode 100644
index 0000000..7ad3d13
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java
@@ -0,0 +1,102 @@
+/*
+ * 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.fuelgauge.batterytip.tips;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Parcel;
+import android.util.Log;
+
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.widget.CardPreference;
+import com.android.settingslib.HelpUtils;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
+/** Tip to show incompatible charger state */
+public final class IncompatibleChargerTip extends BatteryTip {
+ private static final String TAG = "IncompatibleChargerTip";
+
+ public IncompatibleChargerTip(@StateType int state) {
+ super(TipType.INCOMPATIBLE_CHARGER, state, /* showDialog */ false);
+ }
+
+ private IncompatibleChargerTip(Parcel in) {
+ super(in);
+ }
+
+ @Override
+ public CharSequence getTitle(Context context) {
+ return context.getString(R.string.battery_tip_incompatible_charging_title);
+ }
+
+ @Override
+ public CharSequence getSummary(Context context) {
+ return context.getString(R.string.battery_tip_incompatible_charging_message);
+ }
+
+ @Override
+ public int getIconId() {
+ return R.drawable.ic_battery_charging;
+ }
+
+ @Override
+ public void updateState(BatteryTip tip) {
+ mState = tip.mState;
+ }
+
+ @Override
+ public void log(Context context, MetricsFeatureProvider metricsFeatureProvider) {
+ metricsFeatureProvider.action(context, SettingsEnums.ACTION_INCOMPATIBLE_CHARGING_TIP,
+ mState);
+ }
+
+ @Override
+ public void updatePreference(Preference preference) {
+ super.updatePreference(preference);
+ final Context context = preference.getContext();
+ final CardPreference cardPreference = castToCardPreferenceSafely(preference);
+ if (cardPreference == null) {
+ Log.e(TAG, "cast Preference to CardPreference failed");
+ return;
+ }
+
+ cardPreference.setSelectable(false);
+ cardPreference.setSecondaryButtonText(context.getString(R.string.learn_more));
+ cardPreference.setSecondaryButtonClickListener(
+ button -> button.startActivityForResult(
+ HelpUtils.getHelpIntent(
+ context,
+ context.getString(R.string.help_url_incompatible_charging),
+ /* backupContext */ ""), /* requestCode */ 0));
+ cardPreference.setSecondaryButtonVisible(true);
+ cardPreference.setSecondaryButtonContentDescription(context.getString(
+ R.string.battery_tip_incompatible_charging_content_description));
+ }
+
+ public static final Creator CREATOR = new Creator() {
+ public BatteryTip createFromParcel(Parcel in) {
+ return new IncompatibleChargerTip(in);
+ }
+
+ public BatteryTip[] newArray(int size) {
+ return new IncompatibleChargerTip[size];
+ }
+ };
+}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/SummaryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/SummaryTip.java
deleted file mode 100644
index 37122d8..0000000
--- a/src/com/android/settings/fuelgauge/batterytip/tips/SummaryTip.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.batterytip.tips;
-
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.R;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-
-/**
- * Tip to show general summary about battery life
- */
-public class SummaryTip extends BatteryTip {
- private long mAverageTimeMs;
-
- public SummaryTip(@StateType int state, long averageTimeMs) {
- super(TipType.SUMMARY, state, true /* showDialog */);
- mAverageTimeMs = averageTimeMs;
- }
-
- @VisibleForTesting
- SummaryTip(Parcel in) {
- super(in);
- mAverageTimeMs = in.readLong();
- }
-
- @Override
- public CharSequence getTitle(Context context) {
- return context.getString(R.string.battery_tip_summary_title);
- }
-
- @Override
- public CharSequence getSummary(Context context) {
- return context.getString(R.string.battery_tip_summary_summary);
- }
-
- @Override
- public int getIconId() {
- return R.drawable.ic_battery_status_good_24dp;
- }
-
- @Override
- public int getIconTintColorId() {
- return R.color.battery_good_color_light;
- }
-
- @Override
- public void updateState(BatteryTip tip) {
- mState = tip.mState;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- dest.writeLong(mAverageTimeMs);
- }
-
- @Override
- public void log(Context context, MetricsFeatureProvider metricsFeatureProvider) {
- metricsFeatureProvider.action(context, SettingsEnums.ACTION_SUMMARY_TIP,
- mState);
- }
-
- public long getAverageTimeMs() {
- return mAverageTimeMs;
- }
-
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
- public BatteryTip createFromParcel(Parcel in) {
- return new SummaryTip(in);
- }
-
- public BatteryTip[] newArray(int size) {
- return new SummaryTip[size];
- }
- };
-}
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 3345426..189b4bc 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -56,6 +56,7 @@
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
+import androidx.window.embedding.ActivityEmbeddingController;
import androidx.window.embedding.SplitController;
import androidx.window.embedding.SplitRule;
@@ -104,7 +105,7 @@
private View mTwoPaneSuggestionView;
private CategoryMixin mCategoryMixin;
private Set<HomepageLoadedListener> mLoadedListeners;
- private SplitController mSplitController;
+ private ActivityEmbeddingController mActivityEmbeddingController;
private boolean mIsEmbeddingActivityEnabled;
private boolean mIsTwoPane;
// A regular layout shows icons on homepage, whereas a simplified layout doesn't.
@@ -192,8 +193,8 @@
setupEdgeToEdge();
setContentView(R.layout.settings_homepage_container);
- mSplitController = SplitController.getInstance();
- mIsTwoPane = mSplitController.isActivityEmbedded(this);
+ mActivityEmbeddingController = ActivityEmbeddingController.getInstance(this);
+ mIsTwoPane = mActivityEmbeddingController.isActivityEmbedded(this);
updateAppBarMinHeight();
initHomepageContainer();
@@ -276,7 +277,7 @@
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
- final boolean newTwoPaneState = mSplitController.isActivityEmbedded(this);
+ final boolean newTwoPaneState = mActivityEmbeddingController.isActivityEmbedded(this);
if (mIsTwoPane != newTwoPaneState) {
mIsTwoPane = newTwoPaneState;
updateHomepageAppBar();
@@ -420,7 +421,7 @@
private boolean shouldLaunchDeepLinkIntentToRight() {
if (!FeatureFlagUtils.isEnabled(this, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN)
- || !SplitController.getInstance().isSplitSupported()) {
+ || !SplitController.getInstance(this).isSplitSupported()) {
return false;
}
@@ -535,15 +536,15 @@
new ComponentName(getApplicationContext(), getClass()),
targetComponentName,
targetIntent.getAction(),
- SplitRule.FINISH_ALWAYS,
- SplitRule.FINISH_ALWAYS,
+ SplitRule.FinishBehavior.ALWAYS,
+ SplitRule.FinishBehavior.ALWAYS,
true /* clearTop */);
ActivityEmbeddingRulesController.registerTwoPanePairRule(this,
new ComponentName(getApplicationContext(), Settings.class),
targetComponentName,
targetIntent.getAction(),
- SplitRule.FINISH_ALWAYS,
- SplitRule.FINISH_ALWAYS,
+ SplitRule.FinishBehavior.ALWAYS,
+ SplitRule.FinishBehavior.ALWAYS,
true /* clearTop */);
final UserHandle user = intent.getParcelableExtra(EXTRA_USER_HANDLE, UserHandle.class);
diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java
index 21f026e..1ced5ac 100644
--- a/src/com/android/settings/homepage/TopLevelSettings.java
+++ b/src/com/android/settings/homepage/TopLevelSettings.java
@@ -36,7 +36,7 @@
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceScreen;
import androidx.recyclerview.widget.RecyclerView;
-import androidx.window.embedding.SplitController;
+import androidx.window.embedding.ActivityEmbeddingController;
import com.android.settings.R;
import com.android.settings.Utils;
@@ -66,6 +66,7 @@
private int mPaddingHorizontal;
private boolean mScrollNeeded = true;
private boolean mFirstStarted = true;
+ private ActivityEmbeddingController mActivityEmbeddingController;
public TopLevelSettings() {
final Bundle args = new Bundle();
@@ -151,7 +152,7 @@
return;
}
- boolean activityEmbedded = SplitController.getInstance().isActivityEmbedded(getActivity());
+ boolean activityEmbedded = isActivityEmbedded();
if (icicle != null) {
mHighlightMixin = icicle.getParcelable(SAVED_HIGHLIGHT_MIXIN);
mScrollNeeded = !mHighlightMixin.isActivityEmbedded() && activityEmbedded;
@@ -162,6 +163,15 @@
}
}
+ /** Wrap ActivityEmbeddingController#isActivityEmbedded for testing. */
+ @VisibleForTesting
+ public boolean isActivityEmbedded() {
+ if (mActivityEmbeddingController == null) {
+ mActivityEmbeddingController = ActivityEmbeddingController.getInstance(getActivity());
+ }
+ return mActivityEmbeddingController.isActivityEmbedded(getActivity());
+ }
+
@Override
public void onStart() {
if (mFirstStarted) {
@@ -169,7 +179,7 @@
FeatureFactory.getFactory(getContext()).getSearchFeatureProvider().sendPreIndexIntent(
getContext());
} else if (mIsEmbeddingActivityEnabled && isOnlyOneActivityInTask()
- && !SplitController.getInstance().isActivityEmbedded(getActivity())) {
+ && !isActivityEmbedded()) {
// Set default highlight menu key for 1-pane homepage since it will show the placeholder
// page once changing back to 2-pane.
Log.i(TAG, "Set default menu key");
@@ -294,7 +304,7 @@
* 3. the current activity is embedded */
return mHighlightMixin != null
&& TextUtils.equals(pref.getKey(), mHighlightMixin.getHighlightPreferenceKey())
- && SplitController.getInstance().isActivityEmbedded(getActivity());
+ && isActivityEmbedded();
}
/** Show/hide the highlight on the menu entry for the search page presence */
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index a2ade47..e285a91 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -1098,10 +1098,13 @@
.launch();
}
- /** Removes all preferences and hide the {@link #mConnectedWifiEntryPreferenceCategory}. */
+ /** Removes all preferences and hide the {@link #mConnectedWifiEntryPreferenceCategory} and
+ * {@link #mFirstWifiEntryPreferenceCategory}. */
private void removeConnectedWifiEntryPreference() {
mConnectedWifiEntryPreferenceCategory.removeAll();
mConnectedWifiEntryPreferenceCategory.setVisible(false);
+ mFirstWifiEntryPreferenceCategory.setVisible(false);
+ mFirstWifiEntryPreferenceCategory.removeAll();
}
private void removeWifiEntryPreference() {
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
index 7feb2b1..7787ae1 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
@@ -25,6 +25,7 @@
import android.app.Dialog;
import android.app.KeyguardManager;
import android.app.admin.DevicePolicyManager;
+import android.app.admin.ManagedSubscriptionsPolicy;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
@@ -34,6 +35,7 @@
import android.os.Handler;
import android.os.UserHandle;
import android.os.UserManager;
+import android.telecom.TelecomManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@@ -139,6 +141,31 @@
getActivity().finish();
});
setupForgotButtonIfManagedProfile(view);
+ setupEmergencyCallButtonIfManagedSubscription(view);
+ }
+
+ private void setupEmergencyCallButtonIfManagedSubscription(View view) {
+ int policyType = getContext().getSystemService(
+ DevicePolicyManager.class).getManagedSubscriptionsPolicy().getPolicyType();
+
+ if (policyType == ManagedSubscriptionsPolicy.TYPE_ALL_MANAGED_SUBSCRIPTIONS) {
+ Button emergencyCallButton = view.findViewById(R.id.emergencyCallButton);
+ if (emergencyCallButton == null) {
+ Log.wtf(TAG,
+ "Emergency call button not found in managed profile credential dialog");
+ return;
+ }
+ emergencyCallButton.setVisibility(View.VISIBLE);
+ emergencyCallButton.setOnClickListener(v -> {
+ final Intent intent = getActivity()
+ .getSystemService(TelecomManager.class)
+ .createLaunchEmergencyDialerIntent(null)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ getActivity().startActivity(intent);
+ getActivity().finish();
+ });
+ }
}
private void setupForgotButtonIfManagedProfile(View view) {
diff --git a/src/com/android/settings/security/MemtagHelper.java b/src/com/android/settings/security/MemtagHelper.java
index b3e24e4..9fd74f3 100644
--- a/src/com/android/settings/security/MemtagHelper.java
+++ b/src/com/android/settings/security/MemtagHelper.java
@@ -29,14 +29,14 @@
return "force_off"
.equals(
SystemProperties.get(
- "persist.device_config.memory_safety_native.bootloader_override"));
+ "persist.device_config.memory_safety_native_boot.bootloader_override"));
}
private static boolean isForcedOn() {
return "force_on"
.equals(
SystemProperties.get(
- "persist.device_config.memory_safety_native.bootloader_override"));
+ "persist.device_config.memory_safety_native_boot.bootloader_override"));
}
public static boolean isChecked() {
diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
index 3cc7ef2..8084a48 100644
--- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
+++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
@@ -30,7 +30,7 @@
import androidx.preference.PreferenceGroupAdapter;
import androidx.preference.PreferenceViewHolder;
import androidx.recyclerview.widget.RecyclerView;
-import androidx.window.embedding.SplitController;
+import androidx.window.embedding.ActivityEmbeddingController;
import com.android.settings.R;
import com.android.settings.Utils;
@@ -250,6 +250,7 @@
}
private boolean isHighlightNeeded() {
- return SplitController.getInstance().isActivityEmbedded(mHomepageActivity);
+ return ActivityEmbeddingController.getInstance(mHomepageActivity)
+ .isActivityEmbedded(mHomepageActivity);
}
}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
index 88c9597..4ba6eae 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -564,8 +564,10 @@
mActivityInfo.metaData.putString("com.android.settings.intent.action", "TestAction");
tile.userHandle = null;
- TopLevelSettings largeScreenTopLevelSettings = new TopLevelSettings(
- new TestTopLevelHighlightMixin(highlightMixinPrefKey, true /* activityEmbedded */));
+ TopLevelSettings largeScreenTopLevelSettings = spy(new TopLevelSettings(
+ new TestTopLevelHighlightMixin(highlightMixinPrefKey,
+ true /* activityEmbedded */)));
+ doReturn(true).when(largeScreenTopLevelSettings).isActivityEmbedded();
largeScreenTopLevelSettings.setHighlightPreferenceKey(clickPrefKey);
mImpl.bindPreferenceToTileAndGetObservers(activity, largeScreenTopLevelSettings,
@@ -593,8 +595,10 @@
mActivityInfo.metaData.putString("com.android.settings.intent.action", "TestAction");
tile.userHandle = null;
- TopLevelSettings largeScreenTopLevelSettings = new TopLevelSettings(
- new TestTopLevelHighlightMixin(highlightMixinPrefKey, true /* activityEmbedded */));
+ TopLevelSettings largeScreenTopLevelSettings = spy(new TopLevelSettings(
+ new TestTopLevelHighlightMixin(highlightMixinPrefKey,
+ true /* activityEmbedded */)));
+ doReturn(true).when(largeScreenTopLevelSettings).isActivityEmbedded();
largeScreenTopLevelSettings.setHighlightPreferenceKey(clickPrefKey);
mImpl.bindPreferenceToTileAndGetObservers(activity, largeScreenTopLevelSettings,
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
index c5d66a6..1aefd14 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java
@@ -35,7 +35,6 @@
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
-import com.android.settings.fuelgauge.batterytip.tips.SummaryTip;
import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
@@ -74,7 +73,6 @@
private RestrictAppTip mRestrictedOneAppTip;
private RestrictAppTip mRestrictTwoAppsTip;
private UnrestrictAppTip mUnrestrictAppTip;
- private SummaryTip mSummaryTip;
private BatteryDefenderTip mDefenderTip;
private AppInfo mAppInfo;
private ShadowPackageManager mPackageManager;
@@ -116,8 +114,6 @@
new ArrayList<>(restrictApps));
mUnrestrictAppTip = new UnrestrictAppTip(BatteryTip.StateType.NEW, mAppInfo);
- mSummaryTip = spy(new SummaryTip(BatteryTip.StateType.NEW,
- EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN));
mDefenderTip = new BatteryDefenderTip(BatteryTip.StateType.NEW);
}
@@ -229,19 +225,4 @@
assertThat(shadowDialog.getMessage())
.isEqualTo(mContext.getString(R.string.battery_tip_unrestrict_app_dialog_message));
}
-
- @Test
- public void testOnCreateDialog_summaryTip_fireDialog() {
- doReturn(AVERAGE_TIME_MS).when(mSummaryTip).getAverageTimeMs();
- mDialogFragment = BatteryTipDialogFragment.newInstance(mSummaryTip, METRICS_KEY);
-
- FragmentController.setupFragment(mDialogFragment, FragmentActivity.class,
- 0 /* containerViewId */, null /* bundle */);
-
- final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
- ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
-
- assertThat(shadowDialog.getMessage()).isEqualTo(
- mContext.getText(R.string.battery_tip_dialog_summary_message));
- }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
index dbde3a7..1c1d2cc 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
@@ -37,7 +37,6 @@
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
-import com.android.settings.fuelgauge.batterytip.tips.SummaryTip;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.widget.CardPreference;
@@ -88,9 +87,7 @@
mFeatureFactory = FakeFeatureFactory.setupForTest();
mOldBatteryTips = new ArrayList<>();
- mOldBatteryTips.add(new SummaryTip(BatteryTip.StateType.NEW, AVERAGE_TIME_MS));
mNewBatteryTips = new ArrayList<>();
- mNewBatteryTips.add(new SummaryTip(BatteryTip.StateType.INVISIBLE, AVERAGE_TIME_MS));
mBatteryTipPreferenceController = buildBatteryTipPreferenceController();
mBatteryTipPreferenceController.mCardPreference = mCardPreference;
@@ -105,13 +102,6 @@
}
@Test
- public void testUpdateBatteryTips_tipsStateNew_isVisible() {
- mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips);
-
- assertThat(mCardPreference.isVisible()).isTrue();
- }
-
- @Test
public void testUpdateBatteryTips_tipsStateInvisible_isInvisible() {
mBatteryTipPreferenceController.updateBatteryTips(mNewBatteryTips);
@@ -119,15 +109,6 @@
}
@Test
- public void testUpdateBatteryTips_logBatteryTip() {
- mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips);
-
- verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
- MetricsProto.MetricsEvent.ACTION_SUMMARY_TIP,
- BatteryTip.StateType.NEW);
- }
-
- @Test
public void testGetCurrentBatteryTip_noTips_isNull() {
assertThat(mBatteryTipPreferenceController.getCurrentBatteryTip()).isNull();
}
@@ -139,28 +120,6 @@
}
@Test
- public void testGetCurrentBatteryTip_tipsVisible_returnTips() {
- mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips);
-
- assertThat(mBatteryTipPreferenceController.getCurrentBatteryTip().getType()).isEqualTo(
- BatteryTip.TipType.SUMMARY);
- }
-
- @Test
- public void testSaveAndRestore() {
- mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips);
- final Bundle bundle = new Bundle();
- mBatteryTipPreferenceController.saveInstanceState(bundle);
-
- final BatteryTipPreferenceController controller = buildBatteryTipPreferenceController();
- controller.mCardPreference = mCardPreference;
- controller.mPrefContext = mContext;
- controller.restoreInstanceState(bundle);
-
- assertOnlyContainsSummaryTip(mCardPreference);
- }
-
- @Test
public void testRestoreFromNull_shouldNotCrash() {
final Bundle bundle = new Bundle();
// Battery tip list is null at this time
@@ -192,13 +151,6 @@
BasePreferenceController.AVAILABLE_UNSEARCHABLE);
}
- private void assertOnlyContainsSummaryTip(CardPreference preference) {
- assertThat(preference.getTitle()).isEqualTo(
- mContext.getString(R.string.battery_tip_summary_title));
- assertThat(preference.getSummary()).isEqualTo(
- mContext.getString(R.string.battery_tip_summary_summary));
- }
-
private BatteryTipPreferenceController buildBatteryTipPreferenceController() {
final BatteryTipPreferenceController controller = new BatteryTipPreferenceController(
mContext, KEY_PREF);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java
deleted file mode 100644
index f68a0b4..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java
+++ /dev/null
@@ -1,208 +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.fuelgauge.batterytip.detectors;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.spy;
-
-import android.app.AppOpsManager;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-
-import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
-import com.android.settings.fuelgauge.batterytip.AppInfo;
-import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
-import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
-import com.android.settings.fuelgauge.batterytip.tips.AppLabelPredicate;
-import com.android.settings.fuelgauge.batterytip.tips.AppRestrictionPredicate;
-import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
-import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
-import com.android.settings.testutils.BatteryTestUtils;
-import com.android.settings.testutils.DatabaseTestUtils;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.robolectric.util.ReflectionHelpers;
-
-@RunWith(RobolectricTestRunner.class)
-public class RestrictAppDetectorTest {
-
- private static final int RESTRICTED_UID = 222;
- private static final int UNRESTRICTED_UID = 333;
- private static final String PACKAGE_NAME = "com.android.app";
- private static final String UNINSTALLED_PACKAGE_NAME = "com.android.uninstalled";
- private static final String RESTRICTED_PACKAGE_NAME = "com.android.restricted";
- private static final String UNRESTRICTED_PACKAGE_NAME = "com.android.unrestricted";
- private Context mContext;
- private BatteryTipPolicy mPolicy;
- private RestrictAppDetector mRestrictAppDetector;
- private List<AppInfo> mAppInfoList;
- private AppInfo mAppInfo;
- @Mock
- private BatteryDatabaseManager mBatteryDatabaseManager;
- @Mock
- private PackageManager mPackageManager;
- @Mock
- private ApplicationInfo mApplicationInfo;
- @Mock
- private AppOpsManager mAppOpsManager;
-
- @Before
- public void setUp() throws PackageManager.NameNotFoundException {
- MockitoAnnotations.initMocks(this);
-
- mAppInfoList = new ArrayList<>();
- mAppInfo = new AppInfo.Builder().setPackageName(PACKAGE_NAME).build();
- mAppInfoList.add(mAppInfo);
-
- mContext = spy(RuntimeEnvironment.application);
- mPolicy = spy(new BatteryTipPolicy(mContext));
-
- doReturn(mContext).when(mContext).getApplicationContext();
- doReturn(mAppOpsManager).when(mContext).getSystemService(AppOpsManager.class);
- doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManager).checkOpNoThrow(
- AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, RESTRICTED_UID, RESTRICTED_PACKAGE_NAME);
- doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager).checkOpNoThrow(
- AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UNRESTRICTED_UID,
- UNRESTRICTED_PACKAGE_NAME);
-
- BatteryDatabaseManager.setUpForTest(mBatteryDatabaseManager);
- doReturn(mPackageManager).when(mContext).getPackageManager();
- doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(any(),
- anyInt());
- doReturn(PACKAGE_NAME).when(mApplicationInfo).loadLabel(any());
- doThrow(new PackageManager.NameNotFoundException()).when(
- mPackageManager).getApplicationInfo(eq(UNINSTALLED_PACKAGE_NAME), anyInt());
-
- mRestrictAppDetector = new RestrictAppDetector(mContext, mPolicy);
- mRestrictAppDetector.mBatteryDatabaseManager = mBatteryDatabaseManager;
- }
-
- @After
- public void tearDown() {
- ReflectionHelpers.setStaticField(AppLabelPredicate.class, "sInstance", null);
- ReflectionHelpers.setStaticField(AppRestrictionPredicate.class, "sInstance", null);
- }
-
- @After
- public void cleanUp() {
- DatabaseTestUtils.clearDb(mContext);
- }
-
- @Test
- public void testDetect_hasAnomaly_tipNew() {
- doReturn(mAppInfoList).when(mBatteryDatabaseManager)
- .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
-
- assertThat(mRestrictAppDetector.detect().getState()).isEqualTo(BatteryTip.StateType.NEW);
- }
-
- @Test
- public void testDetect_hasAutoHandledAnomaly_tipHandled() {
- mAppInfoList.add(new AppInfo.Builder()
- .setUid(RESTRICTED_UID)
- .setPackageName(RESTRICTED_PACKAGE_NAME)
- .build());
- doReturn(new ArrayList<AppInfo>()).when(mBatteryDatabaseManager)
- .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
- doReturn(mAppInfoList).when(mBatteryDatabaseManager)
- .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.AUTO_HANDLED));
-
- assertThat(mRestrictAppDetector.detect().getState())
- .isEqualTo(BatteryTip.StateType.HANDLED);
- }
-
- @Test
- public void testDetect_typeNewHasUninstalledAnomaly_removeIt() {
- mAppInfoList.add(new AppInfo.Builder()
- .setPackageName(UNINSTALLED_PACKAGE_NAME)
- .build());
- doReturn(mAppInfoList).when(mBatteryDatabaseManager)
- .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
-
- final RestrictAppTip restrictAppTip = (RestrictAppTip) mRestrictAppDetector.detect();
- assertThat(restrictAppTip.getState()).isEqualTo(BatteryTip.StateType.NEW);
- assertThat(restrictAppTip.getRestrictAppList()).containsExactly(mAppInfo);
- }
-
- @Test
- public void testDetect_typeNewHasRestrictedAnomaly_removeIt() throws
- PackageManager.NameNotFoundException {
- mAppInfoList.add(new AppInfo.Builder()
- .setUid(RESTRICTED_UID)
- .setPackageName(RESTRICTED_PACKAGE_NAME)
- .build());
- doReturn(mAppInfoList).when(mBatteryDatabaseManager)
- .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
- doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(
- eq(RESTRICTED_PACKAGE_NAME), anyInt());
-
- final RestrictAppTip restrictAppTip = (RestrictAppTip) mRestrictAppDetector.detect();
- assertThat(restrictAppTip.getState()).isEqualTo(BatteryTip.StateType.NEW);
- assertThat(restrictAppTip.getRestrictAppList()).containsExactly(mAppInfo);
- }
-
- @Test
- public void testDetect_typeHandledHasUnRestrictedAnomaly_removeIt() throws
- PackageManager.NameNotFoundException {
- mAppInfoList.clear();
- mAppInfoList.add(new AppInfo.Builder()
- .setUid(UNRESTRICTED_UID)
- .setPackageName(UNRESTRICTED_PACKAGE_NAME)
- .build());
- doReturn(new ArrayList<>()).when(mBatteryDatabaseManager)
- .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
- doReturn(mAppInfoList).when(mBatteryDatabaseManager)
- .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.AUTO_HANDLED));
- doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(
- eq(UNRESTRICTED_PACKAGE_NAME), anyInt());
-
- final RestrictAppTip restrictAppTip = (RestrictAppTip) mRestrictAppDetector.detect();
- assertThat(restrictAppTip.getState()).isEqualTo(BatteryTip.StateType.INVISIBLE);
- }
-
- @Test
- public void testDetect_noAnomaly_tipInvisible() {
- doReturn(new ArrayList<AppInfo>()).when(mBatteryDatabaseManager)
- .queryAllAnomalies(anyLong(), anyInt());
-
- assertThat(mRestrictAppDetector.detect().getState())
- .isEqualTo(BatteryTip.StateType.INVISIBLE);
- }
-
- @Test
- public void testUseFakeData_alwaysFalse() {
- assertThat(RestrictAppDetector.USE_FAKE_DATA).isFalse();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetectorTest.java
deleted file mode 100644
index 5794b6c..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetectorTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge.batterytip.detectors;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-
-import android.text.format.DateUtils;
-
-import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.util.ReflectionHelpers;
-
-@RunWith(RobolectricTestRunner.class)
-public class SummaryDetectorTest {
-
- private BatteryTipPolicy mPolicy;
- private static final long AVERAGE_TIME_MS = DateUtils.HOUR_IN_MILLIS;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mPolicy = spy(new BatteryTipPolicy(RuntimeEnvironment.application));
- }
-
- @Test
- public void testDetect_disabledByPolicy_tipInvisible() {
- ReflectionHelpers.setField(mPolicy, "summaryEnabled", false);
- SummaryDetector detector = new SummaryDetector(mPolicy, AVERAGE_TIME_MS);
-
- assertThat(detector.detect().isVisible()).isFalse();
- }
-
- @Test
- public void testDetect_notDisabled_tipInvisible() {
- SummaryDetector detector = new SummaryDetector(mPolicy, AVERAGE_TIME_MS);
-
- assertThat(detector.detect().isVisible()).isFalse();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java
new file mode 100644
index 0000000..ce70f50
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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.fuelgauge.batterytip.tips;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.widget.CardPreference;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
+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.shadows.ShadowLog;
+
+@RunWith(RobolectricTestRunner.class)
+public final class IncompatibleChargerTipTest {
+
+ private Context mContext;
+ private FakeFeatureFactory mFeatureFactory;
+ private IncompatibleChargerTip mIncompatibleChargerTip;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+
+ @Mock private BatteryTip mBatteryTip;
+ @Mock private Preference mPreference;
+ @Mock private CardPreference mCardPreference;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
+ mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
+ mContext = RuntimeEnvironment.application;
+ mIncompatibleChargerTip = new IncompatibleChargerTip(BatteryTip.StateType.NEW);
+
+ when(mPreference.getContext()).thenReturn(mContext);
+ when(mCardPreference.getContext()).thenReturn(mContext);
+ }
+
+ @Test
+ public void getTitle_showTitle() {
+ assertThat(mIncompatibleChargerTip.getTitle(mContext)).isEqualTo(
+ mContext.getString(R.string.battery_tip_incompatible_charging_title));
+ }
+
+ @Test
+ public void getSummary_showSummary() {
+ assertThat(mIncompatibleChargerTip.getSummary(mContext)).isEqualTo(
+ mContext.getString(R.string.battery_tip_incompatible_charging_message));
+ }
+
+ @Test
+ public void getIcon_showIcon() {
+ assertThat(mIncompatibleChargerTip.getIconId())
+ .isEqualTo(R.drawable.ic_battery_charging);
+ }
+
+ @Test
+ public void testLog_logMetric() {
+ mIncompatibleChargerTip.updateState(mBatteryTip);
+ mIncompatibleChargerTip.log(mContext, mMetricsFeatureProvider);
+
+ verify(mMetricsFeatureProvider).action(mContext,
+ SettingsEnums.ACTION_INCOMPATIBLE_CHARGING_TIP, mBatteryTip.mState);
+ }
+
+ @Test
+ public void updatePreference_castFail_logErrorMessage() {
+ mIncompatibleChargerTip.updatePreference(mPreference);
+ assertThat(getLastErrorLog()).isEqualTo("cast Preference to CardPreference failed");
+ }
+
+ @Test
+ public void updatePreference_shouldSetSecondaryButtonText() {
+ String expected = mContext.getString(R.string.learn_more);
+
+ mIncompatibleChargerTip.updatePreference(mCardPreference);
+
+ verify(mCardPreference).setSecondaryButtonText(expected);
+ }
+
+ @Test
+ public void updatePreference_shouldSetSecondaryButtonVisible() {
+ mIncompatibleChargerTip.updatePreference(mCardPreference);
+ verify(mCardPreference).setSecondaryButtonVisible(true);
+ }
+
+ private String getLastErrorLog() {
+ return ShadowLog.getLogsForTag(IncompatibleChargerTip.class.getSimpleName()).stream()
+ .filter(log -> log.type == Log.ERROR)
+ .reduce((first, second) -> second)
+ .orElse(createErrorLog("No Error Log"))
+ .msg;
+ }
+
+ private ShadowLog.LogItem createErrorLog(String msg) {
+ return new ShadowLog.LogItem(Log.ERROR, "tag", msg, null);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/SummaryTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/SummaryTipTest.java
deleted file mode 100644
index f751b29..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/SummaryTipTest.java
+++ /dev/null
@@ -1,73 +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.fuelgauge.batterytip.tips;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.os.Parcel;
-import android.text.format.DateUtils;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-
-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;
-
-@RunWith(RobolectricTestRunner.class)
-public class SummaryTipTest {
-
- private static final long AVERAGE_TIME_MS = DateUtils.HOUR_IN_MILLIS;
-
- @Mock
- private MetricsFeatureProvider mMetricsFeatureProvider;
- private Context mContext;
- private SummaryTip mSummaryTip;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = RuntimeEnvironment.application;
- mSummaryTip = new SummaryTip(BatteryTip.StateType.NEW, AVERAGE_TIME_MS);
- }
-
- @Test
- public void testParcelable() {
- Parcel parcel = Parcel.obtain();
- mSummaryTip.writeToParcel(parcel, mSummaryTip.describeContents());
- parcel.setDataPosition(0);
-
- final SummaryTip parcelTip = new SummaryTip(parcel);
-
- assertThat(parcelTip.getAverageTimeMs()).isEqualTo(AVERAGE_TIME_MS);
- }
-
- @Test
- public void testLog() {
- mSummaryTip.log(mContext, mMetricsFeatureProvider);
-
- verify(mMetricsFeatureProvider).action(mContext,
- MetricsProto.MetricsEvent.ACTION_SUMMARY_TIP, BatteryTip.StateType.NEW);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/security/MemtagHelperTest.java b/tests/robotests/src/com/android/settings/security/MemtagHelperTest.java
index 2b9ecf7..3d38bbc 100644
--- a/tests/robotests/src/com/android/settings/security/MemtagHelperTest.java
+++ b/tests/robotests/src/com/android/settings/security/MemtagHelperTest.java
@@ -34,7 +34,7 @@
private final String mMemtagProperty = "arm64.memtag.bootctl";
private final String mMemtagSupportedProperty = "ro.arm64.memtag.bootctl_settings_toggle";
private final String mDeviceConfigOverride =
- "persist.device_config.memory_safety_native.bootloader_override";
+ "persist.device_config.memory_safety_native_boot.bootloader_override";
@Test
public void isChecked_empty_isFalse() {
diff --git a/tests/unit/src/com/android/settings/display/ScreenResolutionControllerTest.java b/tests/unit/src/com/android/settings/display/ScreenResolutionControllerTest.java
index a32904e..b5df3a2 100644
--- a/tests/unit/src/com/android/settings/display/ScreenResolutionControllerTest.java
+++ b/tests/unit/src/com/android/settings/display/ScreenResolutionControllerTest.java
@@ -35,22 +35,23 @@
@RunWith(AndroidJUnit4.class)
public class ScreenResolutionControllerTest {
-
- private static final int FHD_WIDTH = 1080;
- private static final int QHD_WIDTH = 1440;
-
private ScreenResolutionController mController;
+ private int mHighWidth;
+ private int mFullWidth;
@Before
public void setUp() {
Context context = spy(ApplicationProvider.getApplicationContext());
mController = spy(new ScreenResolutionController(context, "test"));
+
+ mHighWidth = mController.getHighWidth();
+ mFullWidth = mController.getFullWidth();
}
@Test
public void getAvailabilityStatus_hasFhdAndQhdModes_returnAvailable() {
- Display.Mode modeA = new Display.Mode(0, FHD_WIDTH, 0, 0);
- Display.Mode modeB = new Display.Mode(0, QHD_WIDTH, 0, 0);
+ Display.Mode modeA = new Display.Mode(0, mHighWidth, 0, 0);
+ Display.Mode modeB = new Display.Mode(0, mFullWidth, 0, 0);
Display.Mode[] modes = {modeA, modeB};
doReturn(modes).when(mController).getSupportedModes();
@@ -60,27 +61,25 @@
@Test
public void getAvailabilityStatus_hasOneMode_returnUnsupported() {
- Display.Mode modeA = new Display.Mode(0, FHD_WIDTH, 0, 0);
- Display.Mode[] modes = {modeA};
- doReturn(modes).when(mController).getSupportedModes();
+ doReturn(0).when(mController).getHighWidth();
assertThat(mController.getAvailabilityStatus())
.isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
}
@Test
- public void updateState_screenResolutionFHD_shouldSetSummaryToFHD() {
- int width = FHD_WIDTH;
+ public void updateState_HighResolution_shouldSetSummaryToHighResolution() {
+ int width = mHighWidth;
doReturn(width).when(mController).getDisplayWidth();
- assertThat(mController.getSummary().toString()).isEqualTo("1080p FHD+");
+ assertThat(mController.getSummary().toString()).isEqualTo("High resolution");
}
@Test
- public void updateState_screenResolutionQHD_shouldSetSummaryToQHD() {
- int width = QHD_WIDTH;
+ public void updateState_FullResolution_shouldSetSummaryToFullResolution() {
+ int width = mFullWidth;
doReturn(width).when(mController).getDisplayWidth();
- assertThat(mController.getSummary().toString()).isEqualTo("1440p QHD+");
+ assertThat(mController.getSummary().toString()).isEqualTo("Full resolution");
}
}
diff --git a/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java b/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java
index 4e674d2..8409531 100644
--- a/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java
+++ b/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java
@@ -37,59 +37,62 @@
private Context mContext;
private ScreenResolutionFragment mFragment;
-
- private static final int FHD_WIDTH = 1080;
- private static final int QHD_WIDTH = 1440;
+ private ScreenResolutionController mController;
+ private int mHighWidth;
+ private int mFullWidth;
@Before
@UiThreadTest
public void setup() {
mContext = spy(ApplicationProvider.getApplicationContext());
mFragment = spy(new ScreenResolutionFragment());
+ mController = spy(new ScreenResolutionController(mContext, "test"));
+ mHighWidth = mController.getHighWidth();
+ mFullWidth = mController.getFullWidth();
}
@Test
@UiThreadTest
- public void getDefaultKey_FHD() {
- Display.Mode mode = new Display.Mode(0, FHD_WIDTH, 0, 0);
+ public void getDefaultKey_highResolution() {
+ Display.Mode mode = new Display.Mode(0, mHighWidth, 0, 0);
doReturn(mode).when(mFragment).getDisplayMode();
doReturn(mContext).when(mFragment).getContext();
mFragment.onAttach(mContext);
- assertThat(mFragment.getDefaultKey()).isEqualTo(mFragment.getKeyForResolution(FHD_WIDTH));
+ assertThat(mFragment.getDefaultKey()).isEqualTo(mFragment.getKeyForResolution(mHighWidth));
}
@Test
@UiThreadTest
- public void getDefaultKey_QHD() {
- Display.Mode mode = new Display.Mode(0, QHD_WIDTH, 0, 0);
+ public void getDefaultKey_fullResolution() {
+ Display.Mode mode = new Display.Mode(0, mFullWidth, 0, 0);
doReturn(mode).when(mFragment).getDisplayMode();
doReturn(mContext).when(mFragment).getContext();
mFragment.onAttach(mContext);
- assertThat(mFragment.getDefaultKey()).isEqualTo(mFragment.getKeyForResolution(QHD_WIDTH));
+ assertThat(mFragment.getDefaultKey()).isEqualTo(mFragment.getKeyForResolution(mFullWidth));
}
@Test
@UiThreadTest
- public void setDefaultKey_FHD() {
+ public void setDefaultKey_highResolution() {
doReturn(mContext).when(mFragment).getContext();
mFragment.onAttach(mContext);
- mFragment.setDefaultKey(mFragment.getKeyForResolution(FHD_WIDTH));
+ mFragment.setDefaultKey(mFragment.getKeyForResolution(mHighWidth));
- verify(mFragment).setDisplayMode(FHD_WIDTH);
+ verify(mFragment).setDisplayMode(mHighWidth);
}
@Test
@UiThreadTest
- public void setDefaultKey_QHD() {
+ public void setDefaultKey_fullResolution() {
doReturn(mContext).when(mFragment).getContext();
mFragment.onAttach(mContext);
- mFragment.setDefaultKey(mFragment.getKeyForResolution(QHD_WIDTH));
+ mFragment.setDefaultKey(mFragment.getKeyForResolution(mFullWidth));
- verify(mFragment).setDisplayMode(QHD_WIDTH);
+ verify(mFragment).setDisplayMode(mFullWidth);
}
@Test