diff options
16 files changed, 80 insertions, 14 deletions
diff --git a/api/current.txt b/api/current.txt index 25a8a0bcf38e..3aa62a8d9274 100644 --- a/api/current.txt +++ b/api/current.txt @@ -28049,6 +28049,7 @@ package android.service.notification { method public final void requestInterruptionFilter(int); method public final void requestListenerHints(int); field public static final int HINT_HOST_DISABLE_EFFECTS = 1; // 0x1 + field public static final int INTERRUPTION_FILTER_ALARMS = 4; // 0x4 field public static final int INTERRUPTION_FILTER_ALL = 1; // 0x1 field public static final int INTERRUPTION_FILTER_NONE = 3; // 0x3 field public static final int INTERRUPTION_FILTER_PRIORITY = 2; // 0x2 diff --git a/api/system-current.txt b/api/system-current.txt index 6a02d9e6269b..f9c0ea22f798 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -30074,6 +30074,7 @@ package android.service.notification { method public final void setOnNotificationPostedTrim(int); method public void unregisterAsSystemService() throws android.os.RemoteException; field public static final int HINT_HOST_DISABLE_EFFECTS = 1; // 0x1 + field public static final int INTERRUPTION_FILTER_ALARMS = 4; // 0x4 field public static final int INTERRUPTION_FILTER_ALL = 1; // 0x1 field public static final int INTERRUPTION_FILTER_NONE = 3; // 0x3 field public static final int INTERRUPTION_FILTER_PRIORITY = 2; // 0x2 diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index f79ef35642a5..ec7e8b2a6ab8 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -7110,9 +7110,11 @@ public final class Settings { /** @hide */ public static final int ZEN_MODE_OFF = 0; /** @hide */ public static final int ZEN_MODE_IMPORTANT_INTERRUPTIONS = 1; /** @hide */ public static final int ZEN_MODE_NO_INTERRUPTIONS = 2; + /** @hide */ public static final int ZEN_MODE_ALARMS = 3; /** @hide */ public static String zenModeToString(int mode) { if (mode == ZEN_MODE_IMPORTANT_INTERRUPTIONS) return "ZEN_MODE_IMPORTANT_INTERRUPTIONS"; + if (mode == ZEN_MODE_ALARMS) return "ZEN_MODE_ALARMS"; if (mode == ZEN_MODE_NO_INTERRUPTIONS) return "ZEN_MODE_NO_INTERRUPTIONS"; return "ZEN_MODE_OFF"; } diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index 0860153988ec..fa782e41c20c 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -77,6 +77,12 @@ public abstract class NotificationListenerService extends Service { */ public static final int INTERRUPTION_FILTER_NONE = 3; + /** + * {@link #getCurrentInterruptionFilter() Interruption filter} constant - + * Alarms only interruption filter. + */ + public static final int INTERRUPTION_FILTER_ALARMS = 4; + /** {@link #getCurrentInterruptionFilter() Interruption filter} constant - returned when * the value is unavailable for any reason. For example, before the notification listener * is connected. diff --git a/packages/SystemUI/res/layout/segmented_button.xml b/packages/SystemUI/res/layout/segmented_button.xml index 2f84bab7b709..ead735fae26e 100644 --- a/packages/SystemUI/res/layout/segmented_button.xml +++ b/packages/SystemUI/res/layout/segmented_button.xml @@ -19,7 +19,9 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/segmented_button_spacing" android:layout_weight="1" - android:gravity="center" + android:paddingStart="8dp" + android:gravity="start|center_vertical" + android:maxLines="2" android:textColor="@color/segmented_button_text_selector" android:background="@drawable/btn_borderless_rect" android:textAppearance="@style/TextAppearance.Volume.ZenSwitchSummary" diff --git a/packages/SystemUI/res/layout/volume_zen_footer.xml b/packages/SystemUI/res/layout/volume_zen_footer.xml index f4a8b898619e..c491e9cbf98b 100644 --- a/packages/SystemUI/res/layout/volume_zen_footer.xml +++ b/packages/SystemUI/res/layout/volume_zen_footer.xml @@ -100,7 +100,7 @@ android:layout_height="wrap_content" android:clickable="true" android:focusable="true" - android:minWidth="84dp" + android:minWidth="66dp" android:text="@string/quick_settings_done" android:textAppearance="@style/TextAppearance.QS.DetailButton" /> </LinearLayout> diff --git a/packages/SystemUI/res/layout/zen_mode_condition.xml b/packages/SystemUI/res/layout/zen_mode_condition.xml index 0b91913c78fb..a169d1a1b258 100644 --- a/packages/SystemUI/res/layout/zen_mode_condition.xml +++ b/packages/SystemUI/res/layout/zen_mode_condition.xml @@ -18,8 +18,8 @@ android:layout_width="match_parent" android:layout_height="@dimen/qs_detail_item_height" android:layout_marginBottom="@dimen/zen_mode_condition_detail_item_spacing" - android:layout_marginStart="@dimen/zen_mode_condition_detail_button_padding" - android:layout_marginEnd="@dimen/zen_mode_condition_detail_button_padding" > + android:layout_marginStart="1dp" + android:layout_marginEnd="0dp" > <RadioButton android:id="@android:id/checkbox" diff --git a/packages/SystemUI/res/layout/zen_mode_panel.xml b/packages/SystemUI/res/layout/zen_mode_panel.xml index ef403e44a35d..3d73ff7df83d 100644 --- a/packages/SystemUI/res/layout/zen_mode_panel.xml +++ b/packages/SystemUI/res/layout/zen_mode_panel.xml @@ -19,6 +19,7 @@ android:id="@+id/zen_mode_panel" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginStart="35dp" android:clipChildren="false" android:orientation="vertical" > @@ -34,8 +35,8 @@ android:id="@+id/zen_buttons" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="40dp" - android:layout_marginRight="40dp" + android:layout_marginLeft="8dp" + android:layout_marginRight="8dp" android:layout_marginBottom="8dp" android:clipChildren="false" /> </FrameLayout> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 1c8142f81498..3705157f5cac 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -435,6 +435,8 @@ <string name="accessibility_quick_settings_dnd_priority_on">Do not disturb on, priority only.</string> <!-- Content description of the do not disturb tile in quick settings when on in none (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_quick_settings_dnd_none_on">Do not disturb on, no interruptions.</string> + <!-- Content description of the do not disturb tile in quick settings when on in alarms only (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_quick_settings_dnd_alarms_on">Do not disturb on, alarms only.</string> <!-- Content description of the do not disturb tile in quick settings when off (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_quick_settings_dnd_off">Do not disturb off.</string> <!-- Announcement made when do not disturb changes to off (not shown on the screen). [CHAR LIMIT=NONE] --> @@ -567,6 +569,8 @@ <string name="quick_settings_dnd_label">Do not disturb</string> <!-- QuickSettings: Do not disturb - Priority only [CHAR LIMIT=NONE] --> <string name="quick_settings_dnd_priority_label">Priority only</string> + <!-- QuickSettings: Do not disturb - Alarms only [CHAR LIMIT=NONE] --> + <string name="quick_settings_dnd_alarms_label">Alarms only</string> <!-- QuickSettings: Do not disturb - No interruptions [CHAR LIMIT=NONE] --> <string name="quick_settings_dnd_none_label">No interruptions</string> <!-- QuickSettings: Bluetooth [CHAR LIMIT=NONE] --> @@ -725,6 +729,9 @@ <!-- Zen mode: Only important interruptions. [CHAR LIMIT=40] --> <string name="zen_important_interruptions">Priority interruptions only</string> + <!-- Zen mode: Only alarms. [CHAR LIMIT=40] --> + <string name="zen_alarms">Alarms only</string> + <!-- Zen mode: Next alarm information - just a time. [CHAR LIMIT=40] --> <string name="zen_alarm_information_time">Your next alarm is at <xliff:g id="alarm_time" example="5:00 PM">%s</xliff:g></string> @@ -758,9 +765,21 @@ <!-- Interruption level: Priority. [CHAR LIMIT=20] --> <string name="interruption_level_priority">Priority only</string> + <!-- Interruption level: Alarms only. [CHAR LIMIT=20] --> + <string name="interruption_level_alarms">Alarms only</string> + <!-- Interruption level: All. [CHAR LIMIT=20] --> <string name="interruption_level_all">All</string> + <!-- Interruption level: None. Optimized for narrow two-line display. [CHAR LIMIT=20] --> + <string name="interruption_level_none_twoline">No\ninterruptions</string> + + <!-- Interruption level: Priority. Optimized for narrow two-line display. [CHAR LIMIT=20] --> + <string name="interruption_level_priority_twoline">Priority\nonly</string> + + <!-- Interruption level: Alarms only. Optimized for narrow two-line display. [CHAR LIMIT=20] --> + <string name="interruption_level_alarms_twoline">Alarms\nonly</string> + <!-- Indication on the keyguard that is shown when the device is charging. [CHAR LIMIT=40]--> <string name="keyguard_indication_charging_time">Charging (<xliff:g id="charging_time_left" example="4 hours and 2 minutes">%s</xliff:g> until full)</string> diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java index 182a2dd3296b..ff6a45a30c5e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java @@ -112,6 +112,12 @@ public class DndTile extends QSTile<QSTile.BooleanState> { state.contentDescription = mContext.getString( R.string.accessibility_quick_settings_dnd_none_on); break; + case Global.ZEN_MODE_ALARMS: + state.icon = ResourceIcon.get(R.drawable.ic_qs_dnd_on); + state.label = mContext.getString(R.string.quick_settings_dnd_alarms_label); + state.contentDescription = mContext.getString( + R.string.accessibility_quick_settings_dnd_alarms_on); + break; default: state.icon = ResourceIcon.get(R.drawable.ic_qs_dnd_off); state.label = mContext.getString(R.string.quick_settings_dnd_label); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 1938c6ddefa3..ac93ced3f3c7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -218,7 +218,7 @@ public class PhoneStatusBarPolicy { volumeVisible = true; volumeIconId = R.drawable.stat_sys_ringer_silent; volumeDescription = mContext.getString(R.string.accessibility_ringer_silent); - } else if (mZen != Global.ZEN_MODE_NO_INTERRUPTIONS && + } else if (mZen != Global.ZEN_MODE_NO_INTERRUPTIONS && mZen != Global.ZEN_MODE_ALARMS && audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE) { volumeVisible = true; volumeIconId = R.drawable.stat_sys_ringer_vibrate; diff --git a/packages/SystemUI/src/com/android/systemui/volume/Events.java b/packages/SystemUI/src/com/android/systemui/volume/Events.java index b20e39c7fe51..12dca94614ab 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/Events.java +++ b/packages/SystemUI/src/com/android/systemui/volume/Events.java @@ -177,6 +177,7 @@ public class Events { switch (zenMode) { case Global.ZEN_MODE_OFF: return "off"; case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: return "important_interruptions"; + case Global.ZEN_MODE_ALARMS: return "alarms"; case Global.ZEN_MODE_NO_INTERRUPTIONS: return "no_interruptions"; default: return "unknown"; } diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java index ba5b8d10e638..f99eb6d316ba 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java @@ -139,13 +139,17 @@ public class ZenFooter extends LinearLayout { } public boolean isZen() { - return isZenPriority() || isZenNone(); + return isZenPriority() || isZenAlarms() || isZenNone(); } private boolean isZenPriority() { return mZen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; } + private boolean isZenAlarms() { + return mZen == Global.ZEN_MODE_ALARMS; + } + private boolean isZenNone() { return mZen == Global.ZEN_MODE_NO_INTERRUPTIONS; } @@ -188,6 +192,7 @@ public class ZenFooter extends LinearLayout { mSwitchBarIcon.setAlpha(isZen ? 1 : mSecondaryAlpha); final String line1 = isZenPriority() ? mContext.getString(R.string.interruption_level_priority) + : isZenAlarms() ? mContext.getString(R.string.interruption_level_alarms) : isZenNone() ? mContext.getString(R.string.interruption_level_none) : null; Util.setText(mSummaryLine1, line1); diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java index a7f6175d1f44..cb6c29f8541f 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java @@ -155,7 +155,7 @@ public class ZenModePanel extends LinearLayout { } else { mZenButtonsContainer.setBackgroundResource(R.drawable.qs_background_secondary); } - mZenButtons.getChildAt(2).setVisibility(mEmbedded ? GONE : VISIBLE); + mZenButtons.getChildAt(3).setVisibility(mEmbedded ? GONE : VISIBLE); mZenEmbeddedDivider.setVisibility(mEmbedded ? VISIBLE : GONE); setExpanded(mEmbedded); updateWidgets(); @@ -166,8 +166,11 @@ public class ZenModePanel extends LinearLayout { super.onFinishInflate(); mZenButtons = (SegmentedButtons) findViewById(R.id.zen_buttons); - mZenButtons.addButton(R.string.interruption_level_none, Global.ZEN_MODE_NO_INTERRUPTIONS); - mZenButtons.addButton(R.string.interruption_level_priority, + mZenButtons.addButton(R.string.interruption_level_none_twoline, + Global.ZEN_MODE_NO_INTERRUPTIONS); + mZenButtons.addButton(R.string.interruption_level_alarms_twoline, + Global.ZEN_MODE_ALARMS); + mZenButtons.addButton(R.string.interruption_level_priority_twoline, Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); mZenButtons.addButton(R.string.interruption_level_all, Global.ZEN_MODE_OFF); mZenButtons.setCallback(mZenButtonsCallback); @@ -718,7 +721,10 @@ public class ZenModePanel extends LinearLayout { case Global.ZEN_MODE_NO_INTERRUPTIONS: modeText = mContext.getString(R.string.zen_no_interruptions); break; - default: + case Global.ZEN_MODE_ALARMS: + modeText = mContext.getString(R.string.zen_alarms); + break; + default: return; } announceForAccessibility(mContext.getString(R.string.zen_mode_and_condition, modeText, diff --git a/services/core/java/com/android/server/notification/ZenLog.java b/services/core/java/com/android/server/notification/ZenLog.java index 1fc967f430ce..1e318ef3c487 100644 --- a/services/core/java/com/android/server/notification/ZenLog.java +++ b/services/core/java/com/android/server/notification/ZenLog.java @@ -172,6 +172,7 @@ public class ZenLog { switch (zenMode) { case Global.ZEN_MODE_OFF: return "off"; case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: return "important_interruptions"; + case Global.ZEN_MODE_ALARMS: return "alarms"; case Global.ZEN_MODE_NO_INTERRUPTIONS: return "no_interruptions"; default: return "unknown"; } diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index a985b01730e3..91d1e563ef02 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -128,6 +128,8 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { return NotificationListenerService.INTERRUPTION_FILTER_ALL; case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: return NotificationListenerService.INTERRUPTION_FILTER_PRIORITY; + case Global.ZEN_MODE_ALARMS: + return NotificationListenerService.INTERRUPTION_FILTER_ALARMS; case Global.ZEN_MODE_NO_INTERRUPTIONS: return NotificationListenerService.INTERRUPTION_FILTER_NONE; default: @@ -142,6 +144,8 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { return Global.ZEN_MODE_OFF; case NotificationListenerService.INTERRUPTION_FILTER_PRIORITY: return Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; + case NotificationListenerService.INTERRUPTION_FILTER_ALARMS: + return Global.ZEN_MODE_ALARMS; case NotificationListenerService.INTERRUPTION_FILTER_NONE: return Global.ZEN_MODE_NO_INTERRUPTIONS; default: @@ -171,6 +175,13 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { // #notevenalarms ZenLog.traceIntercepted(record, "none"); return true; + case Global.ZEN_MODE_ALARMS: + if (isAlarm(record)) { + // Alarms only + return false; + } + ZenLog.traceIntercepted(record, "alarmsOnly"); + return true; case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: if (isAlarm(record)) { // Alarms are always priority @@ -314,6 +325,7 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { int newRingerModeInternal = ringerModeInternal; switch (mZenMode) { case Global.ZEN_MODE_NO_INTERRUPTIONS: + case Global.ZEN_MODE_ALARMS: if (ringerModeInternal != AudioManager.RINGER_MODE_SILENT) { mPreviousRingerMode = ringerModeInternal; newRingerModeInternal = AudioManager.RINGER_MODE_SILENT; @@ -344,7 +356,8 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { switch (ringerModeNew) { case AudioManager.RINGER_MODE_SILENT: if (isChange && policy.doNotDisturbWhenSilent) { - if (mZenMode != Global.ZEN_MODE_NO_INTERRUPTIONS) { + if (mZenMode != Global.ZEN_MODE_NO_INTERRUPTIONS + && mZenMode != Global.ZEN_MODE_ALARMS) { newZen = Global.ZEN_MODE_NO_INTERRUPTIONS; } } @@ -352,7 +365,8 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { case AudioManager.RINGER_MODE_VIBRATE: case AudioManager.RINGER_MODE_NORMAL: if (isChange && ringerModeOld == AudioManager.RINGER_MODE_SILENT - && mZenMode == Global.ZEN_MODE_NO_INTERRUPTIONS) { + && (mZenMode == Global.ZEN_MODE_NO_INTERRUPTIONS + || mZenMode == Global.ZEN_MODE_ALARMS)) { newZen = Global.ZEN_MODE_OFF; } else if (mZenMode != Global.ZEN_MODE_OFF) { ringerModeExternalOut = AudioManager.RINGER_MODE_SILENT; @@ -470,6 +484,7 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { ValidateNotificationPeople validator, int contactsTimeoutMs, float timeoutAffinity) { final int zen = mZenMode; if (zen == Global.ZEN_MODE_NO_INTERRUPTIONS) return false; // nothing gets through + if (zen == Global.ZEN_MODE_ALARMS) return false; // not an alarm if (zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) { if (!mConfig.allowCalls) return false; // no calls get through if (validator != null) { |