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
This commit is contained in:
Yining Liu
2024-11-21 00:22:57 +00:00
parent c16c9b2df6
commit 4c507b1132
3 changed files with 145 additions and 0 deletions

View File

@@ -8851,6 +8851,12 @@
<!-- Security > Choose PIN/PW/Pattern > Notification redaction interstitial: Message asking the user how they want their profile notifications to appear when the device is locked [CHAR LIMIT=NONE] --> <!-- Security > Choose PIN/PW/Pattern > Notification redaction interstitial: Message asking the user how they want their profile notifications to appear when the device is locked [CHAR LIMIT=NONE] -->
<string name="lock_screen_notifications_interstitial_message_profile">When your device is locked, how do you want profile notifications to show?</string> <string name="lock_screen_notifications_interstitial_message_profile">When your device is locked, how do you want profile notifications to show?</string>
<!-- Notification Settings > Notifications on lock screen > Title for hiding silent notifications toggle. [CHAR LIMIT=30] -->
<string name="lock_screen_notification_hide_silent_title">Hide silent notifications</string>
<!-- Notification Settings > Notifications on lock screen > Summary for hiding seen notifications toggle. [CHAR LIMIT=30] -->
<string name="lock_screen_notification_hide_silent_summary">Silent notifications and conversations are removed from the lock screen.</string>
<!-- Security > Choose PIN/PW/Pattern > Notification redaction interstitial: Title for the screen asking the user how they want their profile notifications to appear when the device is locked [CHAR LIMIT=30] --> <!-- Security > Choose PIN/PW/Pattern > Notification redaction interstitial: Title for the screen asking the user how they want their profile notifications to appear when the device is locked [CHAR LIMIT=30] -->
<string name="lock_screen_notifications_interstitial_title_profile">Profile notifications</string> <string name="lock_screen_notifications_interstitial_title_profile">Profile notifications</string>

View File

@@ -35,4 +35,10 @@
android:title="@string/lock_screen_notifications_summary_hide_profile" android:title="@string/lock_screen_notifications_summary_hide_profile"
settings:controller="com.android.settings.notification.LockScreenNotificationShowSensitiveToggleController" /> settings:controller="com.android.settings.notification.LockScreenNotificationShowSensitiveToggleController" />
<SwitchPreferenceCompat
android:key="lock_screen_notification_hide_silent_toggle"
android:title="@string/lock_screen_notification_hide_silent_title"
android:summary="@string/lock_screen_notification_hide_silent_summary"
settings:controller="com.android.settings.notification.LockScreenNotificationHideSilentToggleController" />
</PreferenceScreen> </PreferenceScreen>

View File

@@ -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;
}
}