From 97b516365117de515b633aac92d0fc940bd953b3 Mon Sep 17 00:00:00 2001 From: wesleycwwang Date: Wed, 29 Jun 2022 18:16:57 +0800 Subject: [PATCH 1/4] Add dock charging state into stay awake feature (1/2) Bug: 233704731 Test: make RunSettingsRoboTests Change-Id: I48e5279f24f7252c6bf7433a598df796942ed756 --- .../settings/development/StayAwakePreferenceController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/development/StayAwakePreferenceController.java b/src/com/android/settings/development/StayAwakePreferenceController.java index 25a92b260bc..9ed0ef88826 100644 --- a/src/com/android/settings/development/StayAwakePreferenceController.java +++ b/src/com/android/settings/development/StayAwakePreferenceController.java @@ -50,7 +50,7 @@ public class StayAwakePreferenceController extends DeveloperOptionsPreferenceCon @VisibleForTesting static final int SETTING_VALUE_ON = BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB - | BatteryManager.BATTERY_PLUGGED_WIRELESS; + | BatteryManager.BATTERY_PLUGGED_WIRELESS | BatteryManager.BATTERY_PLUGGED_DOCK; @VisibleForTesting SettingsObserver mSettingsObserver; From 68247caafcbc9d90c910d11c83c5a624351fb123 Mon Sep 17 00:00:00 2001 From: Milton Wu Date: Tue, 19 Jul 2022 12:51:35 +0000 Subject: [PATCH 2/4] Send metric intent back to SUW Add metric intent if ChooseLockGeneric is triggered in SUW. 1. Save the result bundle data from ChooseLockGeneric to cache inside BiometricEnrollActivity and pass back to SUW after all finished. 2. Since fingerprint enrollment trigger points in SUW for fingerprint-only or fingerprint + faceAuth devices are all moved from SetupFingerprintEnrollIntroduction to BiometricEnrollActivity, remove deprecated code from SetupFingerprintEnrollIntroduction. Bug: 235458700 Test: Manually test fingerprint enroll with SUW or w/o SUW Test: Manually test fingerprint enroll with unicorn SUW Test: atest BiometricEnrollActivityTest Test: robo tests FingerprintEnrollIntroductionTest Change-Id: I34b2884ab4c2c65d464d91eaef0f58c72dad438b --- .../biometrics/BiometricEnrollActivity.java | 45 +++++++++++---- .../SetupFingerprintEnrollIntroduction.java | 56 +------------------ ...etupFingerprintEnrollIntroductionTest.java | 9 --- 3 files changed, 36 insertions(+), 74 deletions(-) diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java index 79e2ea357b4..6b830c9e4d7 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java +++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java @@ -95,6 +95,8 @@ public class BiometricEnrollActivity extends InstrumentedActivity { private static final String SAVED_STATE_CONFIRMING_CREDENTIALS = "confirming_credentials"; private static final String SAVED_STATE_FINGERPRINT_ONLY_ENROLLING = "fingerprint_only_enrolling"; + private static final String SAVED_STATE_PASS_THROUGH_EXTRAS_FROM_CHOSEN_LOCK_IN_SUW = + "pass_through_extras_from_chosen_lock_in_suw"; private static final String SAVED_STATE_ENROLL_ACTION_LOGGED = "enroll_action_logged"; private static final String SAVED_STATE_PARENTAL_OPTIONS = "enroll_preferences"; private static final String SAVED_STATE_GK_PW_HANDLE = "gk_pw_handle"; @@ -104,6 +106,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity { private int mUserId = UserHandle.myUserId(); private boolean mConfirmingCredentials; private boolean mFingerprintOnlyEnrolling; + private Bundle mPassThroughExtrasFromChosenLockInSuw = null; private boolean mIsEnrollActionLogged; private boolean mHasFeatureFace = false; private boolean mHasFeatureFingerprint = false; @@ -134,6 +137,8 @@ public class BiometricEnrollActivity extends InstrumentedActivity { SAVED_STATE_CONFIRMING_CREDENTIALS, false); mFingerprintOnlyEnrolling = savedInstanceState.getBoolean( SAVED_STATE_FINGERPRINT_ONLY_ENROLLING, false); + mPassThroughExtrasFromChosenLockInSuw = savedInstanceState.getBundle( + SAVED_STATE_PASS_THROUGH_EXTRAS_FROM_CHOSEN_LOCK_IN_SUW); mIsEnrollActionLogged = savedInstanceState.getBoolean( SAVED_STATE_ENROLL_ACTION_LOGGED, false); mParentalOptions = savedInstanceState.getBundle(SAVED_STATE_PARENTAL_OPTIONS); @@ -330,6 +335,8 @@ public class BiometricEnrollActivity extends InstrumentedActivity { super.onSaveInstanceState(outState); outState.putBoolean(SAVED_STATE_CONFIRMING_CREDENTIALS, mConfirmingCredentials); outState.putBoolean(SAVED_STATE_FINGERPRINT_ONLY_ENROLLING, mFingerprintOnlyEnrolling); + outState.putBundle(SAVED_STATE_PASS_THROUGH_EXTRAS_FROM_CHOSEN_LOCK_IN_SUW, + mPassThroughExtrasFromChosenLockInSuw); outState.putBoolean(SAVED_STATE_ENROLL_ACTION_LOGGED, mIsEnrollActionLogged); if (mParentalOptions != null) { outState.putBundle(SAVED_STATE_PARENTAL_OPTIONS, mParentalOptions); @@ -343,6 +350,12 @@ public class BiometricEnrollActivity extends InstrumentedActivity { protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); + if (isSuccessfulChooseCredential(requestCode, resultCode) + && data != null && data.getExtras() != null && data.getExtras().size() > 0 + && WizardManagerHelper.isAnySetupWizard(getIntent())) { + mPassThroughExtrasFromChosenLockInSuw = data.getExtras(); + } + Log.d(TAG, "onActivityResult(requestCode=" + requestCode + ", resultCode=" + resultCode + ")"); // single enrollment is handled entirely by the launched activity @@ -416,7 +429,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity { } } else { Log.d(TAG, "Unknown or cancelled parental consent"); - setResult(RESULT_CANCELED); + setResult(RESULT_CANCELED, newResultIntent()); finish(); } break; @@ -452,7 +465,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity { launchFingerprintOnlyEnroll(); } else { Log.d(TAG, "Unknown result for set/choose lock: " + resultCode); - setResult(resultCode); + setResult(resultCode, newResultIntent()); finish(); } break; @@ -480,25 +493,37 @@ public class BiometricEnrollActivity extends InstrumentedActivity { finish(); } } else { - setResult(resultCode); + setResult(resultCode, newResultIntent()); finish(); } } + @NonNull private Intent newResultIntent() { final Intent intent = new Intent(); - final Bundle consentStatus = mParentalOptions.deepCopy(); - intent.putExtra(EXTRA_PARENTAL_CONSENT_STATUS, consentStatus); - Log.v(TAG, "Result consent status: " + consentStatus); + if (mParentalOptionsRequired && mParentalOptions != null) { + final Bundle consentStatus = mParentalOptions.deepCopy(); + intent.putExtra(EXTRA_PARENTAL_CONSENT_STATUS, consentStatus); + Log.v(TAG, "Result consent status: " + consentStatus); + } + if (mPassThroughExtrasFromChosenLockInSuw != null) { + intent.putExtras(mPassThroughExtrasFromChosenLockInSuw); + } return intent; } private static boolean isSuccessfulConfirmOrChooseCredential(int requestCode, int resultCode) { - final boolean okChoose = requestCode == REQUEST_CHOOSE_LOCK + return isSuccessfulChooseCredential(requestCode, resultCode) + || isSuccessfulConfirmCredential(requestCode, resultCode); + } + + private static boolean isSuccessfulChooseCredential(int requestCode, int resultCode) { + return requestCode == REQUEST_CHOOSE_LOCK && resultCode == ChooseLockPattern.RESULT_FINISHED; - final boolean okConfirm = requestCode == REQUEST_CONFIRM_LOCK - && resultCode == RESULT_OK; - return okChoose || okConfirm; + } + + private static boolean isSuccessfulConfirmCredential(int requestCode, int resultCode) { + return requestCode == REQUEST_CONFIRM_LOCK && resultCode == RESULT_OK; } @Override diff --git a/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java index af25ecd8e28..b31396142e3 100644 --- a/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java @@ -16,21 +16,16 @@ package com.android.settings.biometrics.fingerprint; -import android.app.Activity; import android.app.KeyguardManager; import android.app.settings.SettingsEnums; import android.content.Intent; import android.hardware.fingerprint.FingerprintManager; -import android.os.Bundle; -import android.os.UserHandle; import android.view.View; -import com.android.internal.widget.LockPatternUtils; import com.android.settings.SetupWizardUtils; import com.android.settings.Utils; import com.android.settings.biometrics.BiometricUtils; import com.android.settings.password.ChooseLockSettingsHelper; -import com.android.settings.password.SetupChooseLockGeneric; import com.android.settings.password.SetupSkipDialog; public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntroduction { @@ -40,24 +35,6 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu private static final String EXTRA_FINGERPRINT_ENROLLED_COUNT = "fingerprint_enrolled_count"; private static final String KEY_LOCK_SCREEN_PRESENT = "wasLockScreenPresent"; - private boolean mAlreadyHadLockScreenSetup = false; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (savedInstanceState == null) { - mAlreadyHadLockScreenSetup = isKeyguardSecure(); - } else { - mAlreadyHadLockScreenSetup = savedInstanceState.getBoolean( - KEY_LOCK_SCREEN_PRESENT, false); - } - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putBoolean(KEY_LOCK_SCREEN_PRESENT, mAlreadyHadLockScreenSetup); - } @Override protected Intent getEnrollingIntent() { @@ -85,12 +62,6 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu } } if (requestCode == BIOMETRIC_FIND_SENSOR_REQUEST && isKeyguardSecure()) { - // if lock was already present, do not return intent data since it must have been - // reported in previous attempts - if (!mAlreadyHadLockScreenSetup) { - data = getMetricIntent(data); - } - // Report fingerprint count if user adding a new fingerprint if (resultCode == RESULT_FINISHED) { data = setFingerprintCount(data); @@ -127,18 +98,6 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu super.onActivityResult(requestCode, resultCode, data); } - private Intent getMetricIntent(Intent data) { - if (data == null) { - data = new Intent(); - } - LockPatternUtils lockPatternUtils = new LockPatternUtils(this); - data.putExtra(SetupChooseLockGeneric. - SetupChooseLockGenericFragment.EXTRA_PASSWORD_QUALITY, - lockPatternUtils.getKeyguardStoredPasswordQuality(UserHandle.myUserId())); - - return data; - } - private Intent setFingerprintCount(Intent data) { if (data == null) { data = new Intent(); @@ -161,8 +120,7 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu if (!BiometricUtils.tryStartingNextBiometricEnroll( this, ENROLL_NEXT_BIOMETRIC_REQUEST, "cancel")) { resultCode = RESULT_SKIP; - data = mAlreadyHadLockScreenSetup ? null : getMetricIntent(null); - setResult(resultCode, data); + setResult(resultCode); finish(); return; } @@ -176,18 +134,6 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu // User has explicitly canceled enroll. Don't restart it automatically. } - /** - * Propagate lock screen metrics if the user goes back from the fingerprint setup screen - * after having added lock screen to his device. - */ - @Override - public void onBackPressed() { - if (!mAlreadyHadLockScreenSetup && isKeyguardSecure()) { - setResult(Activity.RESULT_CANCELED, getMetricIntent(null)); - } - super.onBackPressed(); - } - private boolean isKeyguardSecure() { return getSystemService(KeyguardManager.class).isKeyguardSecure(); } diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroductionTest.java index e3b23ac293d..2aeda7144a8 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroductionTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroductionTest.java @@ -34,7 +34,6 @@ import android.widget.Button; import com.android.settings.R; import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricEnrollIntroduction; -import com.android.settings.password.SetupChooseLockGeneric.SetupChooseLockGenericFragment; import com.android.settings.password.SetupSkipDialog; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowFingerprintManager; @@ -160,8 +159,6 @@ public class SetupFingerprintEnrollIntroductionTest { ShadowActivity shadowActivity = Shadows.shadowOf(activity); assertThat(shadowActivity.getResultIntent()).isNotNull(); - assertThat(shadowActivity.getResultIntent().hasExtra( - SetupChooseLockGenericFragment.EXTRA_PASSWORD_QUALITY)).isTrue(); } @Test @@ -191,8 +188,6 @@ public class SetupFingerprintEnrollIntroductionTest { ShadowActivity shadowActivity = Shadows.shadowOf(activity); assertThat(shadowActivity.getResultIntent()).isNotNull(); - assertThat(shadowActivity.getResultIntent().hasExtra( - SetupChooseLockGenericFragment.EXTRA_PASSWORD_QUALITY)).isTrue(); } @Test @@ -218,8 +213,6 @@ public class SetupFingerprintEnrollIntroductionTest { BiometricEnrollBase.RESULT_FINISHED, null); ShadowActivity shadowActivity = Shadows.shadowOf(activity); assertThat(shadowActivity.getResultIntent()).isNotNull(); - assertThat(shadowActivity.getResultIntent().hasExtra( - SetupChooseLockGenericFragment.EXTRA_PASSWORD_QUALITY)).isFalse(); } @Test @@ -260,8 +253,6 @@ public class SetupFingerprintEnrollIntroductionTest { ShadowActivity shadowActivity = Shadows.shadowOf(activity); IntentForResult startedActivity = shadowActivity.getNextStartedActivityForResult(); assertThat(startedActivity).isNotNull(); - assertThat(startedActivity.intent.hasExtra( - SetupChooseLockGenericFragment.EXTRA_PASSWORD_QUALITY)).isFalse(); } private ShadowKeyguardManager getShadowKeyguardManager() { From 07b149ec51dfe2f6118024cf7464cf6a9f45d231 Mon Sep 17 00:00:00 2001 From: lbill Date: Mon, 25 Jul 2022 10:29:00 +0000 Subject: [PATCH 3/4] Fix incorrect SetupChooseLockPattern layout Root cause: - The new added description TextView is too large - sud_layout_description was add in sud_layout_content instead of sud_layout_header. Solution: - Set string lockpassword_choose_your_pattern_description to GlifLayout as it's description.(Header description) Bug: 233666752 Fixes 239892091 Test: manual in setup flow, check choose lock pattern layouts showing expectedly on both phone & tablet Test: make RunSettingsRoboTests Change-Id: Iabe503066434f8983dffb88d1c93f2bbf773b860 --- res/layout/choose_lock_pattern_common.xml | 10 ---------- .../settings/password/SetupChooseLockPattern.java | 3 ++- .../password/SetupChooseLockPatternTest.java | 13 +++++++++++++ 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/res/layout/choose_lock_pattern_common.xml b/res/layout/choose_lock_pattern_common.xml index 761a724f79b..2dd8cd576de 100644 --- a/res/layout/choose_lock_pattern_common.xml +++ b/res/layout/choose_lock_pattern_common.xml @@ -36,16 +36,6 @@ android:paddingLeft="0dp" android:paddingRight="0dp"> - - Date: Mon, 25 Jul 2022 22:16:16 +0000 Subject: [PATCH 4/4] Revert "Improve App notification loading" Revert "Fix binder error when an app has many channels" Revert submission 19290255-jr-bind-flicker Reason for revert: b/240100577 Reverted Changes: I9a1c96f75:Improve App notification loading I391ce0b10:Fix binder error when an app has many channels Change-Id: Iaae40de74d135a79c18201ec17e00f3d9d5f0f3b --- .../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