From 4c507b1132c8fcb0f3c58eaa4b49734bf4648b2b Mon Sep 17 00:00:00 2001 From: Yining Liu Date: Thu, 21 Nov 2024 00:22:57 +0000 Subject: [PATCH] Implement the hide silent notifications toggle Implement the hide silent notifications toggle on the notifications on lock screen page. This toggle will become invisible when the main toggle is unset. This toogle will replace the existing Notifications - notifications on the lock screen - hide silent conversations and notifications preference when the flag is enabled. Bug: 367455695 Flag: com.android.server.notification.notification_lock_screen_settings Test: adb shell settings put secure \ lock_screen_show_silent_notifications <1|0> Change-Id: Icc0b26afd199ec3f14237fd1cdb27981383ae69f --- res/values/strings.xml | 6 + .../lock_screen_notifications_settings.xml | 6 + ...otificationHideSilentToggleController.java | 133 ++++++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 src/com/android/settings/notification/LockScreenNotificationHideSilentToggleController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 525de4796a0..14b497d6434 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8851,6 +8851,12 @@ When your device is locked, how do you want profile notifications to show? + + Hide silent notifications + + + Silent notifications and conversations are removed from the lock screen. + Profile notifications diff --git a/res/xml/lock_screen_notifications_settings.xml b/res/xml/lock_screen_notifications_settings.xml index 2d793f78856..b010bf04425 100644 --- a/res/xml/lock_screen_notifications_settings.xml +++ b/res/xml/lock_screen_notifications_settings.xml @@ -35,4 +35,10 @@ android:title="@string/lock_screen_notifications_summary_hide_profile" settings:controller="com.android.settings.notification.LockScreenNotificationShowSensitiveToggleController" /> + + diff --git a/src/com/android/settings/notification/LockScreenNotificationHideSilentToggleController.java b/src/com/android/settings/notification/LockScreenNotificationHideSilentToggleController.java new file mode 100644 index 00000000000..ad33ec35414 --- /dev/null +++ b/src/com/android/settings/notification/LockScreenNotificationHideSilentToggleController.java @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2024 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.notification; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.ContentObserver; +import android.net.Uri; +import android.os.Handler; +import android.os.Looper; +import android.provider.Settings; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleEventObserver; +import androidx.lifecycle.LifecycleOwner; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import com.android.settings.core.TogglePreferenceController; + +/** + * Controls the toggle that determines whether to show silent notifications when screen locked. + * Toggle for: Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS + */ +public class LockScreenNotificationHideSilentToggleController extends TogglePreferenceController + implements LifecycleEventObserver { + + private static final int ON = 1; + private static final int OFF = 0; + + @Nullable private Preference mPreference; + private final ContentResolver mContentResolver; + + final ContentObserver mContentObserver = new ContentObserver( + new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange, @Nullable Uri uri) { + if (mPreference == null) return; + updateState(mPreference); + } + }; + + public LockScreenNotificationHideSilentToggleController(@NonNull Context context, + @NonNull String preferenceKey) { + super(context, preferenceKey); + mContentResolver = context.getContentResolver(); + } + + @Override + public void onStateChanged(@NonNull LifecycleOwner lifecycleOwner, + @NonNull Lifecycle.Event event) { + if (event == Lifecycle.Event.ON_RESUME) { + mContentResolver.registerContentObserver( + Settings.Secure.getUriFor(Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS), + /* notifyForDescendants= */ false, mContentObserver); + mContentResolver.registerContentObserver( + Settings.Secure.getUriFor( + Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS), + /* notifyForDescendants= */ false, + mContentObserver + ); + } else if (event == Lifecycle.Event.ON_PAUSE) { + mContentResolver.unregisterContentObserver(mContentObserver); + } + } + + @Override + public void displayPreference(@NonNull PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + } + + @Override + public void updateState(@NonNull Preference preference) { + super.updateState(preference); + setChecked(hideSilentNotificationsWhenLocked()); + preference.setVisible(isAvailable()); + } + + private boolean hideSilentNotificationsWhenLocked() { + return Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, OFF) == OFF; + } + + @Override + public int getAvailabilityStatus() { + if (!lockScreenShowNotification()) { + return CONDITIONALLY_UNAVAILABLE; + } + return AVAILABLE; + } + + /** + * @return Whether showing notifications on the lockscreen is enabled. + */ + private boolean lockScreenShowNotification() { + return Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, OFF) == ON; + } + + @Override + public boolean isChecked() { + return hideSilentNotificationsWhenLocked(); + } + + @Override + public boolean setChecked(boolean isChecked) { + return Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, (isChecked ? OFF : ON)); + } + + @Override + public int getSliceHighlightMenuRes() { + // not needed since it's not sliceable + return NO_RES; + } +}