Loading res/values/strings.xml +8 −0 Original line number Diff line number Diff line Loading @@ -8114,6 +8114,14 @@ <!-- Do not disturb: mode page section title [CHAR LIMIT=80] --> <string name="mode_device_effects_title">Additional actions</string> <!-- Summary for the Sound Do not Disturb option when DND isn't currently on. [CHAR LIMIT=NONE]--> <string name="modes_sound_summary_off"> {count, plural, =0 {Off} =1 {Off / 1 mode can turn on automatically} other {Off / # modes can turn on automatically} } </string> <!-- Do not disturb: display settings title [CHAR LIMIT=80] --> <string name="mode_display_settings_title">Display settings</string> res/xml/configure_notification_settings.xml +9 −0 Original line number Diff line number Diff line Loading @@ -135,6 +135,15 @@ settings:controller="com.android.settings.notification.zen.ZenModePreferenceController" /> <com.android.settingslib.RestrictedPreference android:key="modes_notifications" android:order="18" android:title="@string/zen_modes_list_title" settings:useAdminDisabledSummary="true" android:fragment="com.android.settings.notification.modes.ZenModesListFragment" settings:controller="com.android.settings.notification.modes.ZenModesLinkPreferenceController" /> <SwitchPreferenceCompat android:key="lock_screen_show_only_unseen_notifs" android:order="19" Loading src/com/android/settings/notification/modes/ZenModeSummaryHelper.java +32 −0 Original line number Diff line number Diff line Loading @@ -41,8 +41,11 @@ import static android.service.notification.ZenPolicy.VISUAL_EFFECT_STATUS_BAR; import android.content.Context; import android.icu.text.MessageFormat; import android.provider.Settings; import android.service.notification.ZenDeviceEffects; import android.service.notification.ZenModeConfig; import android.service.notification.ZenPolicy; import android.util.ArrayMap; import androidx.annotation.NonNull; import androidx.annotation.Nullable; Loading Loading @@ -448,4 +451,33 @@ class ZenModeSummaryHelper { } return msgFormat.format(args); } String getSoundSummary(int zenMode, ZenModeConfig config) { if (zenMode != Settings.Global.ZEN_MODE_OFF) { String description = ZenModeConfig.getDescription(mContext, true, config, false); if (description == null) { return mContext.getString(R.string.zen_mode_sound_summary_on); } else { return mContext.getString(R.string.zen_mode_sound_summary_on_with_info, description); } } else { int count = 0; final ArrayMap<String, ZenModeConfig.ZenRule> ruleMap = config.automaticRules; if (ruleMap != null) { for (ZenModeConfig.ZenRule rule : ruleMap.values()) { if (rule != null && rule.enabled) { count++; } } } MessageFormat msgFormat = new MessageFormat( mContext.getString(R.string.modes_sound_summary_off), Locale.getDefault()); Map<String, Object> msgArgs = new HashMap<>(); msgArgs.put("count", count); return msgFormat.format(msgArgs); } } } src/com/android/settings/notification/modes/ZenModesLinkPreferenceController.java 0 → 100644 +120 −0 Original line number Diff line number Diff line /* * 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.modes; import android.app.Flags; import android.app.NotificationManager; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; import android.os.UserHandle; import android.provider.Settings; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; public class ZenModesLinkPreferenceController extends BasePreferenceController implements LifecycleObserver, OnResume, OnPause { private SettingObserver mSettingObserver; private ZenModeSummaryHelper mSummaryBuilder; private NotificationManager mNm; public ZenModesLinkPreferenceController(Context context, String key) { super(context, key); mSummaryBuilder = new ZenModeSummaryHelper(context, ZenHelperBackend.getInstance(context)); mNm = mContext.getSystemService(NotificationManager.class); } @Override @AvailabilityStatus public int getAvailabilityStatus() { return Flags.modesUi() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); Preference preference = screen.findPreference(getPreferenceKey()); mSettingObserver = new SettingObserver(preference); } @Override public void onResume() { if (mSettingObserver != null) { mSettingObserver.register(mContext.getContentResolver()); } } @Override public void onPause() { if (mSettingObserver != null) { mSettingObserver.unregister(mContext.getContentResolver()); } } @Override public void updateState(Preference preference) { preference.setSummary(mSummaryBuilder.getSoundSummary( Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_OFF), mNm.getZenModeConfig())); } class SettingObserver extends ContentObserver { private final Uri ZEN_MODE_URI = Settings.Global.getUriFor(Settings.Global.ZEN_MODE); private final Uri ZEN_MODE_CONFIG_ETAG_URI = Settings.Global.getUriFor( Settings.Global.ZEN_MODE_CONFIG_ETAG); private final Preference mPreference; public SettingObserver(Preference preference) { super(new Handler()); mPreference = preference; } public void register(ContentResolver cr) { cr.registerContentObserver(ZEN_MODE_URI, false, this, UserHandle.USER_ALL); cr.registerContentObserver(ZEN_MODE_CONFIG_ETAG_URI, false, this, UserHandle.USER_ALL); } public void unregister(ContentResolver cr) { cr.unregisterContentObserver(this); } @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); if (ZEN_MODE_URI.equals(uri)) { updateState(mPreference); } if (ZEN_MODE_CONFIG_ETAG_URI.equals(uri)) { updateState(mPreference); } } } } src/com/android/settings/notification/zen/ZenModePreferenceController.java +1 −15 Original line number Diff line number Diff line Loading @@ -28,9 +28,7 @@ import android.provider.Settings; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settings.notification.modes.ZenModesListFragment; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; Loading @@ -51,7 +49,6 @@ public class ZenModePreferenceController extends BasePreferenceController super.displayPreference(screen); Preference preference = screen.findPreference(getPreferenceKey()); mSettingObserver = new SettingObserver(preference); maybeSetTitleAndDestination(preference); } @Override Loading @@ -70,28 +67,17 @@ public class ZenModePreferenceController extends BasePreferenceController @Override public int getAvailabilityStatus() { return AVAILABLE_UNSEARCHABLE; return Flags.modesUi() ? UNSUPPORTED_ON_DEVICE : AVAILABLE_UNSEARCHABLE; } @Override public void updateState(Preference preference) { super.updateState(preference); maybeSetTitleAndDestination(preference); if (preference.isEnabled()) { preference.setSummary(mSummaryBuilder.getSoundSummary()); } } // Only when modes_ui is active: change title & target fragment. private void maybeSetTitleAndDestination(Preference preference) { if (!Flags.modesUi()) { return; } preference.setTitle(R.string.zen_modes_list_title); preference.setFragment(ZenModesListFragment.class.getCanonicalName()); } class SettingObserver extends ContentObserver { private final Uri ZEN_MODE_URI = Settings.Global.getUriFor(Settings.Global.ZEN_MODE); private final Uri ZEN_MODE_CONFIG_ETAG_URI = Settings.Global.getUriFor( Loading Loading
res/values/strings.xml +8 −0 Original line number Diff line number Diff line Loading @@ -8114,6 +8114,14 @@ <!-- Do not disturb: mode page section title [CHAR LIMIT=80] --> <string name="mode_device_effects_title">Additional actions</string> <!-- Summary for the Sound Do not Disturb option when DND isn't currently on. [CHAR LIMIT=NONE]--> <string name="modes_sound_summary_off"> {count, plural, =0 {Off} =1 {Off / 1 mode can turn on automatically} other {Off / # modes can turn on automatically} } </string> <!-- Do not disturb: display settings title [CHAR LIMIT=80] --> <string name="mode_display_settings_title">Display settings</string>
res/xml/configure_notification_settings.xml +9 −0 Original line number Diff line number Diff line Loading @@ -135,6 +135,15 @@ settings:controller="com.android.settings.notification.zen.ZenModePreferenceController" /> <com.android.settingslib.RestrictedPreference android:key="modes_notifications" android:order="18" android:title="@string/zen_modes_list_title" settings:useAdminDisabledSummary="true" android:fragment="com.android.settings.notification.modes.ZenModesListFragment" settings:controller="com.android.settings.notification.modes.ZenModesLinkPreferenceController" /> <SwitchPreferenceCompat android:key="lock_screen_show_only_unseen_notifs" android:order="19" Loading
src/com/android/settings/notification/modes/ZenModeSummaryHelper.java +32 −0 Original line number Diff line number Diff line Loading @@ -41,8 +41,11 @@ import static android.service.notification.ZenPolicy.VISUAL_EFFECT_STATUS_BAR; import android.content.Context; import android.icu.text.MessageFormat; import android.provider.Settings; import android.service.notification.ZenDeviceEffects; import android.service.notification.ZenModeConfig; import android.service.notification.ZenPolicy; import android.util.ArrayMap; import androidx.annotation.NonNull; import androidx.annotation.Nullable; Loading Loading @@ -448,4 +451,33 @@ class ZenModeSummaryHelper { } return msgFormat.format(args); } String getSoundSummary(int zenMode, ZenModeConfig config) { if (zenMode != Settings.Global.ZEN_MODE_OFF) { String description = ZenModeConfig.getDescription(mContext, true, config, false); if (description == null) { return mContext.getString(R.string.zen_mode_sound_summary_on); } else { return mContext.getString(R.string.zen_mode_sound_summary_on_with_info, description); } } else { int count = 0; final ArrayMap<String, ZenModeConfig.ZenRule> ruleMap = config.automaticRules; if (ruleMap != null) { for (ZenModeConfig.ZenRule rule : ruleMap.values()) { if (rule != null && rule.enabled) { count++; } } } MessageFormat msgFormat = new MessageFormat( mContext.getString(R.string.modes_sound_summary_off), Locale.getDefault()); Map<String, Object> msgArgs = new HashMap<>(); msgArgs.put("count", count); return msgFormat.format(msgArgs); } } }
src/com/android/settings/notification/modes/ZenModesLinkPreferenceController.java 0 → 100644 +120 −0 Original line number Diff line number Diff line /* * 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.modes; import android.app.Flags; import android.app.NotificationManager; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; import android.os.UserHandle; import android.provider.Settings; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; public class ZenModesLinkPreferenceController extends BasePreferenceController implements LifecycleObserver, OnResume, OnPause { private SettingObserver mSettingObserver; private ZenModeSummaryHelper mSummaryBuilder; private NotificationManager mNm; public ZenModesLinkPreferenceController(Context context, String key) { super(context, key); mSummaryBuilder = new ZenModeSummaryHelper(context, ZenHelperBackend.getInstance(context)); mNm = mContext.getSystemService(NotificationManager.class); } @Override @AvailabilityStatus public int getAvailabilityStatus() { return Flags.modesUi() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); Preference preference = screen.findPreference(getPreferenceKey()); mSettingObserver = new SettingObserver(preference); } @Override public void onResume() { if (mSettingObserver != null) { mSettingObserver.register(mContext.getContentResolver()); } } @Override public void onPause() { if (mSettingObserver != null) { mSettingObserver.unregister(mContext.getContentResolver()); } } @Override public void updateState(Preference preference) { preference.setSummary(mSummaryBuilder.getSoundSummary( Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_OFF), mNm.getZenModeConfig())); } class SettingObserver extends ContentObserver { private final Uri ZEN_MODE_URI = Settings.Global.getUriFor(Settings.Global.ZEN_MODE); private final Uri ZEN_MODE_CONFIG_ETAG_URI = Settings.Global.getUriFor( Settings.Global.ZEN_MODE_CONFIG_ETAG); private final Preference mPreference; public SettingObserver(Preference preference) { super(new Handler()); mPreference = preference; } public void register(ContentResolver cr) { cr.registerContentObserver(ZEN_MODE_URI, false, this, UserHandle.USER_ALL); cr.registerContentObserver(ZEN_MODE_CONFIG_ETAG_URI, false, this, UserHandle.USER_ALL); } public void unregister(ContentResolver cr) { cr.unregisterContentObserver(this); } @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); if (ZEN_MODE_URI.equals(uri)) { updateState(mPreference); } if (ZEN_MODE_CONFIG_ETAG_URI.equals(uri)) { updateState(mPreference); } } } }
src/com/android/settings/notification/zen/ZenModePreferenceController.java +1 −15 Original line number Diff line number Diff line Loading @@ -28,9 +28,7 @@ import android.provider.Settings; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settings.notification.modes.ZenModesListFragment; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; Loading @@ -51,7 +49,6 @@ public class ZenModePreferenceController extends BasePreferenceController super.displayPreference(screen); Preference preference = screen.findPreference(getPreferenceKey()); mSettingObserver = new SettingObserver(preference); maybeSetTitleAndDestination(preference); } @Override Loading @@ -70,28 +67,17 @@ public class ZenModePreferenceController extends BasePreferenceController @Override public int getAvailabilityStatus() { return AVAILABLE_UNSEARCHABLE; return Flags.modesUi() ? UNSUPPORTED_ON_DEVICE : AVAILABLE_UNSEARCHABLE; } @Override public void updateState(Preference preference) { super.updateState(preference); maybeSetTitleAndDestination(preference); if (preference.isEnabled()) { preference.setSummary(mSummaryBuilder.getSoundSummary()); } } // Only when modes_ui is active: change title & target fragment. private void maybeSetTitleAndDestination(Preference preference) { if (!Flags.modesUi()) { return; } preference.setTitle(R.string.zen_modes_list_title); preference.setFragment(ZenModesListFragment.class.getCanonicalName()); } class SettingObserver extends ContentObserver { private final Uri ZEN_MODE_URI = Settings.Global.getUriFor(Settings.Global.ZEN_MODE); private final Uri ZEN_MODE_CONFIG_ETAG_URI = Settings.Global.getUriFor( Loading