From 27cbd5bccd0bb2ecd6de1d55f59903b639eceffa Mon Sep 17 00:00:00 2001 From: wesleycwwang Date: Mon, 22 Aug 2022 18:45:21 +0800 Subject: [PATCH 1/8] Update extra defend layout string Bug: 235246949 Test: make RunSettingsRoboTests Change-Id: I3a3afe2e47d90882bdc4e4180ea5c6b079efd828 --- .../settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java | 2 +- .../fuelgauge/batterytip/tips/BatteryDefenderTipTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java index 0a133bbe42e..5c0fc58f0fa 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java @@ -108,7 +108,7 @@ public class BatteryDefenderTip extends BatteryTip { }); cardPreference.setPrimaryButtonVisible(isPluggedIn(context)); - cardPreference.setSecondaryButtonText(context.getString(R.string.see_more)); + cardPreference.setSecondaryButtonText(context.getString(R.string.learn_more)); cardPreference.setSecondaryButtonClickListener(unused -> cardPreference.performClick()); cardPreference.setSecondaryButtonVisible(true); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java index c1ec7c6cb5a..6bd6b26b78c 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java @@ -125,7 +125,7 @@ public class BatteryDefenderTipTest { @Test public void updatePreference_shouldSetSecondaryButtonText() { - String expected = mContext.getString(R.string.see_more); + String expected = mContext.getString(R.string.learn_more); mBatteryDefenderTip.updatePreference(mCardPreference); From 059154ebb207d51fa0742e265d7a90a8afe63919 Mon Sep 17 00:00:00 2001 From: Lucas Silva Date: Mon, 22 Aug 2022 16:22:53 -0400 Subject: [PATCH 2/8] Update dream complication settings to use boolean setting. This simplifies the logic and prevents the boolean from toggling itself when new complication types are added. Bug: 241469874 Test: manually on device Change-Id: I0b67f9f2ce75dcfc5e57a50f9b27e374ea9295b1 --- .../dream/DreamComplicationPreferenceController.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/dream/DreamComplicationPreferenceController.java b/src/com/android/settings/dream/DreamComplicationPreferenceController.java index d9c4fb3512a..596fe20f2de 100644 --- a/src/com/android/settings/dream/DreamComplicationPreferenceController.java +++ b/src/com/android/settings/dream/DreamComplicationPreferenceController.java @@ -42,14 +42,12 @@ public class DreamComplicationPreferenceController extends TogglePreferenceContr @Override public boolean isChecked() { - return mBackend.getEnabledComplications().containsAll(mBackend.getSupportedComplications()); + return mBackend.getComplicationsEnabled(); } @Override public boolean setChecked(boolean isChecked) { - for (int complication : mBackend.getSupportedComplications()) { - mBackend.setComplicationEnabled(complication, isChecked); - } + mBackend.setComplicationsEnabled(isChecked); return true; } From c918fa812b5a2ae1ce1d056662993309c4d18b2d Mon Sep 17 00:00:00 2001 From: changbetty Date: Tue, 23 Aug 2022 02:53:19 +0000 Subject: [PATCH 3/8] [LE Audio] Display the correct title on broadcast assistant device Bug: 241509690 Test: manual test Change-Id: Iaf3a54108faaa82354ca30656dd4b7a384806408 --- .../settings/bluetooth/BluetoothBroadcastDialog.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothBroadcastDialog.java b/src/com/android/settings/bluetooth/BluetoothBroadcastDialog.java index dd06b679910..62a66cf1d5a 100644 --- a/src/com/android/settings/bluetooth/BluetoothBroadcastDialog.java +++ b/src/com/android/settings/bluetooth/BluetoothBroadcastDialog.java @@ -74,12 +74,12 @@ public class BluetoothBroadcastDialog extends InstrumentedDialogFragment { TextView title = layout.findViewById(com.android.settingslib.R.id.dialog_title); TextView subTitle = layout.findViewById(com.android.settingslib.R.id.dialog_subtitle); - title.setText(mContext.getString(R.string.bluetooth_broadcast_dialog_title)); - subTitle.setText( - mContext.getString(R.string.bluetooth_broadcast_dialog_broadcast_message)); Button broadcastBtn = layout.findViewById(com.android.settingslib.R.id.positive_btn); if (isBroadcastSupported() && mIsMediaStreaming) { + title.setText(mContext.getString(R.string.bluetooth_broadcast_dialog_title)); + subTitle.setText( + mContext.getString(R.string.bluetooth_broadcast_dialog_broadcast_message)); broadcastBtn.setVisibility(View.VISIBLE); if (TextUtils.isEmpty(mCurrentAppLabel)) { broadcastBtn.setText(mContext.getString(R.string.bluetooth_broadcast_dialog_title)); @@ -92,6 +92,9 @@ public class BluetoothBroadcastDialog extends InstrumentedDialogFragment { launchMediaOutputBroadcastDialog(); }); } else { + title.setText(mContext.getString(R.string.bluetooth_find_broadcast)); + subTitle.setText( + mContext.getString(R.string.bluetooth_broadcast_dialog_find_message)); broadcastBtn.setVisibility(View.GONE); } From 2a57f5de8d403675dd77572301cd7ab02ea9de91 Mon Sep 17 00:00:00 2001 From: Zaiyue Xue Date: Fri, 19 Aug 2022 14:29:00 +0800 Subject: [PATCH 4/8] Port battery usage bug fixing cls from master to tm-qpr-dev This cl is a merge of the following 5 cls: ag/19674112 Fix b/242989581: The two battery charts have the same label ag/19667114 Support data logging for battery usage new chart view ag/19636171 Support data logging for battery usage new chart view ag/19682758 Resolve insufficient contrast for system component icons ag/19697763 Add fade in animation for battery usage chart group Bug: 242989581 Bug: 242810430 Bug: 242989982 Test: presubmit Change-Id: I39cd0f88ce62a280a966750082a40f8a537b9616 Merged-In: Ice30508bc20b5de631efee0db0160fe6ad710dbb --- res/drawable/ic_cellular_1_bar.xml | 10 ++-- res/drawable/ic_power_system.xml | 6 +-- res/drawable/ic_settings_aod.xml | 20 ++++---- res/drawable/ic_settings_bluetooth.xml | 25 ++++++++++ res/drawable/ic_settings_camera.xml | 6 +-- res/drawable/ic_settings_display.xml | 6 +-- res/drawable/ic_settings_phone_idle.xml | 10 ++-- res/drawable/ic_settings_voice_calls.xml | 10 ++-- .../ic_settings_wireless_no_theme.xml | 30 ++++++++++++ res/layout/battery_chart_graph.xml | 42 ++++++++++------- res/values-night/colors.xml | 3 ++ res/values/colors.xml | 3 ++ res/values/strings.xml | 4 ++ .../BatteryChartPreferenceController.java | 46 +++++++++++++++++-- .../fuelgauge/batteryusage/BatteryEntry.java | 4 +- .../BatteryHistoryPreference.java | 7 ++- .../BatteryChartPreferenceControllerTest.java | 12 +++++ .../batteryusage/BatteryEntryTest.java | 4 +- 18 files changed, 186 insertions(+), 62 deletions(-) create mode 100644 res/drawable/ic_settings_bluetooth.xml create mode 100644 res/drawable/ic_settings_wireless_no_theme.xml diff --git a/res/drawable/ic_cellular_1_bar.xml b/res/drawable/ic_cellular_1_bar.xml index 23caacc2244..a07e25752fe 100644 --- a/res/drawable/ic_cellular_1_bar.xml +++ b/res/drawable/ic_cellular_1_bar.xml @@ -1,5 +1,5 @@ + + + diff --git a/res/drawable/ic_settings_camera.xml b/res/drawable/ic_settings_camera.xml index 3c855323183..278d29508ce 100644 --- a/res/drawable/ic_settings_camera.xml +++ b/res/drawable/ic_settings_camera.xml @@ -1,5 +1,5 @@ + + + + diff --git a/res/layout/battery_chart_graph.xml b/res/layout/battery_chart_graph.xml index b95c6604be2..f116c8ee313 100644 --- a/res/layout/battery_chart_graph.xml +++ b/res/layout/battery_chart_graph.xml @@ -31,25 +31,33 @@ android:textColor="?android:attr/textColorSecondary" android:text="@string/battery_usage_chart_graph_hint_last_full_charge" /> - + android:layout_height="wrap_content" + android:orientation="vertical" + android:alpha="0"> + + + + - @*android:color/ripple_material_light + + + @android:color/white diff --git a/res/values/colors.xml b/res/values/colors.xml index e818a285fe6..7ca1ab2451c 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -209,4 +209,7 @@ ?androidprv:attr/colorSurface + + + ?android:attr/textColorPrimary diff --git a/res/values/strings.xml b/res/values/strings.xml index 083064f75fc..921cb5227fe 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6790,6 +6790,10 @@ Battery usage data will be available after you use your phone for a few hours Battery usage chart + + Daily battery usage chart + + Hourly battery usage chart diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java index 88bec0d9d05..45ae8c595bf 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java @@ -65,7 +65,10 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll private static final String TAG = "BatteryChartPreferenceController"; private static final String KEY_FOOTER_PREF = "battery_graph_footer"; private static final String PACKAGE_NAME_NONE = "none"; + private static final int ENABLED_ICON_ALPHA = 255; + private static final int DISABLED_ICON_ALPHA = 255 / 3; + private static final long FADE_ANIMATION_DURATION = 350L; private static final long VALID_USAGE_TIME_DURATION = DateUtils.HOUR_IN_MILLIS * 2; private static final long VALID_DIFF_DURATION = DateUtils.MINUTE_IN_MILLIS * 3; @@ -102,6 +105,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll private boolean mIs24HourFormat; private boolean mIsFooterPrefAdded = false; + private View mBatteryChartViewGroup; private PreferenceScreen mPreferenceScreen; private FooterPreference mFooterPreference; // Daily view model only saves abbreviated day of week texts (e.g. MON). This field saves the @@ -202,7 +206,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mPrefContext = screen.getContext(); mAppListPrefGroup = screen.findPreference(mPreferenceKey); mAppListPrefGroup.setOrderingAsAdded(false); - mAppListPrefGroup.setTitle(mPrefContext.getString(R.string.battery_app_usage)); + mAppListPrefGroup.setTitle(""); mFooterPreference = screen.findPreference(KEY_FOOTER_PREF); // Removes footer first until usage data is loaded to avoid flashing. if (mFooterPreference != null) { @@ -260,6 +264,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll final Map> batteryHistoryMap) { Log.d(TAG, "setBatteryHistoryMap() " + (batteryHistoryMap == null ? "null" : ("size=" + batteryHistoryMap.size()))); + // Ensure the battery chart group is visible for users. + animateBatteryChartViewGroup(); final BatteryLevelData batteryLevelData = DataProcessor.getBatteryLevelData(mContext, mHandler, batteryHistoryMap, batteryUsageMap -> { @@ -267,6 +273,11 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll refreshUi(); }); Log.d(TAG, "getBatteryLevelData: " + batteryLevelData); + mMetricsFeatureProvider.action( + mPrefContext, + SettingsEnums.ACTION_BATTERY_HISTORY_LOADED, + getTotalHours(batteryLevelData)); + if (batteryLevelData == null) { mDailyTimestampFullTexts = null; mDailyViewModel = null; @@ -297,8 +308,13 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll void setBatteryChartView(@NonNull final BatteryChartView dailyChartView, @NonNull final BatteryChartView hourlyChartView) { + final View parentView = (View) dailyChartView.getParent(); + if (parentView != null && parentView.getId() == R.id.battery_chart_group) { + mBatteryChartViewGroup = (View) dailyChartView.getParent(); + } if (mDailyChartView != dailyChartView || mHourlyChartView != hourlyChartView) { mHandler.post(() -> setBatteryChartViewInner(dailyChartView, hourlyChartView)); + animateBatteryChartViewGroup(); } } @@ -313,7 +329,12 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mDailyChartIndex = trapezoidIndex; mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL; refreshUi(); - // TODO: Change to log daily data. + mMetricsFeatureProvider.action( + mPrefContext, + trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL + ? SettingsEnums.ACTION_BATTERY_USAGE_DAILY_SHOW_ALL + : SettingsEnums.ACTION_BATTERY_USAGE_DAILY_TIME_SLOT, + mDailyChartIndex); }); mHourlyChartView = hourlyChartView; mHourlyChartView.setOnSelectListener(trapezoidIndex -> { @@ -327,7 +348,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mPrefContext, trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL ? SettingsEnums.ACTION_BATTERY_USAGE_SHOW_ALL - : SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT); + : SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT, + mHourlyChartIndex); }); refreshUi(); } @@ -452,6 +474,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll if (!isAdded) { mAppListPrefGroup.addPreference(pref); } + appIcon.setAlpha(pref.isEnabled() ? ENABLED_ICON_ALPHA : DISABLED_ICON_ALPHA); prefIndex++; } } @@ -601,6 +624,13 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll return !DataProcessor.contains(packageName, mNotAllowShowSummaryPackages); } + private void animateBatteryChartViewGroup() { + if (mBatteryChartViewGroup != null && mBatteryChartViewGroup.getAlpha() == 0) { + mBatteryChartViewGroup.animate().alpha(1f).setDuration(FADE_ANIMATION_DURATION) + .start(); + } + } + private void addFooterPreferenceIfNeeded(boolean containAppItems) { if (mIsFooterPrefAdded || mFooterPreference == null) { return; @@ -623,6 +653,16 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll && mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL; } + @VisibleForTesting + static int getTotalHours(final BatteryLevelData batteryLevelData) { + if (batteryLevelData == null) { + return 0; + } + List dailyTimestamps = batteryLevelData.getDailyBatteryLevels().getTimestamps(); + return (int) ((dailyTimestamps.get(dailyTimestamps.size() - 1) - dailyTimestamps.get(0)) + / DateUtils.HOUR_IN_MILLIS); + } + private static List generateTimestampDayOfWeekTexts(@NonNull final Context context, @NonNull final List timestamps, final boolean isAbbreviation) { final ArrayList texts = new ArrayList<>(); diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java index 24d6dad8f88..ccb2fb786eb 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java @@ -574,7 +574,7 @@ public class BatteryEntry { break; case BatteryConsumer.POWER_COMPONENT_BLUETOOTH: name = context.getResources().getString(R.string.power_bluetooth); - iconId = com.android.internal.R.drawable.ic_settings_bluetooth; + iconId = R.drawable.ic_settings_bluetooth; break; case BatteryConsumer.POWER_COMPONENT_CAMERA: name = context.getResources().getString(R.string.power_camera); @@ -598,7 +598,7 @@ public class BatteryEntry { break; case BatteryConsumer.POWER_COMPONENT_WIFI: name = context.getResources().getString(R.string.power_wifi); - iconId = R.drawable.ic_settings_wireless; + iconId = R.drawable.ic_settings_wireless_no_theme; break; case BatteryConsumer.POWER_COMPONENT_IDLE: case BatteryConsumer.POWER_COMPONENT_MEMORY: diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java index 71fd26ce95c..674822359be 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java @@ -106,12 +106,11 @@ public class BatteryHistoryPreference extends Preference { return; } if (mIsChartGraphEnabled) { + final TextView companionTextView = (TextView) view.findViewById(R.id.companion_text); mDailyChartView = (BatteryChartView) view.findViewById(R.id.daily_battery_chart); - mDailyChartView.setCompanionTextView( - (TextView) view.findViewById(R.id.companion_text)); + mDailyChartView.setCompanionTextView(companionTextView); mHourlyChartView = (BatteryChartView) view.findViewById(R.id.hourly_battery_chart); - mHourlyChartView.setCompanionTextView( - (TextView) view.findViewById(R.id.companion_text)); + mHourlyChartView.setCompanionTextView(companionTextView); if (mChartPreferenceController != null) { mChartPreferenceController.setBatteryChartView(mDailyChartView, mHourlyChartView); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java index 016287e2f87..1eead821372 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java @@ -630,6 +630,18 @@ public final class BatteryChartPreferenceControllerTest { .isFalse(); } + @Test + public void getTotalHours_getExpectedResult() { + Map> batteryHistoryMap = createBatteryHistoryMap(60); + BatteryLevelData batteryLevelData = DataProcessor.getBatteryLevelData(mContext, null, + batteryHistoryMap, null); + + final int totalHour = BatteryChartPreferenceController.getTotalHours(batteryLevelData); + + // Only calculate the even hours. + assertThat(totalHour).isEqualTo(58); + } + private static Long generateTimestamp(int index) { // "2021-04-23 07:00:00 UTC" + index hours return 1619247600000L + index * DateUtils.HOUR_IN_MILLIS; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java index 5ca3aca189f..ffc6d9a02e6 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java @@ -307,7 +307,7 @@ public class BatteryEntryTest { R.drawable.ic_settings_aod); assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, R.string.power_bluetooth, - com.android.internal.R.drawable.ic_settings_bluetooth); + R.drawable.ic_settings_bluetooth); assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_CAMERA, R.string.power_camera, R.drawable.ic_settings_camera); @@ -325,7 +325,7 @@ public class BatteryEntryTest { R.drawable.ic_settings_display); assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_WIFI, R.string.power_wifi, - R.drawable.ic_settings_wireless); + R.drawable.ic_settings_wireless_no_theme); assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_IDLE, R.string.power_idle, R.drawable.ic_settings_phone_idle); From b00140b7a3288e956384e72adc3fa6fc9260d83b Mon Sep 17 00:00:00 2001 From: Pajace Chen Date: Tue, 23 Aug 2022 13:53:56 +0800 Subject: [PATCH 5/8] Reduce the calling times for isExtraDefend Only calling this HAL API when BatteryDefenderTips card need to be shown Bug: 243465597 Test: make RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.fuelgauge.* Change-Id: Iae3c03d946ec29fe78a826ce62b6bebd893704ef --- .../batterytip/BatteryTipLoader.java | 7 ++----- .../detectors/BatteryDefenderDetector.java | 21 ++++++++++++------- .../BatteryDefenderDetectorTest.java | 4 +++- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java index ea493a38f6b..95145ba8216 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java @@ -31,7 +31,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.settings.overlay.FeatureFactory; import com.android.settingslib.fuelgauge.EstimateKt; import com.android.settingslib.utils.AsyncLoaderCompat; @@ -67,16 +66,14 @@ public class BatteryTipLoader extends AsyncLoaderCompat> { final BatteryTipPolicy policy = new BatteryTipPolicy(getContext()); final BatteryInfo batteryInfo = mBatteryUtils.getBatteryInfo(TAG); final Context context = getContext(); - final boolean extraDefend = FeatureFactory.getFactory(context) - .getPowerUsageFeatureProvider(context) - .isExtraDefend(); tips.add(new LowBatteryDetector(context, policy, batteryInfo).detect()); tips.add(new HighUsageDetector(context, policy, mBatteryUsageStats, batteryInfo).detect()); tips.add(new SmartBatteryDetector( context, policy, batteryInfo, context.getContentResolver()).detect()); tips.add(new EarlyWarningDetector(policy, context).detect()); - tips.add(new BatteryDefenderDetector(batteryInfo, extraDefend).detect()); + tips.add(new BatteryDefenderDetector( + batteryInfo, context.getApplicationContext()).detect()); Collections.sort(tips); return tips; } diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java index 367b2b1f5a3..87d4a0b44a5 100644 --- a/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java +++ b/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java @@ -16,28 +16,33 @@ package com.android.settings.fuelgauge.batterytip.detectors; +import android.content.Context; + import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.batterytip.tips.BatteryDefenderTip; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; +import com.android.settings.overlay.FeatureFactory; /** * Detect whether the battery is overheated */ public class BatteryDefenderDetector implements BatteryTipDetector { private final BatteryInfo mBatteryInfo; - private final boolean mExtraDefend; + private final Context mContext; - public BatteryDefenderDetector(BatteryInfo batteryInfo, boolean extraDefend) { + public BatteryDefenderDetector(BatteryInfo batteryInfo, Context context) { mBatteryInfo = batteryInfo; - mExtraDefend = extraDefend; + mContext = context; } @Override public BatteryTip detect() { - final int state = - mBatteryInfo.isOverheated - ? BatteryTip.StateType.NEW - : BatteryTip.StateType.INVISIBLE; - return new BatteryDefenderTip(state, mExtraDefend); + if (mBatteryInfo.isOverheated) { + final boolean extraDefend = FeatureFactory.getFactory(mContext) + .getPowerUsageFeatureProvider(mContext) + .isExtraDefend(); + return new BatteryDefenderTip(BatteryTip.StateType.NEW, extraDefend); + } + return new BatteryDefenderTip(BatteryTip.StateType.INVISIBLE); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java index 3309f597d71..90e7ad762a8 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java @@ -18,6 +18,8 @@ package com.android.settings.fuelgauge.batterytip.detectors; import static com.google.common.truth.Truth.assertThat; +import androidx.test.core.app.ApplicationProvider; + import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; @@ -42,7 +44,7 @@ public class BatteryDefenderDetectorTest { mBatteryInfo.discharging = false; mBatteryDefenderDetector = new BatteryDefenderDetector( - mBatteryInfo, /* extraDefend= */ false); + mBatteryInfo, ApplicationProvider.getApplicationContext()); } @Test From 9bdca3ba92780a0ec4329f3aac3dcd641da18fd6 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Fri, 29 Jul 2022 07:03:38 +0000 Subject: [PATCH 6/8] [Settings] Data warning & limit UI should be configuable when running out of limit Should access API which is irrelated to status of data limit. Changing from API isDataEnabledForApn(ApnSetting.TYPE_DEFAULT) into isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER). Bug: 223361190 Change-Id: Iada89de38e9db3706a944c7a5b5f8a3e87d415e5 Test: Manual (cherry picked from commit 7e530dda39da543e3443c97e0cc0ff32b9e50478) --- .../datausage/BillingCyclePreference.java | 3 +- .../datausage/BillingCyclePreferenceTest.java | 78 +++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 tests/unit/src/com/android/settings/datausage/BillingCyclePreferenceTest.java diff --git a/src/com/android/settings/datausage/BillingCyclePreference.java b/src/com/android/settings/datausage/BillingCyclePreference.java index 116ed89b3c7..1bd2be8f078 100644 --- a/src/com/android/settings/datausage/BillingCyclePreference.java +++ b/src/com/android/settings/datausage/BillingCyclePreference.java @@ -20,6 +20,7 @@ import android.content.Intent; import android.net.NetworkTemplate; import android.os.Bundle; import android.os.RemoteException; +import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.util.AttributeSet; @@ -78,7 +79,7 @@ public class BillingCyclePreference extends Preference try { setEnabled(mServices.mNetworkService.isBandwidthControlEnabled() && mServices.mTelephonyManager.createForSubscriptionId(mSubId) - .isDataEnabledForApn(ApnSetting.TYPE_DEFAULT) + .isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER) && mServices.mUserManager.isAdminUser()); } catch (RemoteException e) { setEnabled(false); diff --git a/tests/unit/src/com/android/settings/datausage/BillingCyclePreferenceTest.java b/tests/unit/src/com/android/settings/datausage/BillingCyclePreferenceTest.java new file mode 100644 index 00000000000..f74768fdda6 --- /dev/null +++ b/tests/unit/src/com/android/settings/datausage/BillingCyclePreferenceTest.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.datausage; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.os.INetworkManagementService; +import android.os.RemoteException; +import android.os.UserManager; +import android.telephony.TelephonyManager; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@RunWith(AndroidJUnit4.class) +public class BillingCyclePreferenceTest { + + private Context mContext; + private BillingCyclePreference mPreference; + private TemplatePreference.NetworkServices mServices; + @Mock + private INetworkManagementService mNetManageSerice; + @Mock + private TelephonyManager mTelephonyManager; + @Mock + private UserManager mUserManager; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = spy(ApplicationProvider.getApplicationContext()); + + mServices = new TemplatePreference.NetworkServices(); + mServices.mNetworkService = mNetManageSerice; + mServices.mTelephonyManager = mTelephonyManager; + mServices.mUserManager = mUserManager; + + doReturn(mTelephonyManager).when(mTelephonyManager) + .createForSubscriptionId(anyInt()); + + mPreference = spy(new BillingCyclePreference(mContext, null /* attrs */)); + mPreference.setTemplate(null, 0, mServices); + } + + @Test + public void testPreferenceUpdate_onMobileDataEnabledChange_accessDataEnabledApi() { + try { + doReturn(true).when(mNetManageSerice).isBandwidthControlEnabled(); + } catch (RemoteException exception) {} + doReturn(true).when(mUserManager).isAdminUser(); + mPreference.onMobileDataEnabledChange(); + + verify(mTelephonyManager) + .isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER); + } +} \ No newline at end of file From 76516bbd3dde1f9f88f211f7299b3625ee2ec618 Mon Sep 17 00:00:00 2001 From: kellyz Date: Fri, 22 Jul 2022 10:23:28 +0800 Subject: [PATCH 7/8] Enable predictive back gesture for Settings app. Bug: 238729272 Test: manually tested on device Change-Id: Ib75902d1d7bbd289705cb62ef00d5840676bda72 (cherry picked from commit 1bda6428c234431234782efca65d1637b0729d7d) Merged-In: Ib75902d1d7bbd289705cb62ef00d5840676bda72 --- AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e280b8394f9..1b69a58b0fd 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -131,7 +131,8 @@ android:usesCleartextTraffic="true" android:defaultToDeviceProtectedStorage="true" android:directBootAware="true" - android:appComponentFactory="androidx.core.app.CoreComponentFactory"> + android:appComponentFactory="androidx.core.app.CoreComponentFactory" + android:enableOnBackInvokedCallback="true"> From 475632c4feda1bba831a2e343a4c7de6eec4cda5 Mon Sep 17 00:00:00 2001 From: Michael Wright Date: Wed, 24 Aug 2022 12:22:12 +0000 Subject: [PATCH 8/8] Revert^3 "Improve App notification loading" 33710fd9e2893d2b7650f40006348319960a8318 Change-Id: Ifb45f949c28bff04f8abfe3e1a73628f2e407241 --- .../AppBubbleListPreferenceController.java | 14 +-- .../AddToHomeScreenPreferenceController.java | 10 +- .../app/AllowSoundPreferenceController.java | 13 +-- ...nnelsBypassingDndPreferenceController.java | 6 +- ...pConversationListPreferenceController.java | 22 ++--- .../app/AppLinkPreferenceController.java | 10 +- .../app/BadgePreferenceController.java | 22 ++--- .../app/BlockPreferenceController.java | 10 +- .../BubbleCategoryPreferenceController.java | 10 +- .../app/BubbleLinkPreferenceController.java | 10 +- .../app/BubblePreferenceController.java | 19 ++-- .../BubbleSummaryPreferenceController.java | 21 ++--- .../app/ChannelListPreferenceController.java | 47 +++++----- ...onversationDemotePreferenceController.java | 15 ++- ...onversationHeaderPreferenceController.java | 6 +- ...versationPriorityPreferenceController.java | 12 +-- ...nversationPromotePreferenceController.java | 15 ++- .../DeletedChannelsPreferenceController.java | 15 ++- .../app/DescriptionPreferenceController.java | 16 ++-- .../app/DndPreferenceController.java | 10 +- .../app/HeaderPreferenceController.java | 6 +- .../HighImportancePreferenceController.java | 16 ++-- .../app/ImportancePreferenceController.java | 12 +-- ...dConversationInfoPreferenceController.java | 14 ++- ...validConversationPreferenceController.java | 14 ++- .../app/LightsPreferenceController.java | 18 ++-- .../MinImportancePreferenceController.java | 14 +-- .../app/NotificationPreferenceController.java | 33 +++---- .../app/NotificationSettings.java | 94 ++++++++++--------- .../NotificationsOffPreferenceController.java | 14 +-- .../app/SoundPreferenceController.java | 15 ++- .../app/VibrationPreferenceController.java | 19 ++-- .../app/VisibilityPreferenceController.java | 16 ++-- .../NotificationPreferenceControllerTest.java | 2 +- 34 files changed, 272 insertions(+), 318 deletions(-) diff --git a/src/com/android/settings/notification/AppBubbleListPreferenceController.java b/src/com/android/settings/notification/AppBubbleListPreferenceController.java index 6ebb376b5c1..bf7fcc03756 100644 --- a/src/com/android/settings/notification/AppBubbleListPreferenceController.java +++ b/src/com/android/settings/notification/AppBubbleListPreferenceController.java @@ -51,7 +51,7 @@ public class AppBubbleListPreferenceController extends AppConversationListPrefer private static final String KEY = "bubble_conversations"; public AppBubbleListPreferenceController(Context context, NotificationBackend backend) { - super(context, backend, KEY); + super(context, backend); } @Override @@ -80,25 +80,25 @@ public class AppBubbleListPreferenceController extends AppConversationListPrefer } @Override - public int getAvailabilityStatus() { + public boolean isAvailable() { // copy rather than inherit super's isAvailable because apps can link to this page // as part of onboarding, before they send a valid conversation notification if (mAppRow == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mAppRow.banned) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mChannel != null) { if (mBackend.onlyHasDefaultChannel(mAppRow.pkg, mAppRow.uid) || NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId())) { - return CONDITIONALLY_UNAVAILABLE; + return false; } } if (mAppRow.bubblePreference == BUBBLE_PREFERENCE_NONE) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - return AVAILABLE; + return true; } @VisibleForTesting diff --git a/src/com/android/settings/notification/app/AddToHomeScreenPreferenceController.java b/src/com/android/settings/notification/app/AddToHomeScreenPreferenceController.java index 12b807534f9..e5afd9d3db0 100644 --- a/src/com/android/settings/notification/app/AddToHomeScreenPreferenceController.java +++ b/src/com/android/settings/notification/app/AddToHomeScreenPreferenceController.java @@ -32,7 +32,7 @@ public class AddToHomeScreenPreferenceController extends NotificationPreferenceC private static final String KEY = "add_to_home"; public AddToHomeScreenPreferenceController(Context context, NotificationBackend backend) { - super(context, backend, KEY); + super(context, backend); } @Override @@ -41,11 +41,11 @@ public class AddToHomeScreenPreferenceController extends NotificationPreferenceC } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } - return mConversationInfo != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + return mConversationInfo != null; } @Override diff --git a/src/com/android/settings/notification/app/AllowSoundPreferenceController.java b/src/com/android/settings/notification/app/AllowSoundPreferenceController.java index 99d08734c96..0664c544bec 100644 --- a/src/com/android/settings/notification/app/AllowSoundPreferenceController.java +++ b/src/com/android/settings/notification/app/AllowSoundPreferenceController.java @@ -40,7 +40,7 @@ public class AllowSoundPreferenceController extends NotificationPreferenceContro public AllowSoundPreferenceController(Context context, NotificationSettings.DependentFieldListener dependentFieldListener, NotificationBackend backend) { - super(context, backend, KEY_IMPORTANCE); + super(context, backend); mDependentFieldListener = dependentFieldListener; } @@ -50,14 +50,11 @@ public class AllowSoundPreferenceController extends NotificationPreferenceContro } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } - if (mChannel != null && NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId())) { - return AVAILABLE; - } - return CONDITIONALLY_UNAVAILABLE; + return mChannel != null && NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId()); } diff --git a/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java b/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java index 6c2c0c3cf77..92cd911843a 100644 --- a/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java +++ b/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java @@ -64,7 +64,7 @@ public class AppChannelsBypassingDndPreferenceController extends NotificationPre public AppChannelsBypassingDndPreferenceController( Context context, NotificationBackend backend) { - super(context, backend, KEY); + super(context, backend); } @Override @@ -110,8 +110,8 @@ public class AppChannelsBypassingDndPreferenceController extends NotificationPre } @Override - public int getAvailabilityStatus() { - return mAppRow != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + return mAppRow != null; } @Override diff --git a/src/com/android/settings/notification/app/AppConversationListPreferenceController.java b/src/com/android/settings/notification/app/AppConversationListPreferenceController.java index e7b23788968..dd44a13f7c8 100644 --- a/src/com/android/settings/notification/app/AppConversationListPreferenceController.java +++ b/src/com/android/settings/notification/app/AppConversationListPreferenceController.java @@ -49,12 +49,7 @@ public class AppConversationListPreferenceController extends NotificationPrefere protected PreferenceCategory mPreference; public AppConversationListPreferenceController(Context context, NotificationBackend backend) { - this(context, backend, KEY); - } - - public AppConversationListPreferenceController(Context context, NotificationBackend backend, - String key) { - super(context, backend, key); + super(context, backend); } @Override @@ -63,24 +58,21 @@ public class AppConversationListPreferenceController extends NotificationPrefere } @Override - public int getAvailabilityStatus() { + public boolean isAvailable() { if (mAppRow == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mAppRow.banned) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mChannel != null) { if (mBackend.onlyHasDefaultChannel(mAppRow.pkg, mAppRow.uid) || NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId())) { - return CONDITIONALLY_UNAVAILABLE; + return false; } } - if (mBackend.hasSentValidMsg(mAppRow.pkg, mAppRow.uid) || mBackend.isInInvalidMsgState( - mAppRow.pkg, mAppRow.uid)) { - return AVAILABLE; - } - return CONDITIONALLY_UNAVAILABLE; + return mBackend.hasSentValidMsg(mAppRow.pkg, mAppRow.uid) || mBackend.isInInvalidMsgState( + mAppRow.pkg, mAppRow.uid); } @Override diff --git a/src/com/android/settings/notification/app/AppLinkPreferenceController.java b/src/com/android/settings/notification/app/AppLinkPreferenceController.java index ecf9670cba9..043ae698f54 100644 --- a/src/com/android/settings/notification/app/AppLinkPreferenceController.java +++ b/src/com/android/settings/notification/app/AppLinkPreferenceController.java @@ -32,7 +32,7 @@ public class AppLinkPreferenceController extends NotificationPreferenceControlle private static final String KEY_APP_LINK = "app_link"; public AppLinkPreferenceController(Context context) { - super(context, null, KEY_APP_LINK); + super(context, null); } @Override @@ -41,11 +41,11 @@ public class AppLinkPreferenceController extends NotificationPreferenceControlle } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } - return mAppRow.settingsIntent != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + return mAppRow.settingsIntent != null; } @Override diff --git a/src/com/android/settings/notification/app/BadgePreferenceController.java b/src/com/android/settings/notification/app/BadgePreferenceController.java index f94dfb513ae..108fa1d7a07 100644 --- a/src/com/android/settings/notification/app/BadgePreferenceController.java +++ b/src/com/android/settings/notification/app/BadgePreferenceController.java @@ -38,7 +38,7 @@ public class BadgePreferenceController extends NotificationPreferenceController public BadgePreferenceController(Context context, NotificationBackend backend) { - super(context, backend, KEY_BADGE); + super(context, backend); } @Override @@ -47,29 +47,25 @@ public class BadgePreferenceController extends NotificationPreferenceController } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } if (mAppRow == null && mChannel == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (Settings.Secure.getInt(mContext.getContentResolver(), NOTIFICATION_BADGING, SYSTEM_WIDE_ON) == SYSTEM_WIDE_OFF) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mChannel != null) { if (isDefaultChannel()) { - return AVAILABLE; + return true; } else { - return mAppRow == null - ? CONDITIONALLY_UNAVAILABLE - : mAppRow.showBadge - ? AVAILABLE - : CONDITIONALLY_UNAVAILABLE; + return mAppRow == null ? false : mAppRow.showBadge; } } - return AVAILABLE; + return true; } @Override diff --git a/src/com/android/settings/notification/app/BlockPreferenceController.java b/src/com/android/settings/notification/app/BlockPreferenceController.java index ea3eaeb3353..f4e213298a7 100644 --- a/src/com/android/settings/notification/app/BlockPreferenceController.java +++ b/src/com/android/settings/notification/app/BlockPreferenceController.java @@ -42,7 +42,7 @@ public class BlockPreferenceController extends NotificationPreferenceController public BlockPreferenceController(Context context, NotificationSettings.DependentFieldListener dependentFieldListener, NotificationBackend backend) { - super(context, backend, KEY_BLOCK); + super(context, backend); mDependentFieldListener = dependentFieldListener; } @@ -52,14 +52,14 @@ public class BlockPreferenceController extends NotificationPreferenceController } @Override - public int getAvailabilityStatus() { + public boolean isAvailable() { if (mAppRow == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mPreferenceFilter != null && !isIncludedInFilter()) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - return AVAILABLE; + return true; } @Override diff --git a/src/com/android/settings/notification/app/BubbleCategoryPreferenceController.java b/src/com/android/settings/notification/app/BubbleCategoryPreferenceController.java index da67afeeb33..ad3a10cf381 100644 --- a/src/com/android/settings/notification/app/BubbleCategoryPreferenceController.java +++ b/src/com/android/settings/notification/app/BubbleCategoryPreferenceController.java @@ -32,15 +32,15 @@ public class BubbleCategoryPreferenceController extends NotificationPreferenceCo static final int ON = 1; public BubbleCategoryPreferenceController(Context context) { - super(context, null, KEY); + super(context, null); } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } - return areBubblesEnabled() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + return areBubblesEnabled(); } @Override diff --git a/src/com/android/settings/notification/app/BubbleLinkPreferenceController.java b/src/com/android/settings/notification/app/BubbleLinkPreferenceController.java index ed1c9b53079..0b9529b10b5 100644 --- a/src/com/android/settings/notification/app/BubbleLinkPreferenceController.java +++ b/src/com/android/settings/notification/app/BubbleLinkPreferenceController.java @@ -32,15 +32,15 @@ public class BubbleLinkPreferenceController extends NotificationPreferenceContro static final int ON = 1; public BubbleLinkPreferenceController(Context context) { - super(context, null, KEY); + super(context, null); } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } - return areBubblesEnabled() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + return areBubblesEnabled(); } @Override diff --git a/src/com/android/settings/notification/app/BubblePreferenceController.java b/src/com/android/settings/notification/app/BubblePreferenceController.java index 516a45e482d..351b4635bb6 100644 --- a/src/com/android/settings/notification/app/BubblePreferenceController.java +++ b/src/com/android/settings/notification/app/BubblePreferenceController.java @@ -56,7 +56,7 @@ public class BubblePreferenceController extends NotificationPreferenceController public BubblePreferenceController(Context context, @Nullable FragmentManager fragmentManager, NotificationBackend backend, boolean isAppPage, @Nullable NotificationSettings.DependentFieldListener listener) { - super(context, backend, KEY); + super(context, backend); mFragmentManager = fragmentManager; mIsAppPage = isAppPage; mListener = listener; @@ -68,24 +68,21 @@ public class BubblePreferenceController extends NotificationPreferenceController } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } if (!mIsAppPage && !isEnabled()) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mChannel != null) { if (isDefaultChannel()) { - return AVAILABLE; + return true; } else { - if (mAppRow != null && mAppRow.bubblePreference != BUBBLE_PREFERENCE_NONE) { - return AVAILABLE; - } - return CONDITIONALLY_UNAVAILABLE; + return mAppRow != null && mAppRow.bubblePreference != BUBBLE_PREFERENCE_NONE; } } - return AVAILABLE; + return true; } @Override diff --git a/src/com/android/settings/notification/app/BubbleSummaryPreferenceController.java b/src/com/android/settings/notification/app/BubbleSummaryPreferenceController.java index abbe89e6fa8..51370b16bef 100644 --- a/src/com/android/settings/notification/app/BubbleSummaryPreferenceController.java +++ b/src/com/android/settings/notification/app/BubbleSummaryPreferenceController.java @@ -42,31 +42,28 @@ public class BubbleSummaryPreferenceController extends NotificationPreferenceCon static final int ON = 1; public BubbleSummaryPreferenceController(Context context, NotificationBackend backend) { - super(context, backend, KEY); + super(context, backend); } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } if (mAppRow == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mChannel != null) { if (!isGloballyEnabled()) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (isDefaultChannel()) { - return AVAILABLE; + return true; } else { - return mAppRow != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + return mAppRow != null; } } - if (isGloballyEnabled() && mBackend.hasSentValidBubble(mAppRow.pkg, mAppRow.uid)) { - return AVAILABLE; - } - return CONDITIONALLY_UNAVAILABLE; + return isGloballyEnabled() && mBackend.hasSentValidBubble(mAppRow.pkg, mAppRow.uid); } @Override diff --git a/src/com/android/settings/notification/app/ChannelListPreferenceController.java b/src/com/android/settings/notification/app/ChannelListPreferenceController.java index 8d079114a9e..8db3b21f4be 100644 --- a/src/com/android/settings/notification/app/ChannelListPreferenceController.java +++ b/src/com/android/settings/notification/app/ChannelListPreferenceController.java @@ -28,7 +28,6 @@ import android.os.AsyncTask; import android.os.Bundle; import android.provider.Settings; import android.text.TextUtils; -import android.util.Slog; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -40,19 +39,16 @@ import androidx.preference.SwitchPreference; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.applications.AppInfoBase; -import com.android.settings.core.BasePreferenceController; import com.android.settings.core.SubSettingLauncher; import com.android.settings.notification.NotificationBackend; import com.android.settingslib.PrimarySwitchPreference; import com.android.settingslib.RestrictedSwitchPreference; -import com.android.settingslib.utils.ThreadUtils; import java.util.ArrayList; import java.util.Collections; import java.util.List; -public class ChannelListPreferenceController extends NotificationPreferenceController - implements BasePreferenceController.UiBlocker { +public class ChannelListPreferenceController extends NotificationPreferenceController { private static final String KEY = "channels"; private static final String KEY_GENERAL_CATEGORY = "categories"; @@ -63,7 +59,7 @@ public class ChannelListPreferenceController extends NotificationPreferenceContr private PreferenceCategory mPreference; public ChannelListPreferenceController(Context context, NotificationBackend backend) { - super(context, backend, KEY); + super(context, backend); } @Override @@ -72,20 +68,20 @@ public class ChannelListPreferenceController extends NotificationPreferenceContr } @Override - public int getAvailabilityStatus() { + public boolean isAvailable() { if (mAppRow == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mAppRow.banned) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mChannel != null) { if (mBackend.onlyHasDefaultChannel(mAppRow.pkg, mAppRow.uid) || NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId())) { - return CONDITIONALLY_UNAVAILABLE; + return false; } } - return AVAILABLE; + return true; } @Override @@ -95,17 +91,24 @@ public class ChannelListPreferenceController extends NotificationPreferenceContr @Override public void updateState(Preference preference) { - mPreference = (PreferenceCategory) preference; - // Load channel settings - ThreadUtils.postOnBackgroundThread(() -> { + mPreference = (PreferenceCategory) preference; + // Load channel settings + new AsyncTask() { + @Override + protected Void doInBackground(Void... unused) { mChannelGroupList = mBackend.getGroups(mAppRow.pkg, mAppRow.uid).getList(); Collections.sort(mChannelGroupList, CHANNEL_GROUP_COMPARATOR); - ThreadUtils.getUiThreadHandler().getLooper().prepare(); + return null; + } + + @Override + protected void onPostExecute(Void unused) { + if (mContext == null) { + return; + } updateFullList(mPreference, mChannelGroupList); - ThreadUtils.postOnMainThread(() -> { - showPreferences(); - }); - }); + } + }.execute(); } /** @@ -141,12 +144,6 @@ public class ChannelListPreferenceController extends NotificationPreferenceContr } } - private void showPreferences() { - if (mUiBlockListener != null) { - mUiBlockListener.onBlockerWorkFinished(this); - } - } - /** * Looks for the category for the given group's key at the expected index, if that doesn't * match, it checks all groups, and if it can't find that group anywhere, it creates it. diff --git a/src/com/android/settings/notification/app/ConversationDemotePreferenceController.java b/src/com/android/settings/notification/app/ConversationDemotePreferenceController.java index ba7ca358b8b..02f639c3157 100644 --- a/src/com/android/settings/notification/app/ConversationDemotePreferenceController.java +++ b/src/com/android/settings/notification/app/ConversationDemotePreferenceController.java @@ -37,7 +37,7 @@ public class ConversationDemotePreferenceController extends NotificationPreferen public ConversationDemotePreferenceController(Context context, SettingsPreferenceFragment hostFragment, NotificationBackend backend) { - super(context, backend, KEY); + super(context, backend); mHostFragment = hostFragment; } @@ -47,17 +47,14 @@ public class ConversationDemotePreferenceController extends NotificationPreferen } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } if (mAppRow == null || mChannel == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - if (!TextUtils.isEmpty(mChannel.getConversationId()) && !mChannel.isDemoted()) { - return AVAILABLE; - } - return CONDITIONALLY_UNAVAILABLE; + return !TextUtils.isEmpty(mChannel.getConversationId()) && !mChannel.isDemoted(); } @Override diff --git a/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java b/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java index 56de88b324a..f99a56aabda 100644 --- a/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java +++ b/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java @@ -45,7 +45,7 @@ public class ConversationHeaderPreferenceController extends NotificationPreferen private boolean mStarted = false; public ConversationHeaderPreferenceController(Context context, DashboardFragment fragment) { - super(context, null, PREF_KEY_APP_HEADER); + super(context, null); mFragment = fragment; } @@ -55,8 +55,8 @@ public class ConversationHeaderPreferenceController extends NotificationPreferen } @Override - public int getAvailabilityStatus() { - return mAppRow != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + return mAppRow != null; } @Override diff --git a/src/com/android/settings/notification/app/ConversationPriorityPreferenceController.java b/src/com/android/settings/notification/app/ConversationPriorityPreferenceController.java index 46bc3c0c840..ae169282484 100644 --- a/src/com/android/settings/notification/app/ConversationPriorityPreferenceController.java +++ b/src/com/android/settings/notification/app/ConversationPriorityPreferenceController.java @@ -34,7 +34,7 @@ public class ConversationPriorityPreferenceController extends NotificationPrefer public ConversationPriorityPreferenceController(Context context, NotificationBackend backend, NotificationSettings.DependentFieldListener listener) { - super(context, backend, KEY); + super(context, backend); mDependentFieldListener = listener; } @@ -44,14 +44,14 @@ public class ConversationPriorityPreferenceController extends NotificationPrefer } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } if (mAppRow == null || mChannel == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - return AVAILABLE; + return true; } @Override diff --git a/src/com/android/settings/notification/app/ConversationPromotePreferenceController.java b/src/com/android/settings/notification/app/ConversationPromotePreferenceController.java index a5ef569d620..24c3d2ff6a1 100644 --- a/src/com/android/settings/notification/app/ConversationPromotePreferenceController.java +++ b/src/com/android/settings/notification/app/ConversationPromotePreferenceController.java @@ -37,7 +37,7 @@ public class ConversationPromotePreferenceController extends NotificationPrefere public ConversationPromotePreferenceController(Context context, SettingsPreferenceFragment hostFragment, NotificationBackend backend) { - super(context, backend, KEY); + super(context, backend); mHostFragment = hostFragment; } @@ -47,17 +47,14 @@ public class ConversationPromotePreferenceController extends NotificationPrefere } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } if (mAppRow == null || mChannel == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - if (!TextUtils.isEmpty(mChannel.getConversationId()) && mChannel.isDemoted()) { - return AVAILABLE; - } - return CONDITIONALLY_UNAVAILABLE; + return !TextUtils.isEmpty(mChannel.getConversationId()) && mChannel.isDemoted(); } @Override diff --git a/src/com/android/settings/notification/app/DeletedChannelsPreferenceController.java b/src/com/android/settings/notification/app/DeletedChannelsPreferenceController.java index cd160df1fd4..77a692f1488 100644 --- a/src/com/android/settings/notification/app/DeletedChannelsPreferenceController.java +++ b/src/com/android/settings/notification/app/DeletedChannelsPreferenceController.java @@ -30,7 +30,7 @@ public class DeletedChannelsPreferenceController extends NotificationPreferenceC private static final String KEY_DELETED = "deleted"; public DeletedChannelsPreferenceController(Context context, NotificationBackend backend) { - super(context, backend, KEY_DELETED); + super(context, backend); } @Override @@ -39,19 +39,16 @@ public class DeletedChannelsPreferenceController extends NotificationPreferenceC } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } // only visible on app screen if (mChannel != null || hasValidGroup()) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - if (mBackend.getDeletedChannelCount(mAppRow.pkg, mAppRow.uid) > 0) { - return AVAILABLE; - } - return CONDITIONALLY_UNAVAILABLE; + return mBackend.getDeletedChannelCount(mAppRow.pkg, mAppRow.uid) > 0; } @Override diff --git a/src/com/android/settings/notification/app/DescriptionPreferenceController.java b/src/com/android/settings/notification/app/DescriptionPreferenceController.java index 413a876cec9..0a5bb2f9260 100644 --- a/src/com/android/settings/notification/app/DescriptionPreferenceController.java +++ b/src/com/android/settings/notification/app/DescriptionPreferenceController.java @@ -29,7 +29,7 @@ public class DescriptionPreferenceController extends NotificationPreferenceContr private static final String KEY_DESC = "desc"; public DescriptionPreferenceController(Context context) { - super(context, null, KEY_DESC); + super(context, null); } @Override @@ -38,20 +38,20 @@ public class DescriptionPreferenceController extends NotificationPreferenceContr } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } if (mChannel == null && !hasValidGroup()) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mChannel != null && !TextUtils.isEmpty(mChannel.getDescription())) { - return AVAILABLE; + return true; } if (hasValidGroup() && !TextUtils.isEmpty(mChannelGroup.getDescription())) { - return AVAILABLE; + return true; } - return CONDITIONALLY_UNAVAILABLE; + return false; } @Override diff --git a/src/com/android/settings/notification/app/DndPreferenceController.java b/src/com/android/settings/notification/app/DndPreferenceController.java index 811eeb4ec79..b65928aa915 100644 --- a/src/com/android/settings/notification/app/DndPreferenceController.java +++ b/src/com/android/settings/notification/app/DndPreferenceController.java @@ -31,7 +31,7 @@ public class DndPreferenceController extends NotificationPreferenceController private static final String KEY_BYPASS_DND = "bypass_dnd"; public DndPreferenceController(Context context, NotificationBackend backend) { - super(context, backend, KEY_BYPASS_DND); + super(context, backend); } @Override @@ -40,11 +40,11 @@ public class DndPreferenceController extends NotificationPreferenceController } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE || mChannel == null) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable() || mChannel == null) { + return false; } - return AVAILABLE; + return true; } @Override diff --git a/src/com/android/settings/notification/app/HeaderPreferenceController.java b/src/com/android/settings/notification/app/HeaderPreferenceController.java index c4b0e598dff..7379d55395b 100644 --- a/src/com/android/settings/notification/app/HeaderPreferenceController.java +++ b/src/com/android/settings/notification/app/HeaderPreferenceController.java @@ -45,7 +45,7 @@ public class HeaderPreferenceController extends NotificationPreferenceController private boolean mStarted = false; public HeaderPreferenceController(Context context, DashboardFragment fragment) { - super(context, null, PREF_KEY_APP_HEADER); + super(context, null); mFragment = fragment; } @@ -55,8 +55,8 @@ public class HeaderPreferenceController extends NotificationPreferenceController } @Override - public int getAvailabilityStatus() { - return mAppRow != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + return mAppRow != null; } @Override diff --git a/src/com/android/settings/notification/app/HighImportancePreferenceController.java b/src/com/android/settings/notification/app/HighImportancePreferenceController.java index 98dc8a760e2..d60668b9abe 100644 --- a/src/com/android/settings/notification/app/HighImportancePreferenceController.java +++ b/src/com/android/settings/notification/app/HighImportancePreferenceController.java @@ -37,7 +37,7 @@ public class HighImportancePreferenceController extends NotificationPreferenceCo public HighImportancePreferenceController(Context context, NotificationSettings.DependentFieldListener dependentFieldListener, NotificationBackend backend) { - super(context, backend, KEY_IMPORTANCE); + super(context, backend); mDependentFieldListener = dependentFieldListener; } @@ -47,19 +47,17 @@ public class HighImportancePreferenceController extends NotificationPreferenceCo } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } if (mChannel == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (isDefaultChannel()) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - return mChannel.getImportance() >= IMPORTANCE_DEFAULT - ? AVAILABLE - : CONDITIONALLY_UNAVAILABLE; + return mChannel.getImportance() >= IMPORTANCE_DEFAULT; } @Override diff --git a/src/com/android/settings/notification/app/ImportancePreferenceController.java b/src/com/android/settings/notification/app/ImportancePreferenceController.java index 31ddac39373..3c32ca4b0bc 100644 --- a/src/com/android/settings/notification/app/ImportancePreferenceController.java +++ b/src/com/android/settings/notification/app/ImportancePreferenceController.java @@ -38,7 +38,7 @@ public class ImportancePreferenceController extends NotificationPreferenceContro public ImportancePreferenceController(Context context, NotificationSettings.DependentFieldListener dependentFieldListener, NotificationBackend backend) { - super(context, backend, KEY_IMPORTANCE); + super(context, backend); mDependentFieldListener = dependentFieldListener; } @@ -48,14 +48,14 @@ public class ImportancePreferenceController extends NotificationPreferenceContro } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } if (mChannel == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - return !isDefaultChannel() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + return !isDefaultChannel(); } @Override diff --git a/src/com/android/settings/notification/app/InvalidConversationInfoPreferenceController.java b/src/com/android/settings/notification/app/InvalidConversationInfoPreferenceController.java index bb2c58b728b..b937e80e0d6 100644 --- a/src/com/android/settings/notification/app/InvalidConversationInfoPreferenceController.java +++ b/src/com/android/settings/notification/app/InvalidConversationInfoPreferenceController.java @@ -31,7 +31,7 @@ public class InvalidConversationInfoPreferenceController extends NotificationPre public InvalidConversationInfoPreferenceController(Context context, NotificationBackend backend) { - super(context, backend, KEY); + super(context, backend); } @Override @@ -40,19 +40,17 @@ public class InvalidConversationInfoPreferenceController extends NotificationPre } @Override - public int getAvailabilityStatus() { + public boolean isAvailable() { if (mAppRow == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mAppRow.banned) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mPreferenceFilter != null && !isIncludedInFilter()) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - return mBackend.isInInvalidMsgState(mAppRow.pkg, mAppRow.uid) - ? AVAILABLE - : CONDITIONALLY_UNAVAILABLE; + return mBackend.isInInvalidMsgState(mAppRow.pkg, mAppRow.uid); } @Override diff --git a/src/com/android/settings/notification/app/InvalidConversationPreferenceController.java b/src/com/android/settings/notification/app/InvalidConversationPreferenceController.java index 219ccbcea85..5c502dccbe0 100644 --- a/src/com/android/settings/notification/app/InvalidConversationPreferenceController.java +++ b/src/com/android/settings/notification/app/InvalidConversationPreferenceController.java @@ -31,7 +31,7 @@ public class InvalidConversationPreferenceController extends NotificationPrefere private static final String KEY = "invalid_conversation_switch"; public InvalidConversationPreferenceController(Context context, NotificationBackend backend) { - super(context, backend, KEY); + super(context, backend); } @Override @@ -40,19 +40,17 @@ public class InvalidConversationPreferenceController extends NotificationPrefere } @Override - public int getAvailabilityStatus() { + public boolean isAvailable() { if (mAppRow == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mAppRow.banned) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mPreferenceFilter != null && !isIncludedInFilter()) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - return mBackend.isInInvalidMsgState(mAppRow.pkg, mAppRow.uid) - ? AVAILABLE - : CONDITIONALLY_UNAVAILABLE; + return mBackend.isInInvalidMsgState(mAppRow.pkg, mAppRow.uid); } @Override diff --git a/src/com/android/settings/notification/app/LightsPreferenceController.java b/src/com/android/settings/notification/app/LightsPreferenceController.java index f7f92442c9b..d096922e348 100644 --- a/src/com/android/settings/notification/app/LightsPreferenceController.java +++ b/src/com/android/settings/notification/app/LightsPreferenceController.java @@ -33,7 +33,7 @@ public class LightsPreferenceController extends NotificationPreferenceController private static final String KEY_LIGHTS = "lights"; public LightsPreferenceController(Context context, NotificationBackend backend) { - super(context, backend, KEY_LIGHTS); + super(context, backend); } @Override @@ -42,18 +42,16 @@ public class LightsPreferenceController extends NotificationPreferenceController } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } if (mChannel == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - if (checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) && canPulseLight() - && !isDefaultChannel()) { - return AVAILABLE; - } - return CONDITIONALLY_UNAVAILABLE; + return checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) + && canPulseLight() + && !isDefaultChannel(); } @Override diff --git a/src/com/android/settings/notification/app/MinImportancePreferenceController.java b/src/com/android/settings/notification/app/MinImportancePreferenceController.java index b2c0862b8f8..f8257636615 100644 --- a/src/com/android/settings/notification/app/MinImportancePreferenceController.java +++ b/src/com/android/settings/notification/app/MinImportancePreferenceController.java @@ -37,7 +37,7 @@ public class MinImportancePreferenceController extends NotificationPreferenceCon public MinImportancePreferenceController(Context context, NotificationSettings.DependentFieldListener dependentFieldListener, NotificationBackend backend) { - super(context, backend, KEY_IMPORTANCE); + super(context, backend); mDependentFieldListener = dependentFieldListener; } @@ -47,17 +47,17 @@ public class MinImportancePreferenceController extends NotificationPreferenceCon } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } if (mChannel == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (isDefaultChannel()) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - return mChannel.getImportance() <= IMPORTANCE_LOW ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + return mChannel.getImportance() <= IMPORTANCE_LOW; } @Override diff --git a/src/com/android/settings/notification/app/NotificationPreferenceController.java b/src/com/android/settings/notification/app/NotificationPreferenceController.java index 271a83d76f8..fb19d9d6b4c 100644 --- a/src/com/android/settings/notification/app/NotificationPreferenceController.java +++ b/src/com/android/settings/notification/app/NotificationPreferenceController.java @@ -17,24 +17,26 @@ package com.android.settings.notification.app; import static android.app.NotificationManager.IMPORTANCE_NONE; +import static android.os.UserHandle.USER_SYSTEM; import android.annotation.Nullable; import android.app.NotificationChannel; import android.app.NotificationChannelGroup; import android.app.NotificationManager; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; import android.graphics.drawable.Drawable; import android.os.UserManager; +import android.provider.Settings; import android.util.Log; -import android.util.Slog; import androidx.preference.Preference; -import com.android.settings.core.BasePreferenceController; import com.android.settings.notification.NotificationBackend; import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.core.AbstractPreferenceController; import java.util.Comparator; import java.util.List; @@ -44,7 +46,7 @@ import java.util.Objects; * Parent class for preferences appearing on notification setting pages at the app, * notification channel group, or notification channel level. */ -public abstract class NotificationPreferenceController extends BasePreferenceController { +public abstract class NotificationPreferenceController extends AbstractPreferenceController { private static final String TAG = "ChannelPrefContr"; @Nullable protected NotificationChannel mChannel; @@ -69,11 +71,8 @@ public abstract class NotificationPreferenceController extends BasePreferenceCon boolean overrideCanBlockValue; boolean overrideCanConfigureValue; - boolean mLoadedChannelState; - - public NotificationPreferenceController(Context context, NotificationBackend backend, - String key) { - super(context, key); + public NotificationPreferenceController(Context context, NotificationBackend backend) { + super(context); mContext = context; mNm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); mBackend = backend; @@ -82,30 +81,28 @@ public abstract class NotificationPreferenceController extends BasePreferenceCon } /** - * Returns available if field's parent object is not blocked. + * Returns true if field's parent object is not blocked. */ @Override - public int getAvailabilityStatus() { + public boolean isAvailable() { if (mAppRow == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mAppRow.banned) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mChannelGroup != null) { if (mChannelGroup.isBlocked()) { - return CONDITIONALLY_UNAVAILABLE; + return false; } } if (mChannel != null) { if (mPreferenceFilter != null && !isIncludedInFilter()) { - return CONDITIONALLY_UNAVAILABLE; - } - if(mChannel.getImportance() == IMPORTANCE_NONE) { - return CONDITIONALLY_UNAVAILABLE; + return false; } + return mChannel.getImportance() != IMPORTANCE_NONE; } - return AVAILABLE; + return true; } protected void onResume(NotificationBackend.AppRow appRow, diff --git a/src/com/android/settings/notification/app/NotificationSettings.java b/src/com/android/settings/notification/app/NotificationSettings.java index 5750167c271..192a0ee9fc7 100644 --- a/src/com/android/settings/notification/app/NotificationSettings.java +++ b/src/com/android/settings/notification/app/NotificationSettings.java @@ -41,7 +41,6 @@ import android.os.UserHandle; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; -import android.util.Slog; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; @@ -130,52 +129,15 @@ abstract public class NotificationSettings extends DashboardFragment { } } - mUserId = UserHandle.getUserId(mUid); mPkgInfo = findPackageInfo(mPkg, mUid); - } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (mIntent == null && mArgs == null) { - toastAndFinish("no intent"); - return; - } - - if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null) { - toastAndFinish("Missing package or uid or packageinfo"); - return; - } - - startListeningToPackageRemove(); - } - - @Override - public void onDestroy() { - stopListeningToPackageRemove(); - super.onDestroy(); - } - - @Override - public void onResume() { - super.onResume(); - if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null) { - toastAndFinish("Missing package or uid or packageinfo"); - return; - } - mPkgInfo = findPackageInfo(mPkg, mUid); if (mPkgInfo != null) { + mUserId = UserHandle.getUserId(mUid); mSuspendedAppsAdmin = RestrictedLockUtilsInternal.checkIfApplicationIsSuspended( mContext, mPkg, mUserId); - loadAppRow(); - if (mAppRow == null) { - toastAndFinish("Can't load package"); - return; - } loadChannel(); - loadConversation(); + loadAppRow(); loadChannelGroup(); loadPreferencesFilter(); collectConfigActivities(); @@ -195,6 +157,55 @@ abstract public class NotificationSettings extends DashboardFragment { } } + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (mIntent == null && mArgs == null) { + Log.w(TAG, "No intent"); + toastAndFinish(); + return; + } + + if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null) { + Log.w(TAG, "Missing package or uid or packageinfo"); + toastAndFinish(); + return; + } + + startListeningToPackageRemove(); + } + + @Override + public void onDestroy() { + stopListeningToPackageRemove(); + super.onDestroy(); + } + + @Override + public void onResume() { + super.onResume(); + if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null || mAppRow == null) { + Log.w(TAG, "Missing package or uid or packageinfo"); + finish(); + return; + } + // Reload app, channel, etc onResume in case they've changed. A little wasteful if we've + // just done onAttach but better than making every preference controller reload all + // the data + loadAppRow(); + if (mAppRow == null) { + Log.w(TAG, "Can't load package"); + finish(); + return; + } + loadChannel(); + loadConversation(); + loadChannelGroup(); + loadPreferencesFilter(); + collectConfigActivities(); + } + protected void animatePanel() { if (mPreferenceFilter != null) { mLayoutView = getActivity().findViewById(R.id.main_content); @@ -296,8 +307,7 @@ abstract public class NotificationSettings extends DashboardFragment { } } - protected void toastAndFinish(String msg) { - Log.w(TAG, msg); + protected void toastAndFinish() { Toast.makeText(mContext, R.string.app_not_found_dlg_text, Toast.LENGTH_SHORT).show(); getActivity().finish(); } diff --git a/src/com/android/settings/notification/app/NotificationsOffPreferenceController.java b/src/com/android/settings/notification/app/NotificationsOffPreferenceController.java index 46625c3101a..0c7cd2361e2 100644 --- a/src/com/android/settings/notification/app/NotificationsOffPreferenceController.java +++ b/src/com/android/settings/notification/app/NotificationsOffPreferenceController.java @@ -30,7 +30,7 @@ public class NotificationsOffPreferenceController extends NotificationPreference private static final String KEY_BLOCKED_DESC = "block_desc"; public NotificationsOffPreferenceController(Context context) { - super(context, null, KEY_BLOCKED_DESC); + super(context, null); } @Override @@ -39,20 +39,16 @@ public class NotificationsOffPreferenceController extends NotificationPreference } @Override - public int getAvailabilityStatus() { + public boolean isAvailable() { if (mAppRow == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } if (mPreferenceFilter != null && !isIncludedInFilter()) { - return CONDITIONALLY_UNAVAILABLE; + return false; } // Available only when other controllers are unavailable - this UI replaces the UI that // would give more detailed notification controls. - if (super.getAvailabilityStatus() == AVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; - } else { - return AVAILABLE; - } + return !super.isAvailable(); } @Override diff --git a/src/com/android/settings/notification/app/SoundPreferenceController.java b/src/com/android/settings/notification/app/SoundPreferenceController.java index 335b44226ce..b23b4fc86cb 100644 --- a/src/com/android/settings/notification/app/SoundPreferenceController.java +++ b/src/com/android/settings/notification/app/SoundPreferenceController.java @@ -47,7 +47,7 @@ public class SoundPreferenceController extends NotificationPreferenceController public SoundPreferenceController(Context context, SettingsPreferenceFragment hostFragment, NotificationSettings.DependentFieldListener dependentFieldListener, NotificationBackend backend) { - super(context, backend, KEY_SOUND); + super(context, backend); mFragment = hostFragment; mListener = dependentFieldListener; } @@ -58,17 +58,14 @@ public class SoundPreferenceController extends NotificationPreferenceController } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } if (mChannel == null) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - if (checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) && !isDefaultChannel()) { - return AVAILABLE; - } - return CONDITIONALLY_UNAVAILABLE; + return checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) && !isDefaultChannel(); } @Override diff --git a/src/com/android/settings/notification/app/VibrationPreferenceController.java b/src/com/android/settings/notification/app/VibrationPreferenceController.java index f91999f074d..34d1a543b56 100644 --- a/src/com/android/settings/notification/app/VibrationPreferenceController.java +++ b/src/com/android/settings/notification/app/VibrationPreferenceController.java @@ -34,7 +34,7 @@ public class VibrationPreferenceController extends NotificationPreferenceControl private final Vibrator mVibrator; public VibrationPreferenceController(Context context, NotificationBackend backend) { - super(context, backend, KEY_VIBRATE); + super(context, backend); mVibrator = context.getSystemService(Vibrator.class); } @@ -44,15 +44,14 @@ public class VibrationPreferenceController extends NotificationPreferenceControl } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE || mChannel == null) { - return CONDITIONALLY_UNAVAILABLE; - } - if (checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) && !isDefaultChannel() - && mVibrator != null && mVibrator.hasVibrator()) { - return AVAILABLE; - } - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable() || mChannel == null) { + return false; + } + return checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) + && !isDefaultChannel() + && mVibrator != null + && mVibrator.hasVibrator(); } @Override diff --git a/src/com/android/settings/notification/app/VisibilityPreferenceController.java b/src/com/android/settings/notification/app/VisibilityPreferenceController.java index 3f33267a749..a2a1d76b71c 100644 --- a/src/com/android/settings/notification/app/VisibilityPreferenceController.java +++ b/src/com/android/settings/notification/app/VisibilityPreferenceController.java @@ -48,7 +48,7 @@ public class VisibilityPreferenceController extends NotificationPreferenceContro public VisibilityPreferenceController(Context context, LockPatternUtils utils, NotificationBackend backend) { - super(context, backend, KEY_VISIBILITY_OVERRIDE); + super(context, backend); mLockPatternUtils = utils; } @@ -58,18 +58,14 @@ public class VisibilityPreferenceController extends NotificationPreferenceContro } @Override - public int getAvailabilityStatus() { - if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { - return CONDITIONALLY_UNAVAILABLE; + public boolean isAvailable() { + if (!super.isAvailable()) { + return false; } if (mChannel == null || mAppRow.banned) { - return CONDITIONALLY_UNAVAILABLE; + return false; } - if (checkCanBeVisible(NotificationManager.IMPORTANCE_LOW) && isLockScreenSecure()) { - return AVAILABLE; - } - - return CONDITIONALLY_UNAVAILABLE; + return checkCanBeVisible(NotificationManager.IMPORTANCE_LOW) && isLockScreenSecure(); } @Override diff --git a/tests/robotests/src/com/android/settings/notification/app/NotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/app/NotificationPreferenceControllerTest.java index bf529e67568..b2f1673f317 100644 --- a/tests/robotests/src/com/android/settings/notification/app/NotificationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/app/NotificationPreferenceControllerTest.java @@ -426,7 +426,7 @@ public class NotificationPreferenceControllerTest { private final class TestPreferenceController extends NotificationPreferenceController { private TestPreferenceController(Context context, NotificationBackend backend) { - super(context, backend, "key"); + super(context, backend); } @Override