Merge "[Provider Model] Fix the "Cancel" button issue in the reminder dialog" into sc-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index aa2a142..60dbb24 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1323,7 +1323,8 @@
<activity
android:name=".notification.history.NotificationHistoryActivity"
android:exported="true"
- android:label="@string/notification_history_title">
+ android:label="@string/notification_history_title"
+ android:theme="@style/Theme.Settings.NoActionBar">
<intent-filter android:priority="1">
<action android:name="android.settings.NOTIFICATION_HISTORY" />
<category android:name="android.intent.category.DEFAULT" />
@@ -1517,7 +1518,8 @@
<activity android:name=".applications.specialaccess.deviceadmin.DeviceAdminAdd"
android:label="@string/device_admin_add_title"
android:exported="true"
- android:clearTaskOnLaunch="true">
+ android:clearTaskOnLaunch="true"
+ android:theme="@style/Theme.Settings.NoActionBar">
<intent-filter>
<action android:name="android.app.action.ADD_DEVICE_ADMIN" />
<category android:name="android.intent.category.DEFAULT" />
diff --git a/res/drawable/ic_power_settings.xml b/res/drawable/ic_power_settings.xml
deleted file mode 100644
index b56e332..0000000
--- a/res/drawable/ic_power_settings.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
- Copyright (C) 2021 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.
--->
-
-<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:pathData="M11,2h2v10h-2zM18.37,5.64l-1.41,1.41c2.73,2.73 2.72,7.16 -0.01,9.89 -2.73,2.73 -7.17,2.73 -9.89,0.01 -2.73,-2.73 -2.74,-7.18 -0.01,-9.91l-1.41,-1.4c-3.51,3.51 -3.51,9.21 0.01,12.73 3.51,3.51 9.21,3.51 12.72,-0.01 3.51,-3.51 3.51,-9.2 0,-12.72z"
- android:fillColor="@android:color/white"/>
-</vector>
\ No newline at end of file
diff --git a/res/layout/main_clear.xml b/res/layout/main_clear.xml
index cbccb0a..a2464e2 100644
--- a/res/layout/main_clear.xml
+++ b/res/layout/main_clear.xml
@@ -27,40 +27,39 @@
<ScrollView
android:id="@+id/main_clear_scrollview"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginStart="@dimen/reset_main_clear_margin_start"
- android:layout_marginEnd="@dimen/reset_main_clear_margin_end">
+ android:layout_height="match_parent">
<LinearLayout
android:id="@+id/main_clear_container"
style="@style/SudContentFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
android:orientation="vertical">
<TextView
- style="@style/TextAppearance.SudGlifItemSummary"
+ style="@style/TextAppearance.PreferenceTitle.SettingsLib"
android:id="@+id/sud_layout_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/main_clear_desc"/>
<TextView
android:id="@+id/also_erases_external"
- style="@style/TextAppearance.SudGlifItemSummary"
+ style="@style/TextAppearance.PreferenceTitle.SettingsLib"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="@string/main_clear_desc_also_erases_external"/>
<TextView
android:id="@+id/also_erases_esim"
- style="@style/TextAppearance.SudGlifItemSummary"
+ style="@style/TextAppearance.PreferenceTitle.SettingsLib"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="@string/main_clear_desc_also_erases_esim"/>
<TextView
android:id="@+id/accounts_label"
- style="@style/TextAppearance.SudGlifItemSummary"
+ style="@style/TextAppearance.PreferenceTitle.SettingsLib"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
@@ -76,21 +75,21 @@
</LinearLayout>
<TextView
android:id="@+id/other_users_present"
- style="@style/TextAppearance.SudGlifItemSummary"
+ style="@style/TextAppearance.PreferenceTitle.SettingsLib"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="@string/main_clear_other_users_present"/>
<TextView
android:id="@+id/no_cancel_mobile_plan"
- style="@style/TextAppearance.SudGlifItemSummary"
+ style="@style/TextAppearance.PreferenceTitle.SettingsLib"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="@string/main_clear_desc_no_cancel_mobile_plan"/>
<TextView
android:id="@+id/erase_external_option_text"
- style="@style/TextAppearance.SudGlifItemSummary"
+ style="@style/TextAppearance.PreferenceTitle.SettingsLib"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/main_clear_desc_erase_external_storage"/>
@@ -116,12 +115,12 @@
android:layout_gravity="center_vertical"
android:orientation="vertical">
<TextView
- style="@style/TextAppearance.SudGlifItemTitle"
+ style="@style/TextAppearance.PreferenceTitle.SettingsLib"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/erase_external_storage"/>
<TextView
- style="@style/TextAppearance.SudGlifItemSummary"
+ style="?android:attr/textAppearanceListItemSecondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/erase_external_storage_description"/>
diff --git a/res/layout/main_clear_account.xml b/res/layout/main_clear_account.xml
index f95a44f..6dbf4d8 100644
--- a/res/layout/main_clear_account.xml
+++ b/res/layout/main_clear_account.xml
@@ -4,9 +4,9 @@
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.
@@ -30,6 +30,6 @@
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- style="@style/TextAppearance.SudGlifItemSummary"/>
+ style="@style/TextAppearance.PreferenceTitle.SettingsLib"/>
</LinearLayout>
diff --git a/res/layout/main_clear_confirm.xml b/res/layout/main_clear_confirm.xml
index 914a998..c5601c7 100644
--- a/res/layout/main_clear_confirm.xml
+++ b/res/layout/main_clear_confirm.xml
@@ -31,7 +31,7 @@
<TextView
android:id="@+id/sud_layout_description"
- style="@style/SudItemTitle.GlifDescription"
+ style="@style/TextAppearance.PreferenceTitle.SettingsLib"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/main_clear_final_desc"/>
diff --git a/res/layout/preference_widget_main_switch.xml b/res/layout/preference_widget_main_switch.xml
index a02ed43..a01105f 100644
--- a/res/layout/preference_widget_main_switch.xml
+++ b/res/layout/preference_widget_main_switch.xml
@@ -15,10 +15,11 @@
limitations under the License.
-->
-<LinearLayout
+<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="wrap_content">
+ android:layout_height="wrap_content"
+ android:importantForAccessibility="no">
<com.android.settings.widget.SettingsMainSwitchBar
android:id="@+id/main_switch_bar"
@@ -26,4 +27,4 @@
android:layout_height="wrap_content"
android:layout_width="match_parent" />
-</LinearLayout>
+</FrameLayout>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 908b640..fe0ada0 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -327,8 +327,6 @@
<!-- Margin for the reset screens -->
<dimen name="reset_network_margin_start">72dp</dimen>
<dimen name="reset_network_margin_end">12dp</dimen>
- <dimen name="reset_main_clear_margin_start">32dp</dimen>
- <dimen name="reset_main_clear_margin_end">12dp</dimen>
<dimen name="reset_button_margin_end">20dp</dimen>
<!-- Padding for the reset screens -->
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2ddbae3..aeaea61 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -13203,23 +13203,29 @@
<string name="cards_passes_lower">cards & passes</string>
<!-- Power menu setting name [CHAR LIMIT=NONE] -->
- <string name="power_menu_setting_name">Power menu</string>
+ <string name="power_menu_setting_name">Press and hold power button</string>
- <!-- Power menu setting title [CHAR LIMIT=NONE] -->
- <string name="power_menu_setting_title">Power button menu</string>
-
- <!-- Power menu setting option none [CHAR LIMIT=NONE] -->
- <string name="power_menu_none">Don\u2019t show any content</string>
+ <!-- Power menu setting summary to describe press and hold power button for Assistant is enabled. [CHAR LIMIT=NONE] -->
+ <string name="power_menu_summary_long_press_for_assist_enabled">Press and hold for the Assistant</string>
+ <!-- Power menu setting summary to describe press and hold power button for Assistant is disabled and power menu will appear. [CHAR LIMIT=NONE] -->
+ <string name="power_menu_summary_long_press_for_assist_disabled_with_power_menu">Press and hold for the power menu</string>
+ <!-- Power menu setting summary to describe press and hold power button for Assistant is disabled and nothing will happen. [CHAR LIMIT=NONE] -->
+ <string name="power_menu_summary_long_press_for_assist_disabled_no_action">Press and hold disabled</string>
<!-- Power menu setting privacy no secure screen lock set [CHAR_LIMIT=NONE] -->
<string name="lockscreen_privacy_not_secure">To use, first set a screen lock</string>
- <!-- Power menu setting use long press power to invoke assistant. [CHAR_LIMIT=NONE] -->
+ <!-- Power menu setting use long press power to invoke assistant. [CHAR LIMIT=NONE] -->
<string name="power_menu_long_press_for_assist">Hold for Assistant</string>
- <!-- Power menu setting use log press power to invoke assistant summary. [CHAR_LIMIT=NONE] -->
+ <!-- Power menu setting use log press power to invoke assistant summary. [CHAR LIMIT=NONE] -->
<string name="power_menu_long_press_for_assist_summary">Trigger the Assistant by holding the power button</string>
+ <!-- Power menu explanation to press power and volume up to show power and emergency menu. [CHAR LIMIT=NONE] -->
+ <string name="power_menu_power_volume_up_hint">Power & Emergency Menu:\nPress Power and Volume up at the same time.</string>
+ <!-- Power menu explanation where to find prevent ringing option. [CHAR LIMIT=NONE] -->
+ <string name="power_menu_power_prevent_ringing_hint">Prevent ringing:\nShortcut available in the volume menu.</string>
+
<!-- Wallet (formerly Cards and passes) toggle name [CHAR LIMIT=60] -->
<string name="lockscreen_privacy_wallet_setting_toggle">Show wallet</string>
<!-- Wallet (formerly Cards and passes) summary [CHAR LIMIT=NONE] -->
diff --git a/res/xml/apps.xml b/res/xml/apps.xml
index a7d823b..e6314da 100644
--- a/res/xml/apps.xml
+++ b/res/xml/apps.xml
@@ -55,7 +55,7 @@
settings:searchable="false"/>
<Preference
- android:key="default_apps_v2"
+ android:key="default_apps"
android:title="@string/app_default_dashboard_title"
android:order="-996"
settings:controller="com.android.settings.applications.DefaultAppsPreferenceController">
@@ -85,7 +85,7 @@
</Preference>
<Preference
- android:key="special_access_v2"
+ android:key="special_access"
android:fragment="com.android.settings.applications.specialaccess.SpecialAccessSettings"
android:title="@string/special_access"
android:order="20"
diff --git a/res/xml/gestures.xml b/res/xml/gestures.xml
index 6de9c1a..175a826 100644
--- a/res/xml/gestures.xml
+++ b/res/xml/gestures.xml
@@ -86,4 +86,10 @@
android:title="@string/gesture_prevent_ringing_screen_title"
android:fragment="com.android.settings.gestures.PreventRingingGestureSettings"
settings:controller="com.android.settings.gestures.PreventRingingParentPreferenceController" />
+
+ <Preference
+ android:key="gesture_power_menu_summary"
+ android:title="@string/power_menu_setting_name"
+ android:fragment="com.android.settings.gestures.PowerMenuSettings"
+ settings:controller="com.android.settings.gestures.PowerMenuPreferenceController" />
</PreferenceScreen>
diff --git a/res/xml/power_menu_settings.xml b/res/xml/power_menu_settings.xml
index f88531e..caaeb97 100644
--- a/res/xml/power_menu_settings.xml
+++ b/res/xml/power_menu_settings.xml
@@ -1,19 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2020 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.
- -->
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
@@ -26,4 +23,10 @@
android:summary="@string/power_menu_long_press_for_assist_summary"
settings:controller="com.android.settings.gestures.LongPressPowerButtonPreferenceController"
/>
+
+ <com.android.settingslib.widget.FooterPreference
+ android:key="power_menu_power_volume_up_hint"
+ android:title="@string/power_menu_power_volume_up_hint"
+ android:selectable="false"
+ settings:searchable="false" />
</PreferenceScreen>
diff --git a/res/xml/system_dashboard_fragment.xml b/res/xml/system_dashboard_fragment.xml
index 6737775..9228ddd 100644
--- a/res/xml/system_dashboard_fragment.xml
+++ b/res/xml/system_dashboard_fragment.xml
@@ -43,14 +43,6 @@
android:fragment="com.android.settings.datetime.DateTimeSettings"
settings:controller="com.android.settings.datetime.DateTimePreferenceController"/>
- <Preference
- android:key="gesture_power_menu_summary"
- android:title="@string/power_menu_setting_name"
- android:icon="@drawable/ic_power_settings"
- android:order="-220"
- android:fragment="com.android.settings.gestures.PowerMenuSettings"
- settings:controller="com.android.settings.gestures.PowerMenuPreferenceController" />
-
<!-- System updates -->
<Preference
android:key="additional_system_update_settings"
diff --git a/src/com/android/settings/PointerSpeedPreference.java b/src/com/android/settings/PointerSpeedPreference.java
index d48d26c..6a93477 100644
--- a/src/com/android/settings/PointerSpeedPreference.java
+++ b/src/com/android/settings/PointerSpeedPreference.java
@@ -73,6 +73,7 @@
mOldSpeed = mIm.getPointerSpeed(getContext());
mSeekBar.setProgress(mOldSpeed - InputManager.MIN_POINTER_SPEED);
mSeekBar.setOnSeekBarChangeListener(this);
+ mSeekBar.setContentDescription(getTitle());
}
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
diff --git a/src/com/android/settings/applications/AppDashboardFragment.java b/src/com/android/settings/applications/AppDashboardFragment.java
index ff12595..7e203b0 100644
--- a/src/com/android/settings/applications/AppDashboardFragment.java
+++ b/src/com/android/settings/applications/AppDashboardFragment.java
@@ -69,6 +69,7 @@
use(SpecialAppAccessPreferenceController.class).setSession(getSettingsLifecycle());
mAppsPreferenceController = use(AppsPreferenceController.class);
mAppsPreferenceController.setFragment(this /* fragment */);
+ getSettingsLifecycle().addObserver(mAppsPreferenceController);
final HibernatedAppsPreferenceController hibernatedAppsPreferenceController =
use(HibernatedAppsPreferenceController.class);
diff --git a/src/com/android/settings/applications/AppsPreferenceController.java b/src/com/android/settings/applications/AppsPreferenceController.java
index 72d4492..9fbd5c1 100644
--- a/src/com/android/settings/applications/AppsPreferenceController.java
+++ b/src/com/android/settings/applications/AppsPreferenceController.java
@@ -26,6 +26,9 @@
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;
@@ -45,7 +48,8 @@
* This controller displays up to four recently used apps.
* If there is no recently used app, we only show up an "App Info" preference.
*/
-public class AppsPreferenceController extends BasePreferenceController {
+public class AppsPreferenceController extends BasePreferenceController implements
+ LifecycleObserver {
public static final int SHOW_RECENT_APP_COUNT = 4;
@@ -73,6 +77,7 @@
Preference mSeeAllPref;
private Fragment mHost;
+ private boolean mInitialLaunch = false;
public AppsPreferenceController(Context context) {
super(context, KEY_RECENT_APPS_CATEGORY);
@@ -95,12 +100,23 @@
super.displayPreference(screen);
initPreferences(screen);
refreshUi();
+ mInitialLaunch = true;
}
@Override
public void updateState(Preference preference) {
super.updateState(preference);
- refreshUi();
+ if (!mInitialLaunch) {
+ refreshUi();
+ }
+ }
+
+ /**
+ * Called when the apps page pauses.
+ */
+ @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
+ public void onPause() {
+ mInitialLaunch = false;
}
@VisibleForTesting
@@ -109,11 +125,15 @@
mRecentApps = loadRecentApps();
if (!mRecentApps.isEmpty()) {
displayRecentApps();
+ mAllAppsInfoPref.setVisible(false);
mRecentAppsCategory.setVisible(true);
mGeneralCategory.setVisible(true);
mSeeAllPref.setVisible(true);
} else {
mAllAppsInfoPref.setVisible(true);
+ mRecentAppsCategory.setVisible(false);
+ mGeneralCategory.setVisible(false);
+ mSeeAllPref.setVisible(false);
}
}
diff --git a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
index d83f5d1..89c3478 100644
--- a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
@@ -43,6 +43,7 @@
import com.android.settings.fuelgauge.BatteryEntry;
import com.android.settings.fuelgauge.BatteryUsageStatsLoader;
import com.android.settings.fuelgauge.BatteryUtils;
+import com.android.settings.fuelgauge.ConvertUtils;
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -113,7 +114,13 @@
if (!KEY_BATTERY.equals(preference.getKey())) {
return false;
}
+
if (mBatteryDiffEntry != null) {
+ Log.i(TAG, "BatteryDiffEntry not null, launch : "
+ + mBatteryDiffEntry.getPackageName()
+ + " | uid : "
+ + mBatteryDiffEntry.mBatteryHistEntry.mUid
+ + " with DiffEntry data");
AdvancedPowerUsageDetail.startBatteryDetailPage(
mParent.getActivity(),
mParent,
@@ -131,10 +138,16 @@
final BatteryEntry entry = new BatteryEntry(mContext, /* handler */null, userManager,
mUidBatteryConsumer, /* isHidden */ false,
mUidBatteryConsumer.getUid(), /* packages */ null, mPackageName);
+ Log.i(TAG, "Battery consumer available, launch : "
+ + entry.getDefaultPackageName()
+ + " | uid : "
+ + entry.getUid()
+ + " with BatteryEntry data");
AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent, entry,
mIsChartGraphEnabled ? Utils.formatPercentage(0) : mBatteryPercent,
!mIsChartGraphEnabled);
} else {
+ Log.i(TAG, "Launch : " + mPackageName + " with package name");
AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent,
mPackageName);
}
@@ -162,7 +175,9 @@
BatteryChartPreferenceController.getBatteryLast24HrUsageData(mContext);
if (batteryDiffEntries != null) {
for (BatteryDiffEntry batteryDiffEntry : batteryDiffEntries) {
- if (batteryDiffEntry.mBatteryHistEntry.mUid == mUid) {
+ if (batteryDiffEntry.mBatteryHistEntry.mUid == mUid
+ && batteryDiffEntry.mBatteryHistEntry.mConsumerType
+ == ConvertUtils.CONSUMER_TYPE_UID_BATTERY) {
return batteryDiffEntry;
}
}
diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
index 6d3aaa3..e1ea8e4 100755
--- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
@@ -582,9 +582,8 @@
if (mUid <= 0) {
final Intent intent = args == null
? getActivity().getIntent() : (Intent) args.getParcelable("intent");
- if (intent != null && intent.getExtras() != null) {
- mUid = intent.getIntExtra("uId", -1);
- }
+ mUid = intent != null && intent.getExtras() != null
+ ? mUid = intent.getIntExtra("uId", -1) : -1;
}
return mUid;
}
diff --git a/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java b/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java
index 8e43853..7cbbf6d 100644
--- a/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java
+++ b/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java
@@ -67,6 +67,7 @@
public class PasswordsPreferenceController extends BasePreferenceController
implements LifecycleObserver {
private static final String TAG = "AutofillSettings";
+ private static final boolean DEBUG = false;
private final PackageManager mPm;
private final IconDrawableFactory mIconFactory;
@@ -128,6 +129,8 @@
pref.setIntent(
new Intent(Intent.ACTION_MAIN)
.setClassName(serviceInfo.packageName, service.getPasswordsActivity()));
+ // Set an empty summary to avoid a UI flicker when the value loads.
+ pref.setSummary(R.string.summary_placeholder);
final MutableLiveData<Integer> passwordCount = new MutableLiveData<>();
passwordCount.observe(
@@ -172,15 +175,18 @@
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
final IAutoFillService autofillService = IAutoFillService.Stub.asInterface(service);
- // TODO check if debug is logged on user build.
- Log.d(TAG, "Fetching password count from " + name);
+ if (DEBUG) {
+ Log.d(TAG, "Fetching password count from " + name);
+ }
try {
autofillService.onSavedPasswordCountRequest(
new IResultReceiver.Stub() {
@Override
public void send(int resultCode, Bundle resultData) {
- Log.d(TAG, "Received password count result " + resultCode
- + " from " + name);
+ if (DEBUG) {
+ Log.d(TAG, "Received password count result " + resultCode
+ + " from " + name);
+ }
if (resultCode == 0 && resultData != null) {
mData.postValue(resultData.getInt(EXTRA_RESULT));
}
diff --git a/src/com/android/settings/display/AutoBrightnessDetailPreferenceController.java b/src/com/android/settings/display/AutoBrightnessDetailPreferenceController.java
index 0a60ed3..ec311f4 100644
--- a/src/com/android/settings/display/AutoBrightnessDetailPreferenceController.java
+++ b/src/com/android/settings/display/AutoBrightnessDetailPreferenceController.java
@@ -54,7 +54,7 @@
SettingsMainSwitchPreference pref = (SettingsMainSwitchPreference) screen.findPreference(
getPreferenceKey());
pref.addOnSwitchChangeListener(this);
- pref.updateStatus(isChecked());
+ pref.setChecked(isChecked());
}
@Override
diff --git a/src/com/android/settings/fuelgauge/BatterySaverController.java b/src/com/android/settings/fuelgauge/BatterySaverController.java
index 15070c3..8fec9b4 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverController.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverController.java
@@ -15,6 +15,7 @@
*/
package com.android.settings.fuelgauge;
+import android.app.settings.SettingsEnums;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
@@ -23,6 +24,7 @@
import android.os.PowerManager;
import android.provider.Settings;
import android.provider.Settings.Global;
+import android.util.Pair;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -30,6 +32,8 @@
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -44,6 +48,7 @@
private final BatterySaverReceiver mBatteryStateChangeReceiver;
private final PowerManager mPowerManager;
private Preference mBatterySaverPref;
+ private final MetricsFeatureProvider mMetricsFeatureProvider;
private final ContentObserver mObserver = new ContentObserver(
new Handler(Looper.getMainLooper())) {
@Override
@@ -56,6 +61,7 @@
super(context, KEY_BATTERY_SAVER);
mPowerManager = mContext.getSystemService(PowerManager.class);
+ mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
mBatteryStateChangeReceiver = new BatterySaverReceiver(context);
mBatteryStateChangeReceiver.setBatterySaverListener(this);
BatterySaverUtils.revertScheduleToNoneIfNeeded(context);
@@ -121,9 +127,43 @@
}
}
+ private void logPowerSaver() {
+ if (!mPowerManager.isPowerSaveMode()) {
+ // Power saver is off, so don't do anything.
+ return;
+ }
+
+ final ContentResolver resolver = mContext.getContentResolver();
+ final int mode = Global.getInt(resolver, Global.AUTOMATIC_POWER_SAVE_MODE,
+ PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
+ int fuelgaugeScheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_NO_SCHEDULE;
+ switch (mode) {
+ case PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE:
+ fuelgaugeScheduleType =
+ SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE;
+ final int powerLevelTriggerPercentage = Global.getInt(resolver,
+ Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+ mMetricsFeatureProvider.action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+ Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+ fuelgaugeScheduleType),
+ Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
+ powerLevelTriggerPercentage));
+ break;
+ case PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC:
+ fuelgaugeScheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_ROUTINE;
+ break;
+ default:
+ // empty
+ }
+ mMetricsFeatureProvider.action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+ Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+ fuelgaugeScheduleType));
+ }
+
@Override
public void onPowerSaveModeChanged() {
updateSummary();
+ logPowerSaver();
}
@Override
diff --git a/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java b/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java
index 96db2c9..3e9c80f 100644
--- a/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java
+++ b/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java
@@ -16,45 +16,30 @@
package com.android.settings.gestures;
-import android.content.ContentResolver;
import android.content.Context;
-import android.content.pm.PackageManager;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.Looper;
import android.provider.Settings;
-import androidx.annotation.Nullable;
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
-import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
+import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
+
/**
* Configures the behaviour of long press power button action.
*/
-public class LongPressPowerButtonPreferenceController extends TogglePreferenceController implements
- LifecycleObserver {
+public class LongPressPowerButtonPreferenceController extends TogglePreferenceController {
private static final String POWER_BUTTON_LONG_PRESS_SETTING =
Settings.Global.POWER_BUTTON_LONG_PRESS;
- private static final Uri POWER_BUTTON_LONG_PRESS_SETTING_URI =
- Settings.Global.getUriFor(POWER_BUTTON_LONG_PRESS_SETTING);
private static final String KEY_CHORD_POWER_VOLUME_UP_SETTING =
Settings.Global.KEY_CHORD_POWER_VOLUME_UP;
- // Used for fallback to global actions if necessary.
- @VisibleForTesting
- static final String CARDS_AVAILABLE_KEY =
- Settings.Secure.GLOBAL_ACTIONS_PANEL_AVAILABLE;
- @VisibleForTesting
- static final String CARDS_ENABLED_KEY = Settings.Secure.GLOBAL_ACTIONS_PANEL_ENABLED;
+ private static final String FOOTER_HINT_KEY = "power_menu_power_volume_up_hint";
+ private static final String ASSIST_SWITCH_KEY = "gesture_power_menu_long_press_for_assist";
/**
* Values used for long press power button behaviour when Assist setting is enabled.
@@ -63,9 +48,9 @@
* source of the value.
*/
@VisibleForTesting
- static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
+ static final int LONG_PRESS_POWER_NO_ACTION = 0;
@VisibleForTesting
- static final int LONG_PRESS_POWER_SHUT_OFF = 2;
+ static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
@VisibleForTesting
static final int LONG_PRESS_POWER_ASSISTANT_VALUE = 5; // Settings.Secure.ASSISTANT
@@ -89,13 +74,18 @@
* power menu, depending on their respective settings.
*/
private static final int POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE =
- R.integer.config_longPressOnPowerBehavior;
+ com.android.internal.R.integer.config_longPressOnPowerBehavior;
private static final int KEY_CHORD_POWER_VOLUME_UP_DEFAULT_VALUE_RESOURCE =
- R.integer.config_keyChordPowerVolumeUp;
+ com.android.internal.R.integer.config_keyChordPowerVolumeUp;
- @Nullable
- private SettingObserver mSettingsObserver;
+ @MonotonicNonNull
+ @VisibleForTesting
+ Preference mFooterHint;
+
+ @MonotonicNonNull
+ @VisibleForTesting
+ Preference mAssistSwitch;
public LongPressPowerButtonPreferenceController(Context context, String key) {
super(context, key);
@@ -104,26 +94,22 @@
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
- mSettingsObserver = new SettingObserver(screen.findPreference(getPreferenceKey()));
+ mFooterHint = screen.findPreference(FOOTER_HINT_KEY);
+ mAssistSwitch = screen.findPreference(ASSIST_SWITCH_KEY);
+ refreshStateDisplay();
}
- /**
- * Called when the settings pages resumes.
- */
- @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
- public void onResume() {
- if (mSettingsObserver != null) {
- mSettingsObserver.register();
- }
- }
-
- /**
- * Called when the settings page pauses.
- */
- @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
- public void onPause() {
- if (mSettingsObserver != null) {
- mSettingsObserver.unregister();
+ @Override
+ public CharSequence getSummary() {
+ final int powerButtonValue = getPowerButtonValue();
+ if (powerButtonValue == LONG_PRESS_POWER_ASSISTANT_VALUE) {
+ return mContext.getString(R.string.power_menu_summary_long_press_for_assist_enabled);
+ } else if (powerButtonValue == LONG_PRESS_POWER_GLOBAL_ACTIONS) {
+ return mContext.getString(
+ R.string.power_menu_summary_long_press_for_assist_disabled_with_power_menu);
+ } else {
+ return mContext.getString(
+ R.string.power_menu_summary_long_press_for_assist_disabled_no_action);
}
}
@@ -136,10 +122,7 @@
@Override
public boolean isChecked() {
- final int powerButtonValue = Settings.Global.getInt(mContext.getContentResolver(),
- POWER_BUTTON_LONG_PRESS_SETTING,
- mContext.getResources().getInteger(POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE));
- return powerButtonValue == LONG_PRESS_POWER_ASSISTANT_VALUE;
+ return getPowerButtonValue() == LONG_PRESS_POWER_ASSISTANT_VALUE;
}
@Override
@@ -148,12 +131,48 @@
// The key chord value is dependant on the long press setting and it always
// toggled in tandem. POWER_BUTTON_LONG_PRESS_SETTING is always the source
// of truth for both.
- return setPowerVolumeChordValue(isChecked);
+ setPowerVolumeChordValue(isChecked);
+ refreshStateDisplay();
+ return true;
}
return false;
}
+ private void refreshStateDisplay() {
+ if (mAssistSwitch != null) {
+ mAssistSwitch.setSummary(getSummary());
+ }
+
+ if (mFooterHint != null) {
+ String footerHintText = mContext.getString(R.string.power_menu_power_volume_up_hint);
+ // If the device supports hush gesture, we need to notify the user where to find
+ // the setting.
+ if (mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_volumeHushGestureEnabled)) {
+ footerHintText = footerHintText + "\n\n" + mContext.getString(
+ R.string.power_menu_power_prevent_ringing_hint);
+ }
+
+ mFooterHint.setSummary(footerHintText);
+ mFooterHint.setVisible(isPowerMenuKeyChordEnabled(mContext));
+ }
+ }
+
+ private int getPowerButtonValue() {
+ return Settings.Global.getInt(mContext.getContentResolver(),
+ POWER_BUTTON_LONG_PRESS_SETTING,
+ mContext.getResources().getInteger(POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE));
+ }
+
+ private static boolean isPowerMenuKeyChordEnabled(Context context) {
+ return Settings.Global.getInt(context.getContentResolver(),
+ KEY_CHORD_POWER_VOLUME_UP_SETTING,
+ context.getResources().getInteger(
+ com.android.internal.R.integer.config_keyChordPowerVolumeUp))
+ == KEY_CHORD_POWER_VOLUME_UP_GLOBAL_ACTIONS;
+ }
+
private boolean setPowerLongPressValue(boolean isChecked) {
if (isChecked) {
return Settings.Global.putInt(mContext.getContentResolver(),
@@ -162,14 +181,12 @@
// We need to determine the right disabled value - we set it to device default
// if it's different than Assist, otherwise we fallback to either global actions or power
- //menu.
+ // menu.
final int defaultPowerButtonValue = mContext.getResources().getInteger(
POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE);
if (defaultPowerButtonValue == LONG_PRESS_POWER_ASSISTANT_VALUE) {
- final int fallbackValue = isCardsOrControlsAvailable() ? LONG_PRESS_POWER_GLOBAL_ACTIONS
- : LONG_PRESS_POWER_SHUT_OFF;
return Settings.Global.putInt(mContext.getContentResolver(),
- POWER_BUTTON_LONG_PRESS_SETTING, fallbackValue);
+ POWER_BUTTON_LONG_PRESS_SETTING, LONG_PRESS_POWER_NO_ACTION);
}
return Settings.Global.putInt(mContext.getContentResolver(),
@@ -187,53 +204,11 @@
KEY_CHORD_POWER_VOLUME_UP_SETTING, KEY_CHORD_POWER_VOLUME_UP_GLOBAL_ACTIONS);
}
- // If the key chord defaults to mute toggle, we restore that setting if LPP option is
- // disabled. Otherwise we default to no action.
- boolean isMuteToggleKeyChordDefault = mContext.getResources().getInteger(
- KEY_CHORD_POWER_VOLUME_UP_DEFAULT_VALUE_RESOURCE)
- == KEY_CHORD_POWER_VOLUME_UP_MUTE_TOGGLE;
+ // We restore key chord to the default value.
+ int keyChordDefaultValue = mContext.getResources().getInteger(
+ KEY_CHORD_POWER_VOLUME_UP_DEFAULT_VALUE_RESOURCE);
return Settings.Global.putInt(mContext.getContentResolver(),
- KEY_CHORD_POWER_VOLUME_UP_SETTING, isMuteToggleKeyChordDefault
- ? KEY_CHORD_POWER_VOLUME_UP_MUTE_TOGGLE
- : KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
- }
-
- /**
- * Returns true if the global actions menu on power button click is enabled via any of the
- * content options.
- */
- private boolean isCardsOrControlsAvailable() {
- final ContentResolver resolver = mContext.getContentResolver();
- final boolean cardsAvailable = Settings.Secure.getInt(resolver, CARDS_AVAILABLE_KEY, 0)
- != 0;
- final boolean controlsAvailable = mContext.getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_CONTROLS);
- return cardsAvailable || controlsAvailable;
- }
-
- private final class SettingObserver extends ContentObserver {
-
- private final Preference mPreference;
-
- SettingObserver(Preference preference) {
- super(new Handler(Looper.getMainLooper()));
- mPreference = preference;
- }
-
- public void register() {
- final ContentResolver cr = mContext.getContentResolver();
- cr.registerContentObserver(POWER_BUTTON_LONG_PRESS_SETTING_URI, false, this);
- }
-
- public void unregister() {
- final ContentResolver cr = mContext.getContentResolver();
- cr.unregisterContentObserver(this);
- }
-
- @Override
- public void onChange(boolean selfChange) {
- updateState(mPreference);
- }
+ KEY_CHORD_POWER_VOLUME_UP_SETTING, keyChordDefaultValue);
}
}
diff --git a/src/com/android/settings/gestures/PowerMenuPreferenceController.java b/src/com/android/settings/gestures/PowerMenuPreferenceController.java
index 0693753..0d5f810 100644
--- a/src/com/android/settings/gestures/PowerMenuPreferenceController.java
+++ b/src/com/android/settings/gestures/PowerMenuPreferenceController.java
@@ -17,28 +17,54 @@
package com.android.settings.gestures;
import android.content.Context;
+import android.provider.Settings;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
public class PowerMenuPreferenceController extends BasePreferenceController {
+ private static final String POWER_BUTTON_LONG_PRESS_SETTING =
+ Settings.Global.POWER_BUTTON_LONG_PRESS;
+
+ @VisibleForTesting
+ static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
+ @VisibleForTesting
+ static final int LONG_PRESS_POWER_ASSISTANT_VALUE = 5;
+
public PowerMenuPreferenceController(Context context, String key) {
super(context, key);
}
@Override
public CharSequence getSummary() {
- return mContext.getText(R.string.power_menu_long_press_for_assist);
+ final int powerButtonValue = getPowerButtonLongPressValue(mContext);
+ if (powerButtonValue == LONG_PRESS_POWER_ASSISTANT_VALUE) {
+ return mContext.getText(R.string.power_menu_summary_long_press_for_assist_enabled);
+ } else if (powerButtonValue == LONG_PRESS_POWER_GLOBAL_ACTIONS) {
+ return mContext.getText(
+ R.string.power_menu_summary_long_press_for_assist_disabled_with_power_menu);
+ } else {
+ return mContext.getText(
+ R.string.power_menu_summary_long_press_for_assist_disabled_no_action);
+ }
}
@Override
public int getAvailabilityStatus() {
- return isAssistInvocationAvailable() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+ return isAssistInvocationAvailable() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
private boolean isAssistInvocationAvailable() {
return mContext.getResources().getBoolean(
com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable);
}
+
+ private static int getPowerButtonLongPressValue(Context context) {
+ return Settings.Global.getInt(context.getContentResolver(),
+ POWER_BUTTON_LONG_PRESS_SETTING,
+ context.getResources().getInteger(
+ com.android.internal.R.integer.config_longPressOnPowerBehavior));
+ }
}
diff --git a/src/com/android/settings/network/InternetResetHelper.java b/src/com/android/settings/network/InternetResetHelper.java
new file mode 100644
index 0000000..d6c5476
--- /dev/null
+++ b/src/com/android/settings/network/InternetResetHelper.java
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2021 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.network;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Process;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.UiThread;
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.WorkerThread;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+
+import com.android.settingslib.connectivity.ConnectivitySubsystemsRecoveryManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Helper class to restart connectivity for all requested subsystems.
+ */
+public class InternetResetHelper implements LifecycleObserver,
+ ConnectivitySubsystemsRecoveryManager.RecoveryStatusCallback {
+
+ protected static final String TAG = "InternetResetHelper";
+ public static final long RESTART_TIMEOUT_MS = 15_000; // 15 seconds
+
+ protected final Context mContext;
+ protected Preference mResettingPreference;
+ protected NetworkMobileProviderController mMobileNetworkController;
+ protected Preference mWifiTogglePreferences;
+ protected List<PreferenceCategory> mWifiNetworkPreferences =
+ new ArrayList<PreferenceCategory>();
+
+ protected final WifiManager mWifiManager;
+ protected final IntentFilter mWifiStateFilter;
+ protected final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() {
+ @Override
+ @WorkerThread
+ public void onReceive(Context context, Intent intent) {
+ if (intent != null && TextUtils.equals(intent.getAction(),
+ WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
+ updateWifiStateChange();
+ }
+ }
+ };
+
+ protected ConnectivitySubsystemsRecoveryManager mConnectivitySubsystemsRecoveryManager;
+ protected HandlerThread mWorkerThread;
+ protected boolean mIsRecoveryReady;
+ protected boolean mIsWifiReady;
+ protected HandlerInjector mHandlerInjector;
+ protected final Runnable mResumeRunnable = () -> {
+ resumePreferences();
+ };
+ protected final Runnable mTimeoutRunnable = () -> {
+ mIsRecoveryReady = true;
+ mIsWifiReady = true;
+ resumePreferences();
+ };
+
+ public InternetResetHelper(Context context, Lifecycle lifecycle) {
+ mContext = context;
+ mHandlerInjector = new HandlerInjector(context);
+ mWifiManager = mContext.getSystemService(WifiManager.class);
+ mWifiStateFilter = new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+
+ mWorkerThread = new HandlerThread(TAG
+ + "{" + Integer.toHexString(System.identityHashCode(this)) + "}",
+ Process.THREAD_PRIORITY_BACKGROUND);
+ mWorkerThread.start();
+ mConnectivitySubsystemsRecoveryManager = new ConnectivitySubsystemsRecoveryManager(
+ mContext, mWorkerThread.getThreadHandler());
+
+ if (lifecycle != null) {
+ lifecycle.addObserver(this);
+ }
+ }
+
+ /** @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) */
+ @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
+ public void onResume() {
+ mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter);
+ }
+
+ /** @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) */
+ @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
+ public void onPause() {
+ mContext.unregisterReceiver(mWifiStateReceiver);
+ }
+
+ /** @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) */
+ @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+ public void onDestroy() {
+ mHandlerInjector.removeCallbacks(mResumeRunnable);
+ mHandlerInjector.removeCallbacks(mTimeoutRunnable);
+ mWorkerThread.quit();
+ }
+
+ @Override
+ @WorkerThread
+ public void onSubsystemRestartOperationBegin() {
+ Log.d(TAG, "The connectivity subsystem is starting for recovery.");
+ }
+
+ @Override
+ @WorkerThread
+ public void onSubsystemRestartOperationEnd() {
+ Log.d(TAG, "The connectivity subsystem is done for recovery.");
+ if (!mIsRecoveryReady) {
+ mIsRecoveryReady = true;
+ mHandlerInjector.postDelayed(mResumeRunnable, 0 /* delayMillis */);
+ }
+ }
+
+ @VisibleForTesting
+ @WorkerThread
+ protected void updateWifiStateChange() {
+ if (!mIsWifiReady && mWifiManager.isWifiEnabled()) {
+ Log.d(TAG, "The Wi-Fi subsystem is done for recovery.");
+ mIsWifiReady = true;
+ mHandlerInjector.postDelayed(mResumeRunnable, 0 /* delayMillis */);
+ }
+ }
+
+ /**
+ * Sets the resetting preference.
+ */
+ @UiThread
+ public void setResettingPreference(Preference preference) {
+ mResettingPreference = preference;
+ }
+
+ /**
+ * Sets the mobile network controller.
+ */
+ @UiThread
+ public void setMobileNetworkController(NetworkMobileProviderController controller) {
+ mMobileNetworkController = controller;
+ }
+
+ /**
+ * Sets the Wi-Fi toggle preference.
+ */
+ @UiThread
+ public void setWifiTogglePreference(Preference preference) {
+ mWifiTogglePreferences = preference;
+ }
+
+ /**
+ * Adds the Wi-Fi network preference.
+ */
+ @UiThread
+ public void addWifiNetworkPreference(PreferenceCategory preference) {
+ if (preference != null) {
+ mWifiNetworkPreferences.add(preference);
+ }
+ }
+
+ @UiThread
+ protected void suspendPreferences() {
+ Log.d(TAG, "Suspend the subsystem preferences");
+ if (mMobileNetworkController != null) {
+ mMobileNetworkController.hidePreference(true /* hide */, true /* immediately */);
+ }
+ if (mWifiTogglePreferences != null) {
+ mWifiTogglePreferences.setVisible(false);
+ }
+ for (PreferenceCategory pref : mWifiNetworkPreferences) {
+ pref.removeAll();
+ pref.setVisible(false);
+ }
+ if (mResettingPreference != null) {
+ mResettingPreference.setVisible(true);
+ }
+ }
+
+ @UiThread
+ protected void resumePreferences() {
+ if (mIsRecoveryReady && mMobileNetworkController != null) {
+ Log.d(TAG, "Resume the Mobile Network controller");
+ mMobileNetworkController.hidePreference(false /* hide */, false /* immediately */);
+ }
+ if (mIsWifiReady && mWifiTogglePreferences != null) {
+ Log.d(TAG, "Resume the Wi-Fi preferences");
+ mWifiTogglePreferences.setVisible(true);
+ for (PreferenceCategory pref : mWifiNetworkPreferences) {
+ pref.setVisible(true);
+ }
+ }
+ if (mIsRecoveryReady && mIsWifiReady) {
+ mHandlerInjector.removeCallbacks(mTimeoutRunnable);
+ if (mResettingPreference != null) {
+ Log.d(TAG, "Resume the Resetting preference");
+ mResettingPreference.setVisible(false);
+ }
+ }
+ }
+
+ /**
+ * Restart connectivity for all requested subsystems.
+ */
+ @UiThread
+ public void restart() {
+ if (!mConnectivitySubsystemsRecoveryManager.isRecoveryAvailable()) {
+ Log.e(TAG, "The connectivity subsystem is not available to restart.");
+ return;
+ }
+
+ Log.d(TAG, "The connectivity subsystem is restarting for recovery.");
+ suspendPreferences();
+ mIsRecoveryReady = false;
+ mIsWifiReady = !mWifiManager.isWifiEnabled();
+ mHandlerInjector.postDelayed(mTimeoutRunnable, RESTART_TIMEOUT_MS);
+ mConnectivitySubsystemsRecoveryManager.triggerSubsystemRestart(null /* reason */, this);
+ }
+
+ /**
+ * Wrapper for testing compatibility.
+ */
+ @VisibleForTesting
+ static class HandlerInjector {
+ protected final Handler mHandler;
+
+ HandlerInjector(Context context) {
+ mHandler = context.getMainThreadHandler();
+ }
+
+ public void postDelayed(Runnable runnable, long delayMillis) {
+ mHandler.postDelayed(runnable, delayMillis);
+ }
+
+ public void removeCallbacks(Runnable runnable) {
+ mHandler.removeCallbacks(runnable);
+ }
+ }
+}
diff --git a/src/com/android/settings/network/NetworkMobileProviderController.java b/src/com/android/settings/network/NetworkMobileProviderController.java
index 5dc6c0d..33123b3 100644
--- a/src/com/android/settings/network/NetworkMobileProviderController.java
+++ b/src/com/android/settings/network/NetworkMobileProviderController.java
@@ -50,6 +50,7 @@
private SubscriptionsPreferenceController mSubscriptionsController;
private int mOriginalExpandedChildrenCount;
+ private boolean mHide;
public NetworkMobileProviderController(Context context, String key) {
super(context, key);
@@ -94,7 +95,7 @@
@Override
public int getAvailabilityStatus() {
- if (mSubscriptionsController == null) {
+ if (mHide || mSubscriptionsController == null) {
return CONDITIONALLY_UNAVAILABLE;
}
return mSubscriptionsController.isAvailable() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
@@ -122,4 +123,14 @@
mSubscriptionsController.setWifiPickerTrackerHelper(helper);
}
}
+
+ /**
+ * Hides the preference.
+ */
+ public void hidePreference(boolean hide, boolean immediately) {
+ mHide = hide;
+ if (immediately) {
+ mPreferenceCategory.setVisible(hide ? false : isAvailable());
+ }
+ }
}
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index 88e732a..f6e7917 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -32,9 +32,7 @@
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
-import android.os.HandlerThread;
import android.os.PowerManager;
-import android.os.Process;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
@@ -78,7 +76,6 @@
import com.android.settingslib.HelpUtils;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
-import com.android.settingslib.connectivity.ConnectivitySubsystemsRecoveryManager;
import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.utils.ThreadUtils;
@@ -101,7 +98,6 @@
public class NetworkProviderSettings extends RestrictedSettingsFragment
implements Indexable, WifiPickerTracker.WifiPickerTrackerCallback,
WifiDialog2.WifiDialog2Listener, DialogInterface.OnDismissListener,
- ConnectivitySubsystemsRecoveryManager.RecoveryStatusCallback,
AirplaneModeEnabler.OnAirplaneModeChangedListener, InternetUpdater.InternetChangeListener {
public static final String ACTION_NETWORK_PROVIDER_SETTINGS =
@@ -192,9 +188,7 @@
private WifiManager.ActionListener mSaveListener;
private WifiManager.ActionListener mForgetListener;
- @VisibleForTesting
- protected ConnectivitySubsystemsRecoveryManager mConnectivitySubsystemsRecoveryManager;
- private HandlerThread mRecoveryThread;
+ protected InternetResetHelper mInternetResetHelper;
/**
* The state of {@link #isUiRestricted()} at {@link #onCreate(Bundle)}}. This is necessary to
@@ -1274,39 +1268,17 @@
}
private void fixConnectivity() {
- if (mConnectivitySubsystemsRecoveryManager == null) {
- mRecoveryThread = new HandlerThread(TAG
- + "{" + Integer.toHexString(System.identityHashCode(this)) + "}",
- Process.THREAD_PRIORITY_BACKGROUND);
- mRecoveryThread.start();
- mConnectivitySubsystemsRecoveryManager = new ConnectivitySubsystemsRecoveryManager(
- getContext(), mRecoveryThread.getThreadHandler());
+ if (mInternetResetHelper == null) {
+ mInternetResetHelper = new InternetResetHelper(getContext(), getLifecycle());
+ mInternetResetHelper.setResettingPreference(mResetInternetPreference);
+ mInternetResetHelper.setMobileNetworkController(mNetworkMobileProviderController);
+ mInternetResetHelper.setWifiTogglePreference(
+ findPreference(WifiSwitchPreferenceController.KEY));
+ mInternetResetHelper.addWifiNetworkPreference(mConnectedWifiEntryPreferenceCategory);
+ mInternetResetHelper.addWifiNetworkPreference(mFirstWifiEntryPreferenceCategory);
+ mInternetResetHelper.addWifiNetworkPreference(mWifiEntryPreferenceCategory);
}
- if (mConnectivitySubsystemsRecoveryManager.isRecoveryAvailable()) {
- mConnectivitySubsystemsRecoveryManager.triggerSubsystemRestart(null /* reason */, this);
- }
- }
-
- /**
- * Callback for the internet recovery started.
- */
- public void onSubsystemRestartOperationBegin() {
- if (mResetInternetPreference != null) {
- mResetInternetPreference.setVisible(true);
- }
- updateAirplaneModeMsgPreference(false /* visible */);
- }
-
- /**
- * Callback for the internet recovery ended.
- */
- public void onSubsystemRestartOperationEnd() {
- if (mResetInternetPreference != null) {
- mResetInternetPreference.setVisible(false);
- }
- if (mAirplaneModeEnabler.isAirplaneModeOn()) {
- updateAirplaneModeMsgPreference(true /* visible */);
- }
+ mInternetResetHelper.restart();
}
/**
diff --git a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java
index 14c9117..5ea01ea 100644
--- a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java
+++ b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java
@@ -150,6 +150,6 @@
final Intent intent = new Intent(ACTION_ZEN_MODE_SLICE_CHANGED)
.setClass(context, SliceBroadcastReceiver.class);
return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent,
- PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_MUTABLE);
}
}
diff --git a/src/com/android/settings/widget/SettingsMainSwitchPreference.java b/src/com/android/settings/widget/SettingsMainSwitchPreference.java
index 09e1ca4..f0e8d95 100644
--- a/src/com/android/settings/widget/SettingsMainSwitchPreference.java
+++ b/src/com/android/settings/widget/SettingsMainSwitchPreference.java
@@ -86,9 +86,12 @@
mEnforcedAdmin = mRestrictedHelper.checkRestrictionEnforced();
}
mMainSwitchBar = (SettingsMainSwitchBar) holder.findViewById(R.id.main_switch_bar);
+ initMainSwitchBar();
if (mIsVisible) {
mMainSwitchBar.show();
- updateStatus(isChecked());
+ if (mMainSwitchBar.isChecked() != isChecked()) {
+ setChecked(isChecked());
+ }
registerListenerToSwitchBar();
} else {
mMainSwitchBar.hide();
@@ -145,18 +148,6 @@
}
/**
- * Update the switch status of preference
- */
- public void updateStatus(boolean checked) {
- setChecked(checked);
- if (mMainSwitchBar != null) {
- mMainSwitchBar.setTitle(mTitle);
- mMainSwitchBar.setDisabledByAdmin(mEnforcedAdmin);
- mMainSwitchBar.show();
- }
- }
-
- /**
* Show the MainSwitchBar
*/
public void show() {
@@ -251,6 +242,13 @@
}
}
+ private void initMainSwitchBar() {
+ if (mMainSwitchBar != null) {
+ mMainSwitchBar.setTitle(mTitle);
+ mMainSwitchBar.setDisabledByAdmin(mEnforcedAdmin);
+ }
+ }
+
private void registerListenerToSwitchBar() {
for (OnBeforeCheckedChangeListener listener : mBeforeCheckedChangeListeners) {
mMainSwitchBar.setOnBeforeCheckedChangeListener(listener);
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 75e6307..59f6504 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -233,6 +233,9 @@
if (FeatureFlagUtils.isEnabled(getContext(), FeatureFlagUtils.SETTINGS_PROVIDER_MODEL)) {
final Intent intent = new Intent("android.settings.NETWORK_PROVIDER_SETTINGS");
+ // Add FLAG_ACTIVITY_NEW_TASK and FLAG_ACTIVITY_CLEAR_TASK to avoid multiple
+ // instances issue. (e.g. b/191956700)
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
final Bundle extras = getActivity().getIntent().getExtras();
if (extras != null) {
intent.putExtras(extras);
diff --git a/tests/robotests/res/layout/main_clear.xml b/tests/robotests/res/layout/main_clear.xml
index 868d88f..b9a126d 100644
--- a/tests/robotests/res/layout/main_clear.xml
+++ b/tests/robotests/res/layout/main_clear.xml
@@ -28,9 +28,7 @@
<ScrollView
android:id="@+id/main_clear_scrollview"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginStart="@dimen/reset_main_clear_margin_start"
- android:layout_marginEnd="@dimen/reset_main_clear_margin_end">
+ android:layout_height="match_parent">
<LinearLayout
android:id="@+id/main_clear_container"
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
index 52f682c..cee1160 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
@@ -21,12 +21,17 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.PowerManager;
import android.provider.Settings;
+import android.util.Pair;
import androidx.preference.Preference;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -46,12 +51,16 @@
private BatterySaverController mBatterySaverController;
private Context mContext;
+ private FakeFeatureFactory mFeatureFactory;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
+ mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
mBatterySaverController = spy(new BatterySaverController(mContext));
ReflectionHelpers.setField(mBatterySaverController, "mPowerManager", mPowerManager);
ReflectionHelpers.setField(mBatterySaverController, "mBatterySaverPref", mBatterySaverPref);
@@ -73,6 +82,49 @@
}
@Test
+ public void onPreferenceChange_onPowerSaveModeChanged_manualTrigger_logsType() {
+ when(mPowerManager.isPowerSaveMode()).thenReturn(true);
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.AUTOMATIC_POWER_SAVE_MODE, -1);
+
+ mBatterySaverController.onPowerSaveModeChanged();
+ verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+ Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+ SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_NO_SCHEDULE));
+ }
+
+ @Test
+ public void onPreferenceChange_onPowerSaveModeChanged_triggerPercent_logsTypeAndPercentage() {
+ when(mPowerManager.isPowerSaveMode()).thenReturn(true);
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
+ PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
+ final int percentageVal = 15;
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, percentageVal);
+
+ mBatterySaverController.onPowerSaveModeChanged();
+ verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+ Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+ SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE),
+ Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
+ percentageVal));
+ }
+
+ @Test
+ public void onPreferenceChange_onPowerSaveModeChanged_triggerDynamic_logsType() {
+ when(mPowerManager.isPowerSaveMode()).thenReturn(true);
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
+ PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC);
+
+ mBatterySaverController.onPowerSaveModeChanged();
+ verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
+ Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
+ SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_ROUTINE));
+ }
+
+ @Test
public void getSummary_batterySaverOn_showSummaryOn() {
when(mPowerManager.isPowerSaveMode()).thenReturn(true);
diff --git a/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java
index 085e53d..053fa5a 100644
--- a/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java
@@ -18,20 +18,28 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Application;
import android.content.res.Resources;
import android.provider.Settings;
+import androidx.annotation.StringRes;
+import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
+import org.mockito.stubbing.Answer;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
@RunWith(RobolectricTestRunner.class)
public class LongPressPowerButtonPreferenceControllerTest {
@@ -46,14 +54,20 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
+ mContext = spy(ApplicationProvider.getApplicationContext());
mResources = mock(Resources.class);
when(mContext.getResources()).thenReturn(mResources);
+ when(mResources.getString(anyInt())).thenAnswer((Answer<String>) invocation -> {
+ int id = invocation.getArgument(0);
+ return getString(id);
+ });
when(mResources.getBoolean(
com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable))
.thenReturn(true);
mController = new LongPressPowerButtonPreferenceController(mContext,
KEY_LONG_PRESS_POWER_BUTTON);
+ mController.mAssistSwitch = mock(Preference.class);
+ mController.mFooterHint = mock(Preference.class);
}
@Test
@@ -75,6 +89,60 @@
}
@Test
+ public void preferenceChecked_powerMenuHintTextShown() {
+ mController.onPreferenceChange(null, true);
+
+ verify(mController.mFooterHint).setSummary(
+ getString(
+ R.string.power_menu_power_volume_up_hint));
+ verify(mController.mFooterHint).setVisible(true);
+ }
+
+
+ @Test
+ public void preferenceUnchecked_keyChordEnabled_powerMenuHintTextShown() {
+ when(mResources.getInteger(
+ com.android.internal.R.integer.config_keyChordPowerVolumeUp))
+ .thenReturn(
+ LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_GLOBAL_ACTIONS);
+
+ mController.onPreferenceChange(null, false);
+
+ verify(mController.mFooterHint).setSummary(
+ getString(
+ R.string.power_menu_power_volume_up_hint));
+ verify(mController.mFooterHint).setVisible(true);
+ }
+
+ @Test
+ public void preferenceChecked_hushGestureEnabled_powerMenuHintTextIncludesHushHint() {
+ when(mResources.getBoolean(
+ com.android.internal.R.bool.config_volumeHushGestureEnabled))
+ .thenReturn(true);
+
+ mController.onPreferenceChange(null, true);
+
+ verify(mController.mFooterHint).setSummary(
+ getString(
+ R.string.power_menu_power_volume_up_hint) + "\n\n"
+ + getString(
+ R.string.power_menu_power_prevent_ringing_hint));
+ verify(mController.mFooterHint).setVisible(true);
+ }
+
+
+ @Test
+ public void preferenceUnchecked_keyChordDisabled_powerMenuHintTextHidden() {
+ mController.onPreferenceChange(null, false);
+ when(mResources.getInteger(
+ com.android.internal.R.integer.config_keyChordPowerVolumeUp))
+ .thenReturn(
+ LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
+
+ verify(mController.mFooterHint).setVisible(false);
+ }
+
+ @Test
public void preferenceChecked_longPressPowerSettingSetToAssistant() {
mController.onPreferenceChange(null, true);
@@ -84,21 +152,29 @@
assertThat(Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_GLOBAL_ACTIONS);
+ verify(mController.mAssistSwitch).setSummary(
+ getString(
+ R.string.power_menu_summary_long_press_for_assist_enabled));
}
@Test
public void preferenceUnchecked_longPressPowerSettingSetToDefaultValue() {
- // Value out of range chosen deliberately.
when(mResources.getInteger(
com.android.internal.R.integer.config_longPressOnPowerBehavior))
- .thenReturn(8);
+ .thenReturn(
+ LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_GLOBAL_ACTIONS);
mController.onPreferenceChange(null, false);
+
assertThat(Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(8);
+ Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(
+ LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_GLOBAL_ACTIONS);
assertThat(Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
+ verify(mController.mAssistSwitch).setSummary(
+ getString(
+ R.string.power_menu_summary_long_press_for_assist_disabled_with_power_menu));
}
@Test
@@ -110,9 +186,10 @@
when(mResources.getInteger(
com.android.internal.R.integer.config_keyChordPowerVolumeUp))
.thenReturn(
- LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_MUTE_TOGGLE);
+ LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_MUTE_TOGGLE);
mController.onPreferenceChange(null, false);
+
assertThat(Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(8);
assertThat(Settings.Global.getInt(mContext.getContentResolver(),
@@ -121,7 +198,7 @@
}
@Test
- public void preferenceUnchecked_assistDefault_setShutOff() {
+ public void preferenceUnchecked_assistDefault_setNoAction() {
// Value out of range chosen deliberately.
when(mResources.getInteger(
com.android.internal.R.integer.config_longPressOnPowerBehavior))
@@ -129,33 +206,19 @@
LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_ASSISTANT_VALUE);
mController.onPreferenceChange(null, false);
+
assertThat(Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(
- LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_SHUT_OFF);
+ LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_NO_ACTION);
assertThat(Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
+ verify(mController.mAssistSwitch).setSummary(
+ getString(
+ R.string.power_menu_summary_long_press_for_assist_disabled_no_action));
}
-
- @Test
- public void preferenceUnchecked_assistDefaultGlobalActionsEnabled_setGlobalActions() {
- // Value out of range chosen deliberately.
- when(mResources.getInteger(
- com.android.internal.R.integer.config_longPressOnPowerBehavior))
- .thenReturn(
- LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_ASSISTANT_VALUE);
- Settings.Secure.putInt(mContext.getContentResolver(),
- LongPressPowerButtonPreferenceController.CARDS_AVAILABLE_KEY, 1);
- Settings.Secure.putInt(mContext.getContentResolver(),
- LongPressPowerButtonPreferenceController.CARDS_ENABLED_KEY, 1);
-
- mController.onPreferenceChange(null, false);
- assertThat(Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(
- LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_GLOBAL_ACTIONS);
- assertThat(Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.KEY_CHORD_POWER_VOLUME_UP, -1)).isEqualTo(
- LongPressPowerButtonPreferenceController.KEY_CHORD_POWER_VOLUME_UP_NO_ACTION);
+ private String getString(@StringRes int id) {
+ return ApplicationProvider.getApplicationContext().getString(id);
}
}
diff --git a/tests/robotests/src/com/android/settings/gestures/PowerMenuPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PowerMenuPreferenceControllerTest.java
index 811ed70..1a82a13 100644
--- a/tests/robotests/src/com/android/settings/gestures/PowerMenuPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/PowerMenuPreferenceControllerTest.java
@@ -70,6 +70,6 @@
.thenReturn(false);
assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
+ BasePreferenceController.UNSUPPORTED_ON_DEVICE);
}
}
diff --git a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
index 9951449..47cd87c 100644
--- a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
@@ -66,7 +66,6 @@
import com.android.settings.wifi.ConnectedWifiEntryPreference;
import com.android.settings.wifi.WifiConfigController2;
import com.android.settings.wifi.WifiDialog2;
-import com.android.settingslib.connectivity.ConnectivitySubsystemsRecoveryManager;
import com.android.settingslib.widget.LayoutPreference;
import com.android.settingslib.wifi.LongPressWifiEntryPreference;
import com.android.wifitrackerlib.WifiEntry;
@@ -105,7 +104,7 @@
@Mock
private PreferenceManager mPreferenceManager;
@Mock
- private ConnectivitySubsystemsRecoveryManager mConnectivitySubsystemsRecoveryManager;
+ private InternetResetHelper mInternetResetHelper;
@Mock
private Preference mAirplaneModeMsgPreference;
@Mock
@@ -439,49 +438,14 @@
}
@Test
- public void onOptionsItemSelected_fixConnectivity_triggerSubsystemRestart() {
- doReturn(true).when(mConnectivitySubsystemsRecoveryManager).isRecoveryAvailable();
- mNetworkProviderSettings.mConnectivitySubsystemsRecoveryManager =
- mConnectivitySubsystemsRecoveryManager;
+ public void onOptionsItemSelected_fixConnectivity_restartInternet() {
+ mNetworkProviderSettings.mInternetResetHelper = mInternetResetHelper;
doReturn(false).when(mNetworkProviderSettings).isPhoneOnCall();
doReturn(NetworkProviderSettings.MENU_FIX_CONNECTIVITY).when(mMenuItem).getItemId();
mNetworkProviderSettings.onOptionsItemSelected(mMenuItem);
- verify(mConnectivitySubsystemsRecoveryManager).triggerSubsystemRestart(any(), any());
- }
-
- @Test
- public void onOptionsItemSelected_fixConnectivityOnCall_neverTriggerSubsystemRestart() {
- doReturn(true).when(mConnectivitySubsystemsRecoveryManager).isRecoveryAvailable();
- mNetworkProviderSettings.mConnectivitySubsystemsRecoveryManager =
- mConnectivitySubsystemsRecoveryManager;
- doReturn(true).when(mNetworkProviderSettings).isPhoneOnCall();
- doNothing().when(mNetworkProviderSettings).showResetInternetDialog();
- doReturn(NetworkProviderSettings.MENU_FIX_CONNECTIVITY).when(mMenuItem).getItemId();
-
- mNetworkProviderSettings.onOptionsItemSelected(mMenuItem);
-
- verify(mConnectivitySubsystemsRecoveryManager, never()).triggerSubsystemRestart(any(),
- any());
- }
-
- @Test
- public void onSubsystemRestartOperationBegin_showResetInternetHideApmMsg() {
- mNetworkProviderSettings.onSubsystemRestartOperationBegin();
-
- verify(mResetInternetPreference).setVisible(true);
- verify(mAirplaneModeMsgPreference).setVisible(false);
- }
-
- @Test
- public void onSubsystemRestartOperationEnd_showApmMsgHideResetInternet() {
- doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn();
-
- mNetworkProviderSettings.onSubsystemRestartOperationEnd();
-
- verify(mResetInternetPreference).setVisible(false);
- verify(mAirplaneModeMsgPreference).setVisible(true);
+ verify(mInternetResetHelper).restart();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java
index c0c4fd7..31d10d9 100644
--- a/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchPreferenceTest.java
@@ -59,8 +59,8 @@
}
@Test
- public void updateStatus_isRestricted_restrictIconShouldDisplay() {
- mPreference.updateStatus(true);
+ public void onBindViewHolder_isRestricted_restrictIconShouldDisplay() {
+ mPreference.onBindViewHolder(mHolder);
final SettingsMainSwitchBar switchBar = mPreference.getSwitchBar();
final ImageView restrictedIcon = switchBar.findViewById(
diff --git a/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java b/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java
new file mode 100644
index 0000000..00ca8e1
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2021 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.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.IntentFilter;
+import android.net.wifi.WifiManager;
+import android.os.HandlerThread;
+import android.os.Looper;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settingslib.connectivity.ConnectivitySubsystemsRecoveryManager;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+public class InternetResetHelperTest {
+
+ @Rule
+ public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Mock
+ private WifiManager mWifiManager;
+ @Mock
+ public HandlerThread mWorkerThread;
+ @Mock
+ public ConnectivitySubsystemsRecoveryManager mConnectivitySubsystemsRecoveryManager;
+ @Mock
+ public NetworkMobileProviderController mMobileNetworkController;
+
+ private Context mContext;
+ private InternetResetHelper mInternetResetHelper;
+ private Preference mResettingPreference;
+ private Preference mWifiTogglePreferences;
+ private PreferenceCategory mConnectedWifiEntryPreferences;
+ private PreferenceCategory mWifiEntryPreferences;
+
+ private FakeHandlerInjector mFakeHandlerInjector;
+
+ private static class FakeHandlerInjector extends InternetResetHelper.HandlerInjector {
+
+ private Runnable mRunnable;
+
+ FakeHandlerInjector(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void postDelayed(Runnable runnable, long delayMillis) {
+ mRunnable = runnable;
+ }
+
+ public Runnable getRunnable() {
+ return mRunnable;
+ }
+ }
+
+ @Before
+ public void setUp() {
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
+ if (Looper.myLooper() == null) {
+ Looper.prepare();
+ }
+ mResettingPreference = new Preference(mContext);
+ mWifiTogglePreferences = new Preference(mContext);
+ mConnectedWifiEntryPreferences = spy(new PreferenceCategory(mContext));
+ mWifiEntryPreferences = spy(new PreferenceCategory(mContext));
+
+ final Lifecycle lifecycle = mock(Lifecycle.class);
+ mInternetResetHelper = new InternetResetHelper(mContext, lifecycle);
+ mInternetResetHelper.mWorkerThread = mWorkerThread;
+ mFakeHandlerInjector = new FakeHandlerInjector(mContext);
+ mInternetResetHelper.mHandlerInjector = mFakeHandlerInjector;
+ mInternetResetHelper.mConnectivitySubsystemsRecoveryManager =
+ mConnectivitySubsystemsRecoveryManager;
+ mInternetResetHelper.setResettingPreference(mResettingPreference);
+ mInternetResetHelper.setMobileNetworkController(mMobileNetworkController);
+ mInternetResetHelper.setWifiTogglePreference(mWifiTogglePreferences);
+ mInternetResetHelper.addWifiNetworkPreference(mConnectedWifiEntryPreferences);
+ mInternetResetHelper.addWifiNetworkPreference(mWifiEntryPreferences);
+ }
+
+ @Test
+ public void onResume_registerReceiver() {
+ mInternetResetHelper.onResume();
+
+ verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
+ }
+
+ @Test
+ public void onPause_unregisterReceiver() {
+ mInternetResetHelper.onResume();
+
+ mInternetResetHelper.onPause();
+
+ verify(mContext).unregisterReceiver(any(BroadcastReceiver.class));
+ }
+
+ @Test
+ public void onDestroy_quitWorkerThread() {
+ mInternetResetHelper.onDestroy();
+
+ verify(mWorkerThread).quit();
+ }
+
+ @Test
+ public void onSubsystemRestartOperationEnd_recoveryIsNotReady_postResumeRunnable() {
+ mInternetResetHelper.mIsRecoveryReady = false;
+
+ mInternetResetHelper.onSubsystemRestartOperationEnd();
+
+ assertThat(mInternetResetHelper.mIsRecoveryReady).isTrue();
+ assertThat(mFakeHandlerInjector.getRunnable())
+ .isEqualTo(mInternetResetHelper.mResumeRunnable);
+ }
+
+ @Test
+ public void onSubsystemRestartOperationEnd_recoveryIsReady_doNothing() {
+ mInternetResetHelper.mIsRecoveryReady = true;
+
+ mInternetResetHelper.onSubsystemRestartOperationEnd();
+
+ assertThat(mFakeHandlerInjector.getRunnable()).isNull();
+ }
+
+ @Test
+ public void updateWifiStateChange_wifiIsNotReadyAndWifiDisabled_doNothing() {
+ mInternetResetHelper.mIsWifiReady = false;
+ when(mWifiManager.isWifiEnabled()).thenReturn(false);
+
+ mInternetResetHelper.updateWifiStateChange();
+
+ assertThat(mInternetResetHelper.mIsWifiReady).isFalse();
+ assertThat(mFakeHandlerInjector.getRunnable()).isNull();
+ }
+
+ @Test
+ public void updateWifiStateChange_wifiIsNotReadyAndWifiEnabled_postResumeRunnable() {
+ mInternetResetHelper.mIsWifiReady = false;
+ when(mWifiManager.isWifiEnabled()).thenReturn(true);
+
+ mInternetResetHelper.updateWifiStateChange();
+
+ assertThat(mInternetResetHelper.mIsWifiReady).isTrue();
+ assertThat(mFakeHandlerInjector.getRunnable())
+ .isEqualTo(mInternetResetHelper.mResumeRunnable);
+ }
+
+ @Test
+ public void updateWifiStateChange_wifiIsReady_doNothing() {
+ mInternetResetHelper.mIsWifiReady = true;
+
+ mInternetResetHelper.updateWifiStateChange();
+
+ assertThat(mInternetResetHelper.mIsWifiReady).isTrue();
+ assertThat(mFakeHandlerInjector.getRunnable()).isNull();
+ }
+
+ @Test
+ public void suspendPreferences_shouldShowResettingHideSubSys() {
+ mInternetResetHelper.suspendPreferences();
+
+ // Show resetting preference
+ assertThat(mResettingPreference.isVisible()).isTrue();
+ // Hide subsystem preferences
+ verify(mMobileNetworkController).hidePreference(true /* hide */, true /* immediately*/);
+ assertThat(mWifiTogglePreferences.isVisible()).isFalse();
+ verify(mConnectedWifiEntryPreferences).removeAll();
+ assertThat(mConnectedWifiEntryPreferences.isVisible()).isFalse();
+ verify(mWifiEntryPreferences).removeAll();
+ assertThat(mWifiEntryPreferences.isVisible()).isFalse();
+ }
+
+ @Test
+ public void resumePreferences_onlyRecoveryReady_shouldShowSubSysHideResetting() {
+ mInternetResetHelper.suspendPreferences();
+ mInternetResetHelper.mIsRecoveryReady = true;
+ mInternetResetHelper.mIsWifiReady = false;
+
+ mInternetResetHelper.resumePreferences();
+
+ // Show resetting preference
+ assertThat(mResettingPreference.isVisible()).isTrue();
+ // Show Mobile Network controller
+ verify(mMobileNetworkController).hidePreference(false /* hide */, false /* immediately*/);
+ // Hide Wi-Fi preferences
+ assertThat(mWifiTogglePreferences.isVisible()).isFalse();
+ assertThat(mConnectedWifiEntryPreferences.isVisible()).isFalse();
+ assertThat(mWifiEntryPreferences.isVisible()).isFalse();
+ }
+
+ @Test
+ public void resumePreferences_onlyWifiReady_shouldShowSubSysHideResetting() {
+ mInternetResetHelper.suspendPreferences();
+ mInternetResetHelper.mIsRecoveryReady = false;
+ mInternetResetHelper.mIsWifiReady = true;
+
+ mInternetResetHelper.resumePreferences();
+
+ // Show resetting preference
+ assertThat(mResettingPreference.isVisible()).isTrue();
+ // Show Wi-Fi preferences
+ assertThat(mWifiTogglePreferences.isVisible()).isTrue();
+ assertThat(mConnectedWifiEntryPreferences.isVisible()).isTrue();
+ assertThat(mWifiEntryPreferences.isVisible()).isTrue();
+ // Hide Mobile Network controller
+ verify(mMobileNetworkController, never())
+ .hidePreference(false /* hide */, false /* immediately*/);
+ }
+
+ @Test
+ public void resumePreferences_allReady_shouldShowSubSysHideResetting() {
+ mInternetResetHelper.suspendPreferences();
+ mInternetResetHelper.mIsRecoveryReady = true;
+ mInternetResetHelper.mIsWifiReady = true;
+ mInternetResetHelper.resumePreferences();
+
+ // Show subsystem preferences
+ verify(mMobileNetworkController).hidePreference(false, false);
+ assertThat(mWifiTogglePreferences.isVisible()).isTrue();
+ assertThat(mConnectedWifiEntryPreferences.isVisible()).isTrue();
+ assertThat(mWifiEntryPreferences.isVisible()).isTrue();
+ // Hide resetting preference
+ assertThat(mResettingPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void restart_recoveryNotAvailable_shouldDoTriggerSubsystemRestart() {
+ when(mConnectivitySubsystemsRecoveryManager.isRecoveryAvailable()).thenReturn(false);
+
+ mInternetResetHelper.restart();
+
+ verify(mConnectivitySubsystemsRecoveryManager, never())
+ .triggerSubsystemRestart(any(), any());
+ }
+
+ @Test
+ public void restart_recoveryAvailable_triggerSubsystemRestart() {
+ when(mConnectivitySubsystemsRecoveryManager.isRecoveryAvailable()).thenReturn(true);
+
+ mInternetResetHelper.restart();
+
+ assertThat(mFakeHandlerInjector.getRunnable())
+ .isEqualTo(mInternetResetHelper.mTimeoutRunnable);
+ verify(mConnectivitySubsystemsRecoveryManager).triggerSubsystemRestart(any(), any());
+ }
+}
diff --git a/tests/unit/src/com/android/settings/network/NetworkMobileProviderControllerTest.java b/tests/unit/src/com/android/settings/network/NetworkMobileProviderControllerTest.java
index 31c68da..b626bff 100644
--- a/tests/unit/src/com/android/settings/network/NetworkMobileProviderControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/NetworkMobileProviderControllerTest.java
@@ -173,6 +173,44 @@
assertEquals(mPreferenceScreen.getInitialExpandedChildrenCount(), Integer.MAX_VALUE);
}
+ @Test
+ public void hidePreference_hidePreferenceTrue_preferenceIsNotVisible() {
+ when(mSubscriptionsController.isAvailable()).thenReturn(true);
+ setupNetworkMobileProviderController();
+ mPreferenceCategory.setVisible(true);
+
+ mNetworkMobileProviderController.hidePreference(true /* hide */, true /* immediately*/);
+
+ assertThat(mPreferenceCategory.isVisible()).isFalse();
+ }
+
+ @Test
+ public void hidePreference_hidePreferenceFalse_preferenceIsVisible() {
+ when(mSubscriptionsController.isAvailable()).thenReturn(true);
+ setupNetworkMobileProviderController();
+
+ mNetworkMobileProviderController.hidePreference(false /* hide */, true /* immediately*/);
+
+ assertThat(mPreferenceCategory.isVisible()).isTrue();
+ }
+
+ @Test
+ public void hidePreference_hidePreferenceFalse_preferenceIsNotVisibleImmediately() {
+ when(mSubscriptionsController.isAvailable()).thenReturn(true);
+ setupNetworkMobileProviderController();
+ mPreferenceCategory.setVisible(false);
+
+ mNetworkMobileProviderController.hidePreference(false /* hide */, false /* immediately*/);
+
+ // The preference is not visible immediately.
+ assertThat(mPreferenceCategory.isVisible()).isFalse();
+
+ mNetworkMobileProviderController.displayPreference(mPreferenceScreen);
+
+ // The preference is visible after displayPreference() updated.
+ assertThat(mPreferenceCategory.isVisible()).isTrue();
+ }
+
private void setupNetworkMobileProviderController() {
mNetworkMobileProviderController.init(mLifecycle);
mNetworkMobileProviderController.displayPreference(mPreferenceScreen);