diff options
author | John Spurlock <jspurlock@google.com> | 2015-04-29 14:27:19 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-04-29 14:27:19 +0000 |
commit | 23e46a4e8d9405e24169a0bb38ff6dc5b8d99ff2 (patch) | |
tree | 84527c174c7f49e0baf8ea58496ad0489c719a7f | |
parent | 41646474df175d74545429d2f2c1a3f08d97341c (diff) | |
parent | 2d67b2887c0a279aa182646f0e23b176783a1aca (diff) | |
download | frameworks_base-23e46a4e8d9405e24169a0bb38ff6dc5b8d99ff2.zip frameworks_base-23e46a4e8d9405e24169a0bb38ff6dc5b8d99ff2.tar.gz frameworks_base-23e46a4e8d9405e24169a0bb38ff6dc5b8d99ff2.tar.bz2 |
am 2d67b288: am 8dbcda1b: Merge "Volume: Simple dialog footer, DND in quick settings." into mnc-dev
* commit '2d67b2887c0a279aa182646f0e23b176783a1aca':
Volume: Simple dialog footer, DND in quick settings.
32 files changed, 348 insertions, 805 deletions
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index 14e947c..dc8f3ea 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -62,7 +62,7 @@ public class ZenModeConfig implements Parcelable { Calendar.WEDNESDAY, Calendar.THURSDAY }; public static final int[] WEEKEND_DAYS = { Calendar.FRIDAY, Calendar.SATURDAY }; - public static final int[] MINUTE_BUCKETS = new int[] { 15, 30, 45, 60, 120, 180, 240, 480 }; + public static final int[] MINUTE_BUCKETS = generateMinuteBuckets(); private static final int SECONDS_MS = 1000; private static final int MINUTES_MS = 60 * SECONDS_MS; private static final int ZERO_VALUE_MS = 10 * SECONDS_MS; @@ -201,6 +201,18 @@ public class ZenModeConfig implements Parcelable { } } + private static int[] generateMinuteBuckets() { + final int maxHrs = 12; + final int[] buckets = new int[maxHrs + 3]; + buckets[0] = 15; + buckets[1] = 30; + buckets[2] = 45; + for (int i = 1; i <= maxHrs; i++) { + buckets[2 + i] = 60 * i; + } + return buckets; + } + public static String sourceToString(int source) { switch (source) { case SOURCE_ANYONE: @@ -298,10 +310,10 @@ public class ZenModeConfig implements Parcelable { throw new IndexOutOfBoundsException("bad source in config:" + rt.allowFrom); } } else if (MANUAL_TAG.equals(tag)) { - rt.manualRule = readRuleXml(parser); + rt.manualRule = readRuleXml(parser, false /*conditionRequired*/); } else if (AUTOMATIC_TAG.equals(tag)) { final String id = parser.getAttributeValue(null, RULE_ATT_ID); - final ZenRule automaticRule = readRuleXml(parser); + final ZenRule automaticRule = readRuleXml(parser, true /*conditionRequired*/); if (id != null && automaticRule != null) { rt.automaticRules.put(id, automaticRule); } @@ -341,7 +353,7 @@ public class ZenModeConfig implements Parcelable { out.endTag(null, ZEN_TAG); } - public static ZenRule readRuleXml(XmlPullParser parser) { + public static ZenRule readRuleXml(XmlPullParser parser, boolean conditionRequired) { final ZenRule rt = new ZenRule(); rt.enabled = safeBoolean(parser, RULE_ATT_ENABLED, true); rt.snoozing = safeBoolean(parser, RULE_ATT_SNOOZING, false); @@ -355,7 +367,7 @@ public class ZenModeConfig implements Parcelable { rt.conditionId = safeUri(parser, RULE_ATT_CONDITION_ID); rt.component = safeComponentName(parser, RULE_ATT_COMPONENT); rt.condition = readConditionXml(parser); - return rt.condition != null ? rt : null; + return rt.condition != null || !conditionRequired ? rt : null; } public static void writeRuleXml(ZenRule rule, XmlSerializer out) throws IOException { diff --git a/media/java/android/media/AudioManagerInternal.java b/media/java/android/media/AudioManagerInternal.java index abb4257..a721923 100644 --- a/media/java/android/media/AudioManagerInternal.java +++ b/media/java/android/media/AudioManagerInternal.java @@ -51,5 +51,7 @@ public abstract class AudioManagerInternal { /** Called when internal ringer mode is evaluated, returns the new external ringer mode */ int onSetRingerModeInternal(int ringerModeOld, int ringerModeNew, String caller, int ringerModeExternal, VolumePolicy policy); + + boolean canVolumeDownEnterSilent(); } } diff --git a/packages/SystemUI/res/layout/qs_detail.xml b/packages/SystemUI/res/layout/qs_detail.xml index 2eb99ba..ddff0f0 100644 --- a/packages/SystemUI/res/layout/qs_detail.xml +++ b/packages/SystemUI/res/layout/qs_detail.xml @@ -18,7 +18,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/qs_detail_background" - android:paddingBottom="16dp" + android:paddingBottom="8dp" android:orientation="vertical"> <FrameLayout @@ -30,7 +30,7 @@ <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingEnd="16dp" + android:paddingEnd="8dp" android:gravity="end"> <TextView diff --git a/packages/SystemUI/res/layout/segmented_button.xml b/packages/SystemUI/res/layout/segmented_button.xml index ead735f..b7a7932 100644 --- a/packages/SystemUI/res/layout/segmented_button.xml +++ b/packages/SystemUI/res/layout/segmented_button.xml @@ -19,10 +19,10 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/segmented_button_spacing" android:layout_weight="1" - android:paddingStart="8dp" - android:gravity="start|center_vertical" + android:gravity="center" android:maxLines="2" + android:lineSpacingMultiplier="1.05026" android:textColor="@color/segmented_button_text_selector" android:background="@drawable/btn_borderless_rect" - android:textAppearance="@style/TextAppearance.Volume.ZenSwitchSummary" - android:minHeight="48dp" /> + android:textAppearance="@style/TextAppearance.QS.SegmentedButton" + android:minHeight="64dp" /> diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml index c86e9dc..0ed1e2a 100644 --- a/packages/SystemUI/res/layout/volume_dialog.xml +++ b/packages/SystemUI/res/layout/volume_dialog.xml @@ -21,40 +21,31 @@ android:layout_marginBottom="4dp" android:layout_marginLeft="@dimen/notification_side_padding" android:layout_marginRight="@dimen/notification_side_padding" - android:layout_marginTop="4dp" android:background="@drawable/volume_dialog_background" android:translationZ="4dp" > <com.android.keyguard.AlphaOptimizedImageButton android:id="@+id/volume_expand_button" style="@style/VolumeButtons" - android:layout_alignParentLeft="true" android:layout_width="@dimen/volume_button_size" android:layout_height="@dimen/volume_button_size" + android:layout_alignParentLeft="true" android:clickable="true" android:soundEffectsEnabled="false" - android:src="@drawable/ic_volume_collapse_animation" /> + android:src="@drawable/ic_volume_collapse_animation" + tools:ignore="RtlHardcoded" /> <LinearLayout android:id="@+id/volume_dialog_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:paddingBottom="4dp" - android:paddingTop="6dp" > + android:paddingBottom="8dp" + android:paddingTop="8dp" > <!-- volume rows added and removed here! :-) --> - <FrameLayout - android:id="@+id/volume_footer" - android:layout_width="match_parent" - android:layout_height="wrap_content" - tools:ignore="UselessParent" > - - <include layout="@layout/volume_text_footer" /> - - <include layout="@layout/volume_zen_footer" /> - </FrameLayout> + <include layout="@layout/volume_zen_footer" /> </LinearLayout> </RelativeLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/volume_dialog_row.xml b/packages/SystemUI/res/layout/volume_dialog_row.xml index b51aa96..53ae61b 100644 --- a/packages/SystemUI/res/layout/volume_dialog_row.xml +++ b/packages/SystemUI/res/layout/volume_dialog_row.xml @@ -16,16 +16,15 @@ <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingStart="4dp" - android:paddingEnd="4dp" - android:clipChildren="false" > + android:clipChildren="false" + android:paddingEnd="8dp" + android:paddingStart="8dp" > <TextView android:id="@+id/volume_row_header" style="?android:attr/textAppearanceButton" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:alpha="@dimen/volume_secondary_alpha" android:ellipsize="end" android:maxLines="1" android:paddingBottom="0dp" @@ -50,8 +49,8 @@ android:layout_below="@id/volume_row_header" android:layout_toEndOf="@id/volume_row_icon" android:layout_toStartOf="@+id/volume_settings_button" - android:paddingEnd="4dp" - android:paddingStart="4dp" + android:paddingEnd="8dp" + android:paddingStart="8dp" android:progressTint="@android:color/white" android:thumbTint="@android:color/white" /> diff --git a/packages/SystemUI/res/layout/volume_text_footer.xml b/packages/SystemUI/res/layout/volume_text_footer.xml deleted file mode 100644 index 7436488..0000000 --- a/packages/SystemUI/res/layout/volume_text_footer.xml +++ /dev/null @@ -1,54 +0,0 @@ -<!-- - Copyright (C) 2015 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. ---> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/volume_text_footer" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:visibility="gone" - tools:ignore="UselessParent" > - - <TextView - android:id="@+id/volume_footline_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignBaseline="@+id/volume_footline_action_button" - android:alpha="@dimen/volume_secondary_alpha" - android:fontFamily="sans-serif" - android:paddingEnd="8dp" - android:paddingStart="13dp" - android:textColor="?android:attr/textColorPrimary" /> - - <Button - android:id="@+id/volume_footline_action_button" - style="@android:style/Widget.Material.Button.Borderless" - android:layout_width="wrap_content" - android:layout_height="@dimen/volume_button_size" - android:layout_toEndOf="@id/volume_footline_text" - android:layout_toStartOf="@+id/volume_settings_button" - android:alpha="@dimen/volume_secondary_alpha" - android:paddingEnd="0dp" - android:paddingStart="0dp" /> - - <com.android.keyguard.AlphaOptimizedImageButton - android:id="@+id/volume_settings_button" - style="@style/VolumeButtons" - android:layout_width="@dimen/volume_button_size" - android:layout_height="@dimen/volume_button_size" - android:layout_alignParentEnd="true" - android:src="@drawable/ic_volume_settings" /> - -</RelativeLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/volume_zen_footer.xml b/packages/SystemUI/res/layout/volume_zen_footer.xml index dcdc859..9e761e2 100644 --- a/packages/SystemUI/res/layout/volume_zen_footer.xml +++ b/packages/SystemUI/res/layout/volume_zen_footer.xml @@ -20,93 +20,58 @@ android:layout_height="wrap_content" android:orientation="vertical" > <!-- extends LinearLayout --> + <View + android:id="@+id/zen_embedded_divider" + android:layout_width="match_parent" + android:layout_height="1dp" + android:layout_marginBottom="8dp" + android:layout_marginTop="8dp" + android:background="#4dffffff" /> + <LinearLayout - android:id="@+id/volume_zen_switch_bar" android:layout_width="match_parent" - android:layout_height="@dimen/volume_button_size" - android:layout_marginStart="4dp" - android:layout_marginEnd="4dp" - android:clickable="true" - android:orientation="horizontal" > + android:layout_height="wrap_content" + android:gravity="center_vertical" + android:orientation="horizontal" + android:paddingEnd="8dp" + android:paddingStart="8dp" > <ImageView - android:id="@+id/volume_zen_switch_bar_icon" + android:id="@+id/volume_zen_icon" android:layout_width="@dimen/volume_button_size" android:layout_height="@dimen/volume_button_size" + android:layout_marginEnd="7dp" android:scaleType="center" android:src="@drawable/ic_dnd" /> - <TextView + <LinearLayout android:layout_width="0dp" - android:layout_height="fill_parent" - android:layout_weight="1" - android:gravity="center_vertical" - android:textDirection="locale" - android:padding="3dp" - android:text="@string/volume_zen_switch_text" - android:textAppearance="@style/TextAppearance.Volume.ZenSwitch" /> - - <Switch - android:id="@+id/volume_zen_switch" - android:layout_width="wrap_content" - android:layout_height="fill_parent" - android:layout_marginEnd="11dp" /> - - </LinearLayout> - - <RelativeLayout - android:id="@+id/volume_zen_panel_summary" - android:layout_width="match_parent" - android:layout_height="@dimen/volume_button_size" - android:layout_marginStart="@dimen/volume_button_size" - android:paddingEnd="7dp" - android:paddingStart="7dp" > - - <TextView - android:id="@+id/volume_zen_panel_summary_line_1" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:textAppearance="@style/TextAppearance.Volume.ZenSwitchSummary" /> - - <TextView - android:id="@+id/volume_zen_panel_summary_line_2" - android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_below="@id/volume_zen_panel_summary_line_1" - android:textAppearance="@style/TextAppearance.Volume.ZenSwitchDetail" /> - </RelativeLayout> - - <include layout="@layout/zen_mode_panel" /> + android:layout_weight="1" + android:orientation="vertical" > - <LinearLayout - android:id="@+id/volume_zen_mode_panel_buttons" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="4dp" - android:layout_marginEnd="4dp" - android:gravity="end" > + <TextView + android:id="@+id/volume_zen_summary_line_1" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textAppearance="@style/TextAppearance.Volume.ZenSummary" /> - <TextView - android:id="@+id/volume_zen_mode_panel_more" - style="@style/QSBorderlessButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginEnd="8dp" - android:clickable="true" - android:focusable="true" - android:minWidth="132dp" - android:text="@string/quick_settings_more_settings" - android:textAppearance="@style/TextAppearance.QS.DetailButton" /> + <TextView + android:id="@+id/volume_zen_summary_line_2" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textAppearance="@style/TextAppearance.Volume.ZenDetail" /> + </LinearLayout> <TextView - android:id="@+id/volume_zen_mode_panel_done" + android:id="@+id/volume_zen_end_now" style="@style/QSBorderlessButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="true" android:focusable="true" - android:minWidth="66dp" - android:text="@string/quick_settings_done" + android:minWidth="91dp" + android:text="@string/volume_zen_end_now" android:textAppearance="@style/TextAppearance.QS.DetailButton" /> </LinearLayout> diff --git a/packages/SystemUI/res/layout/zen_mode_panel.xml b/packages/SystemUI/res/layout/zen_mode_panel.xml index b676bce..595c9ed 100644 --- a/packages/SystemUI/res/layout/zen_mode_panel.xml +++ b/packages/SystemUI/res/layout/zen_mode_panel.xml @@ -22,81 +22,21 @@ android:clipChildren="false" android:orientation="vertical" > - <FrameLayout - android:id="@+id/zen_buttons_container" + <com.android.systemui.volume.SegmentedButtons + android:id="@+id/zen_buttons" android:layout_width="match_parent" android:layout_height="wrap_content" - android:minHeight="8dp" - android:layout_marginStart="39dp" - android:elevation="4dp" - android:background="@drawable/qs_background_secondary" > - - <com.android.systemui.volume.SegmentedButtons - android:id="@+id/zen_buttons" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" - android:layout_marginBottom="8dp" - android:clipChildren="false" /> - </FrameLayout> + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" /> <View android:id="@+id/zen_embedded_divider" android:layout_width="match_parent" + android:layout_marginTop="8dp" android:layout_height="1dp" - android:visibility="gone" android:background="#4dffffff" /> <RelativeLayout - android:id="@+id/zen_subhead" - android:layout_width="match_parent" - android:layout_height="62dp" - android:layout_marginStart="39dp" - android:gravity="center_vertical" - android:paddingLeft="8dp" - android:paddingRight="8dp" > - - <TextView - android:id="@+id/zen_subhead_collapsed" - android:layout_width="wrap_content" - android:layout_height="48dp" - android:layout_gravity="center_vertical" - android:gravity="center_vertical" - android:paddingLeft="8dp" - android:paddingRight="4dp" - android:background="@drawable/btn_borderless_rect" - android:clickable="true" - android:drawableEnd="@drawable/qs_subhead_caret" - android:maxLines="2" - android:ellipsize="end" - android:textAppearance="@style/TextAppearance.QS.Subhead" /> - - <TextView - android:id="@+id/zen_subhead_expanded" - android:layout_width="wrap_content" - android:layout_height="48dp" - android:layout_gravity="center_vertical" - android:gravity="center_vertical" - android:paddingLeft="8dp" - android:maxLines="2" - android:ellipsize="end" - android:textAppearance="@style/TextAppearance.QS.Subhead" /> - - <ImageView - android:id="@+id/zen_more_settings" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_alignParentEnd="true" - android:background="@drawable/btn_borderless_rect" - android:clickable="true" - android:contentDescription="@string/accessibility_desc_settings" - android:scaleType="center" - android:src="@drawable/ic_settings" /> - - </RelativeLayout> - - <RelativeLayout android:id="@+id/zen_introduction" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -122,10 +62,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" - android:layout_marginStart="55dp" + android:layout_marginStart="24dp" android:lineSpacingMultiplier="1.20029" android:layout_toStartOf="@id/zen_introduction_confirm" - android:text="@string/zen_priority_introduction" android:textAppearance="@style/TextAppearance.QS.Introduction" /> <TextView @@ -141,6 +80,12 @@ android:text="@string/zen_priority_customize_button" android:textAppearance="@style/TextAppearance.QS.DetailButton.White" /> + <View + android:layout_width="0dp" + android:layout_height="16dp" + android:layout_below="@id/zen_introduction_message" + android:layout_alignParentEnd="true" /> + </RelativeLayout> <LinearLayout @@ -149,7 +94,7 @@ android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_marginEnd="4dp" - android:layout_marginStart="39dp" + android:layout_marginStart="4dp" android:orientation="vertical" android:paddingBottom="@dimen/zen_mode_condition_detail_bottom_padding" /> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 1f1455a..7a108ed 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -128,7 +128,7 @@ <color name="screen_pinning_request_window_bg">#80000000</color> <color name="segmented_button_selected">#FFFFFFFF</color> - <color name="segmented_button_unselected">#B3B0BEC5</color><!-- 70% blue grey 200 --> + <color name="segmented_button_unselected">#FFB0BEC5</color><!-- blue grey 200 --> <color name="dark_mode_icon_color_single_tone">#99000000</color> <color name="dark_mode_icon_color_dual_tone_background">#3d000000</color> @@ -139,4 +139,6 @@ <color name="light_mode_icon_color_dual_tone_fill">#ffffff</color> <color name="zen_introduction_message_background">#ff009688</color><!-- deep teal 500 --> + <color name="volume_icon_color">#ffffffff</color> + <color name="volume_settings_icon_color">#7fffffff</color> </resources> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 81f2953..6e79423 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -293,5 +293,9 @@ <!-- Duration of the full carrier network change icon animation. --> <integer name="carrier_network_change_anim_time">3000</integer> + + <!-- Duration of the expansion animation in the volume dialog --> + <item name="volume_expand_animation_duration" type="integer">300</item> + </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 6e59029..a0ef5e2 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -573,4 +573,13 @@ <!-- Minimum margin of the notification panel on the side, when being positioned dynamically --> <dimen name="notification_panel_min_side_margin">48dp</dimen> + + <!-- Vertical spacing between multiple volume slider rows --> + <dimen name="volume_slider_interspacing">8dp</dimen> + + <!-- Volume dialog vertical offset from the top of the screen --> + <dimen name="volume_offset_top">0dp</dimen> + + <!-- Standard image button size for volume dialog buttons --> + <dimen name="volume_button_size">48dp</dimen> </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index f12fd0c..8b50774 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -439,7 +439,7 @@ <!-- Content description of the do not disturb tile in quick settings when on in priority (not shown on the screen). [CHAR LIMIT=NONE] --> <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> + <string name="accessibility_quick_settings_dnd_none_on">Do not disturb on, total silence.</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] --> @@ -576,8 +576,8 @@ <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: Do not disturb - Total silence [CHAR LIMIT=NONE] --> + <string name="quick_settings_dnd_none_label">Total silence</string> <!-- QuickSettings: Bluetooth [CHAR LIMIT=NONE] --> <string name="quick_settings_bluetooth_label">Bluetooth</string> <!-- QuickSettings: Bluetooth (Multiple) [CHAR LIMIT=NONE] --> @@ -725,32 +725,14 @@ <!-- Description of the left direction in which one can to slide the handle in the Slide unlock screen. [CHAR LIMIT=NONE] --> <string name="description_direction_left">"Slide left for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string> - <!-- Zen mode: No interruptions title, with a warning about alarms. [CHAR LIMIT=60] --> - <string name="zen_no_interruptions_with_warning">No interruptions. Not even alarms.</string> - <!-- Zen mode: Priority only introduction message on first use --> - <string name="zen_priority_introduction">You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events, and callers you specify.</string> + <string name="zen_priority_introduction">You won’t be disturbed by sounds and vibrations, except from alarms, reminders, events, and callers you specify.</string> <!-- Zen mode: Priority only customization button label --> <string name="zen_priority_customize_button">Customize</string> - <!-- Zen mode: No interruptions. [CHAR LIMIT=40] --> - <string name="zen_no_interruptions">No interruptions</string> - - <!-- 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> - - <!-- Zen mode: Next alarm information - day and time. [CHAR LIMIT=40] --> - <string name="zen_alarm_information_day_time">Your next alarm is <xliff:g id="alarm_day_and_time" example="Fri 5:00 PM">%s</xliff:g></string> - - <!-- Zen mode: Next alarm warning. [CHAR LIMIT=40] --> - <string name="zen_alarm_warning">You won\'t hear your alarm at <xliff:g id="alarm_time" example="5:00 PM">%s</xliff:g></string> + <!-- Zen mode: Total silence introduction message on first use --> + <string name="zen_silence_introduction">This blocks ALL sounds and vibrations, including from alarms, music, videos, and games. You’ll still be able to make phone calls.</string> <!-- Text for overflow card on Keyguard when there is not enough space for all notifications on Keyguard. [CHAR LIMIT=1] --> <string name="keyguard_more_overflow_text">+<xliff:g id="number_of_notifications" example="5">%d</xliff:g></string> @@ -771,7 +753,7 @@ <string name="camera_hint">Swipe left for camera</string> <!-- Interruption level: None. [CHAR LIMIT=20] --> - <string name="interruption_level_none">No interruptions</string> + <string name="interruption_level_none">Total silence</string> <!-- Interruption level: Priority. [CHAR LIMIT=20] --> <string name="interruption_level_priority">Priority only</string> @@ -779,11 +761,8 @@ <!-- 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> + <string name="interruption_level_none_twoline">Total\nsilence</string> <!-- Interruption level: Priority. Optimized for narrow two-line display. [CHAR LIMIT=20] --> <string name="interruption_level_priority_twoline">Priority\nonly</string> @@ -953,6 +932,9 @@ <!-- Accessibility string for current zen mode and selected exit condition. A template that simply concatenates existing mode string and the current condition description. [CHAR LIMIT=20] --> <string name="zen_mode_and_condition"><xliff:g id="zen_mode" example="Priority interruptions only">%1$s</xliff:g>. <xliff:g id="exit_condition" example="For one hour">%2$s</xliff:g></string> + <!-- Button label for ending zen mode in the volume dialog --> + <string name="volume_zen_end_now">End now</string> + <!-- Screen pinning dialog title. --> <string name="screen_pinning_title">Screen is pinned</string> <!-- Screen pinning dialog description. --> @@ -988,9 +970,26 @@ <!-- VolumeUI restoration notification: text --> <string name="volumeui_notification_text">Touch to restore the original.</string> - <!-- Volume dialog zen toggle switch title --> - <string name="volume_zen_switch_text" translatable="false">@*android:string/zen_mode_feature_name</string> - <!-- Toast shown when user unlocks screen and managed profile activity is in the foreground --> <string name="managed_profile_foreground_toast">You are in the Work profile</string> + + <string-array name="volume_stream_titles" translatable="false"> + <item>Voice calls</item> <!-- STREAM_VOICE_CALL --> + <item>System</item> <!-- STREAM_SYSTEM --> + <item>Notifications</item> <!-- STREAM_RING --> + <item>Media</item> <!-- STREAM_MUSIC --> + <item>Alarms</item> <!-- STREAM_ALARM --> + <item></item> <!-- STREAM_NOTIFICATION --> + <item>Bluetooth calls</item> <!-- STREAM_BLUETOOTH_SCO --> + <item></item> <!-- STREAM_SYSTEM_ENFORCED --> + <item></item> <!-- STREAM_DTMF --> + <item></item> <!-- STREAM_TTS --> + </string-array> + + <string name="volume_stream_muted" translatable="false">%s silent</string> + <string name="volume_stream_vibrate" translatable="false">%s vibrate</string> + <string name="volume_stream_suppressed" translatable="false">%1$s silent — %2$s</string> + <string name="volume_stream_muted_dnd" translatable="false">%s silent — Total silence</string> + <string name="volume_stream_limited_dnd" translatable="false">%s — Priority only</string> + <string name="volume_stream_vibrate_dnd" translatable="false">%s vibrate — Priority only</string> </resources> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index ef2e6f3..c058d44 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -165,7 +165,7 @@ </style> <style name="TextAppearance.QS.SegmentedButton"> - <item name="android:textSize">14sp</item> + <item name="android:textSize">16sp</item> </style> <style name="TextAppearance.QS.DataUsage"> @@ -262,4 +262,31 @@ <item name="fillColor">@color/dark_mode_icon_color_dual_tone_fill</item> <item name="singleToneColor">@color/dark_mode_icon_color_single_tone</item> </style> + + <style name="TextAppearance.Volume"> + <item name="android:textStyle">normal</item> + <item name="android:textColor">#ffffffff</item> + <item name="android:fontFamily">sans-serif</item> + </style> + + <style name="TextAppearance.Volume.ZenSummary"> + <item name="android:textSize">14sp</item> + <item name="android:fontFamily">sans-serif-medium</item> + </style> + + <style name="TextAppearance.Volume.ZenDetail"> + <item name="android:textSize">14sp</item> + <item name="android:fontFamily">sans-serif</item> + <item name="android:textColor">#ffb0b3c5</item> + </style> + + <style name="VolumeDialogAnimations"> + <item name="android:windowEnterAnimation">@android:anim/fade_in</item> + <item name="android:windowExitAnimation">@android:anim/fade_out</item> + </style> + + <style name="VolumeButtons" parent="@android:style/Widget.Material.Button.Borderless"> + <item name="android:background">@drawable/btn_borderless_rect</item> + </style> + </resources> diff --git a/packages/SystemUI/res/values/volume.xml b/packages/SystemUI/res/values/volume.xml deleted file mode 100644 index f516104..0000000 --- a/packages/SystemUI/res/values/volume.xml +++ /dev/null @@ -1,87 +0,0 @@ -<!-- - Copyright (C) 2015 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. ---> -<resources xmlns:android="http://schemas.android.com/apk/res/android"> - - <item name="volume_expand_animation_duration" type="integer">300</item> - - <color name="volume_icon_color">#ffffffff</color> - <color name="volume_settings_icon_color">#7fffffff</color> - - <dimen name="volume_slider_interspacing">2dp</dimen> - <dimen name="volume_offset_top">0dp</dimen> - <dimen name="volume_button_size">48dp</dimen> - - <item name="volume_secondary_alpha" format="float" type="dimen">0.3</item> - - <style name="VolumeDialogAnimations"> - <item name="android:windowEnterAnimation">@android:anim/fade_in</item> - <item name="android:windowExitAnimation">@android:anim/fade_out</item> - </style> - - <style name="VolumeButtons" parent="@android:style/Widget.Material.Button.Borderless"> - <item name="android:background">@drawable/btn_borderless_rect</item> - </style> - - <style name="TextAppearance" /> - - <style name="TextAppearance.Volume"> - <item name="android:textStyle">normal</item> - <item name="android:textColor">#ffffffff</item> - <item name="android:fontFamily">sans-serif</item> - </style> - - <style name="TextAppearance.Volume.ZenSwitch"> - <item name="android:textSize">16sp</item> - <item name="android:fontFamily">sans-serif-medium</item> - </style> - - <style name="TextAppearance.Volume.ZenSwitchSummary"> - <item name="android:textSize">14sp</item> - <item name="android:fontFamily">sans-serif-medium</item> - </style> - - <style name="TextAppearance.Volume.ZenSwitchDetail"> - <item name="android:textSize">14sp</item> - <item name="android:fontFamily">sans-serif</item> - <item name="android:textColor">#ffb0b3c5</item> - </style> - - <string-array name="volume_stream_titles" translatable="false"> - <item>Voice calls</item> <!-- STREAM_VOICE_CALL --> - <item>System</item> <!-- STREAM_SYSTEM --> - <item>Notifications</item> <!-- STREAM_RING --> - <item>Media</item> <!-- STREAM_MUSIC --> - <item>Alarms</item> <!-- STREAM_ALARM --> - <item></item> <!-- STREAM_NOTIFICATION --> - <item>Bluetooth calls</item> <!-- STREAM_BLUETOOTH_SCO --> - <item></item> <!-- STREAM_SYSTEM_ENFORCED --> - <item></item> <!-- STREAM_DTMF --> - <item></item> <!-- STREAM_TTS --> - </string-array> - - <string name="volume_dnd_is_on" translatable="false">Do not disturb is on</string> - <string name="volume_turn_off" translatable="false">Turn off</string> - <string name="volume_stream_muted" translatable="false">%s silent</string> - <string name="volume_stream_vibrate" translatable="false">%s vibrate</string> - <string name="volume_stream_suppressed" translatable="false">%1$s silent — %2$s</string> - <string name="volume_stream_muted_dnd" translatable="false">%s silent — No interruptions</string> - <string name="volume_stream_limited_dnd" translatable="false">%s — Priority only</string> - <string name="volume_stream_vibrate_dnd" translatable="false">%s vibrate — Priority only</string> - <string name="volume_dnd_ends_in" translatable="false">Do not disturb ends in %s</string> - <string name="volume_dnd_ends_at" translatable="false">Do not disturb ends at %s</string> - <string name="volume_end_now" translatable="false">End now</string> - -</resources>
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java index 68b1968..29d2a01 100644 --- a/packages/SystemUI/src/com/android/systemui/Prefs.java +++ b/packages/SystemUI/src/com/android/systemui/Prefs.java @@ -37,8 +37,10 @@ public final class Prefs { Key.DND_TILE_VISIBLE, Key.DND_TILE_COMBINED_ICON, Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, + Key.DND_CONFIRMED_SILENCE_INTRODUCTION, Key.DND_FAVORITE_BUCKET_INDEX, Key.DND_NONE_SELECTED, + Key.DND_FAVORITE_ZEN, }) public @interface Key { String SEARCH_APP_WIDGET_ID = "searchAppWidgetId"; @@ -48,8 +50,10 @@ public final class Prefs { String DND_TILE_VISIBLE = "DndTileVisible"; String DND_TILE_COMBINED_ICON = "DndTileCombinedIcon"; String DND_CONFIRMED_PRIORITY_INTRODUCTION = "DndConfirmedPriorityIntroduction"; + String DND_CONFIRMED_SILENCE_INTRODUCTION = "DndConfirmedSilenceIntroduction"; String DND_FAVORITE_BUCKET_INDEX = "DndCountdownMinuteIndex"; String DND_NONE_SELECTED = "DndNoneSelected"; + String DND_FAVORITE_ZEN = "DndFavoriteZen"; } public static boolean getBoolean(Context context, @Key String key, boolean defaultValue) { 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 6ce63d6..5145bc7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java @@ -37,7 +37,11 @@ import com.android.systemui.volume.ZenModePanel; /** Quick settings tile: Do not disturb **/ public class DndTile extends QSTile<QSTile.BooleanState> { - private static final Intent ZEN_SETTINGS = new Intent(Settings.ACTION_ZEN_MODE_SETTINGS); + private static final Intent ZEN_SETTINGS = + new Intent(Settings.ACTION_ZEN_MODE_SETTINGS); + + private static final Intent ZEN_PRIORITY_SETTINGS = + new Intent(Settings.ACTION_ZEN_MODE_PRIORITY_SETTINGS); private static final String ACTION_SET_VISIBLE = "com.android.systemui.dndtile.SET_VISIBLE"; private static final String EXTRA_VISIBLE = "visible"; @@ -87,7 +91,9 @@ public class DndTile extends QSTile<QSTile.BooleanState> { if (mState.value) { mController.setZen(Global.ZEN_MODE_OFF, null, TAG); } else { - mController.setZen(Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG); + int zen = Prefs.getInt(mContext, Prefs.Key.DND_FAVORITE_ZEN, Global.ZEN_MODE_ALARMS); + mController.setZen(zen, null, TAG); + refreshState(zen); // this one's optimistic showDetail(true); } } @@ -209,8 +215,8 @@ public class DndTile extends QSTile<QSTile.BooleanState> { R.layout.zen_mode_panel, parent, false); if (convertView == null) { zmp.init(mController); - zmp.setEmbedded(true); zmp.addOnAttachStateChangeListener(this); + zmp.setCallback(mZenModePanelCallback); } return zmp; } @@ -225,4 +231,22 @@ public class DndTile extends QSTile<QSTile.BooleanState> { mShowingDetail = false; } } + + private final ZenModePanel.Callback mZenModePanelCallback = new ZenModePanel.Callback() { + @Override + public void onPrioritySettings() { + mHost.startSettingsActivity(ZEN_PRIORITY_SETTINGS); + } + + @Override + public void onInteraction() { + // noop + } + + @Override + public void onExpanded(boolean expanded) { + // noop + } + }; + } 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 fb42ba1..0e8e844 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -224,14 +224,14 @@ public class PhoneStatusBarPolicy { } else if (mZen == Global.ZEN_MODE_NO_INTERRUPTIONS) { zenVisible = true; zenIconId = R.drawable.stat_sys_zen_none; - zenDescription = mContext.getString(R.string.zen_no_interruptions); + zenDescription = mContext.getString(R.string.interruption_level_none); } else if (mZen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) { zenVisible = true; zenIconId = R.drawable.stat_sys_zen_important; - zenDescription = mContext.getString(R.string.zen_important_interruptions); + zenDescription = mContext.getString(R.string.interruption_level_priority); } - if (DndTile.isVisible(mContext) + if (DndTile.isVisible(mContext) && !DndTile.isCombinedIcon(mContext) && audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) { volumeVisible = true; volumeIconId = R.drawable.stat_sys_ringer_silent; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java index 67cc788..9d84a85 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java @@ -35,6 +35,7 @@ public interface ZenModeController { boolean isZenAvailable(); ComponentName getEffectsSuppressor(); boolean isCountdownConditionSupported(); + int getCurrentUser(); public static class Callback { public void onZenChanged(int zen) {} @@ -45,4 +46,5 @@ public interface ZenModeController { public void onManualRuleChanged(ZenRule rule) {} public void onConfigChanged(ZenModeConfig config) {} } + }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java index 830a197..5b80ac2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.policy; +import android.app.ActivityManager; import android.app.AlarmManager; import android.app.NotificationManager; import android.content.BroadcastReceiver; @@ -159,6 +160,11 @@ public class ZenModeControllerImpl implements ZenModeController { .isSystemConditionProviderEnabled(ZenModeConfig.COUNTDOWN_PATH); } + @Override + public int getCurrentUser() { + return ActivityManager.getCurrentUser(); + } + private void fireNextAlarmChanged() { for (Callback cb : mCallbacks) { cb.onNextAlarmChanged(); diff --git a/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java b/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java index 4f20ac7..f7cb9fe 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java +++ b/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java @@ -17,6 +17,7 @@ package com.android.systemui.volume; import android.content.Context; +import android.graphics.Typeface; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -30,6 +31,8 @@ import java.util.Objects; public class SegmentedButtons extends LinearLayout { private static final int LABEL_RES_KEY = R.id.label; + private static final Typeface REGULAR = Typeface.create("sans-serif", Typeface.NORMAL); + private static final Typeface MEDIUM = Typeface.create("sans-serif-medium", Typeface.NORMAL); private final Context mContext; private final LayoutInflater mInflater; @@ -60,6 +63,7 @@ public class SegmentedButtons extends LinearLayout { final Object tag = c.getTag(); final boolean selected = Objects.equals(mSelectedValue, tag); c.setSelected(selected); + c.setTypeface(selected ? MEDIUM : REGULAR); } fireOnSelected(); } diff --git a/packages/SystemUI/src/com/android/systemui/volume/Util.java b/packages/SystemUI/src/com/android/systemui/volume/Util.java index 216a4da..4214091 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/Util.java +++ b/packages/SystemUI/src/com/android/systemui/volume/Util.java @@ -144,9 +144,14 @@ class Util { return HMMAA.format(new Date(millis)); } - public static void setText(TextView tv, CharSequence text) { - if (Objects.equals(tv.getText(), text)) return; + private static CharSequence emptyToNull(CharSequence str) { + return str == null || str.length() == 0 ? null : str; + } + + public static boolean setText(TextView tv, CharSequence text) { + if (Objects.equals(emptyToNull(tv.getText()), emptyToNull(text))) return false; tv.setText(text); + return true; } public static final void setVisOrGone(View v, boolean vis) { diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java index bb4aa61..9434036 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java @@ -37,7 +37,6 @@ import android.os.Looper; import android.os.Message; import android.os.SystemClock; import android.provider.Settings.Global; -import android.service.notification.ZenModeConfig; import android.util.DisplayMetrics; import android.util.Log; import android.util.SparseBooleanArray; @@ -52,7 +51,6 @@ import android.view.ViewGroup.MarginLayoutParams; import android.view.Window; import android.view.WindowManager; import android.view.animation.DecelerateInterpolator; -import android.widget.Button; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.SeekBar; @@ -90,16 +88,12 @@ public class VolumeDialog { private final ViewGroup mDialogView; private final ViewGroup mDialogContentView; private final ImageButton mExpandButton; - private final TextView mFootlineText; - private final Button mFootlineAction; private final View mSettingsButton; - private final View mFooter; private final List<VolumeRow> mRows = new ArrayList<VolumeRow>(); private final SpTexts mSpTexts; private final SparseBooleanArray mDynamic = new SparseBooleanArray(); private final KeyguardManager mKeyguard; private final int mExpandButtonAnimationDuration; - private final View mTextFooter; private final ZenFooter mZenFooter; private final LayoutTransition mLayoutTransition; private final Object mSafetyWarningLock = new Object(); @@ -108,8 +102,6 @@ public class VolumeDialog { private boolean mExpanded; private int mActiveStream; private boolean mShowHeaders = VolumePrefs.DEFAULT_SHOW_HEADERS; - private boolean mShowFooter = VolumePrefs.DEFAULT_SHOW_FOOTER; - private boolean mShowZenFooter = VolumePrefs.DEFAULT_ZEN_FOOTER; private boolean mAutomute = VolumePrefs.DEFAULT_ENABLE_AUTOMUTE; private boolean mSilentMode = VolumePrefs.DEFAULT_ENABLE_SILENT_MODE; private State mState; @@ -118,7 +110,7 @@ public class VolumeDialog { private SafetyWarningDialog mSafetyWarning; private Callback mCallback; - public VolumeDialog(Context context, VolumeDialogController controller, + public VolumeDialog(Context context, int windowType, VolumeDialogController controller, ZenModeController zenModeController, Callback callback) { mContext = context; mController = controller; @@ -141,7 +133,7 @@ public class VolumeDialog { mDialog.setCanceledOnTouchOutside(true); final Resources res = mContext.getResources(); final WindowManager.LayoutParams lp = window.getAttributes(); - lp.type = WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; + lp.type = windowType; lp.format = PixelFormat.TRANSLUCENT; lp.setTitle(VolumeDialog.class.getSimpleName()); lp.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL; @@ -176,17 +168,11 @@ public class VolumeDialog { addRow(AudioManager.STREAM_SYSTEM, R.drawable.ic_volume_system, R.drawable.ic_volume_system_mute, false); - mTextFooter = mDialog.findViewById(R.id.volume_text_footer); - mFootlineText = (TextView) mDialog.findViewById(R.id.volume_footline_text); - mSpTexts.add(mFootlineText); - mFootlineAction = (Button) mDialog.findViewById(R.id.volume_footline_action_button); - mSpTexts.add(mFootlineAction); - mFooter = mDialog.findViewById(R.id.volume_footer); mSettingsButton = mDialog.findViewById(R.id.volume_settings_button); mSettingsButton.setOnClickListener(mClickSettings); mExpandButtonAnimationDuration = res.getInteger(R.integer.volume_expand_animation_duration); mZenFooter = (ZenFooter) mDialog.findViewById(R.id.volume_zen_footer); - mZenFooter.init(zenModeController, mZenFooterCallback); + mZenFooter.init(zenModeController); controller.addCallback(mControllerCallbackH, mHandler); controller.getState(); @@ -217,18 +203,6 @@ public class VolumeDialog { mHandler.sendEmptyMessage(H.RECHECK_ALL); } - public void setShowFooter(boolean show) { - if (mShowFooter == show) return; - mShowFooter = show; - mHandler.sendEmptyMessage(H.RECHECK_ALL); - } - - public void setZenFooter(boolean zen) { - if (mShowZenFooter == zen) return; - mShowZenFooter = zen; - mHandler.sendEmptyMessage(H.RECHECK_ALL); - } - public void setAutomute(boolean automute) { if (mAutomute == automute) return; mAutomute = automute; @@ -315,7 +289,6 @@ public class VolumeDialog { writer.print(" mActiveStream: "); writer.println(mActiveStream); writer.print(" mDynamic: "); writer.println(mDynamic); writer.print(" mShowHeaders: "); writer.println(mShowHeaders); - writer.print(" mShowFooter: "); writer.println(mShowFooter); writer.print(" mAutomute: "); writer.println(mAutomute); writer.print(" mSilentMode: "); writer.println(mSilentMode); } @@ -444,7 +417,6 @@ public class VolumeDialog { } private int computeTimeoutH() { - if (mZenFooter != null && mZenFooter.isFooterExpanded()) return 10000; if (mSafetyWarning != null) return 5000; if (mExpanded || mExpanding) return 5000; if (mActiveStream == AudioManager.STREAM_MUSIC) return 1500; @@ -515,18 +487,9 @@ public class VolumeDialog { final VolumeRow activeRow = getActiveRow(); updateFooterH(); updateExpandButtonH(); - final boolean footerVisible = mFooter.getVisibility() == View.VISIBLE; if (!mShowing) { trimObsoleteH(); } - // first, find the last visible row - VolumeRow lastVisible = null; - for (VolumeRow row : mRows) { - final boolean isActive = row == activeRow; - if (isVisibleH(row, isActive)) { - lastVisible = row; - } - } // apply changes to all rows for (VolumeRow row : mRows) { final boolean isActive = row == activeRow; @@ -542,8 +505,7 @@ public class VolumeDialog { row.settingsButton.setImageResource(expandButtonRes); } } - Util.setVisOrInvis(row.settingsButton, - mExpanded && (!footerVisible && row == lastVisible)); + Util.setVisOrInvis(row.settingsButton, false); row.header.setAlpha(mExpanded && isActive ? 1 : 0.5f); } } @@ -585,51 +547,9 @@ public class VolumeDialog { updateFooterH(); } - private void updateTextFooterH() { - final boolean zen = mState.zenMode != Global.ZEN_MODE_OFF; - final boolean wasVisible = mFooter.getVisibility() == View.VISIBLE; - Util.setVisOrGone(mTextFooter, mExpanded && mShowFooter && (zen || mShowing && wasVisible)); - if (mTextFooter.getVisibility() == View.VISIBLE) { - String text = null; - String action = null; - if (mState.exitCondition != null) { - final long countdown = ZenModeConfig.tryParseCountdownConditionId(mState - .exitCondition.id); - if (countdown != 0) { - text = mContext.getString(R.string.volume_dnd_ends_at, - Util.getShortTime(countdown)); - action = mContext.getString(R.string.volume_end_now); - } - } - if (text == null) { - text = mContext.getString(R.string.volume_dnd_is_on); - } - if (action == null) { - action = mContext.getString(R.string.volume_turn_off); - } - Util.setText(mFootlineText, text); - Util.setText(mFootlineAction, action); - mFootlineAction.setOnClickListener(mTurnOffDnd); - } - Util.setVisOrGone(mFootlineText, zen); - Util.setVisOrGone(mFootlineAction, zen); - } - private void updateFooterH() { - if (!mShowFooter) { - Util.setVisOrGone(mFooter, false); - return; - } - if (mShowZenFooter) { - Util.setVisOrGone(mTextFooter, false); - final boolean ringActive = mActiveStream == AudioManager.STREAM_RING; - Util.setVisOrGone(mZenFooter, mZenFooter.isZen() && ringActive - || mShowing && (mExpanded || mZenFooter.getVisibility() == View.VISIBLE)); - mZenFooter.update(); - } else { - Util.setVisOrGone(mZenFooter, false); - updateTextFooterH(); - } + Util.setVisOrGone(mZenFooter, mState.zenMode != Global.ZEN_MODE_OFF); + mZenFooter.update(); } private void updateVolumeRowH(VolumeRow row) { @@ -642,12 +562,20 @@ public class VolumeDialog { } final boolean isRingStream = row.stream == AudioManager.STREAM_RING; final boolean isSystemStream = row.stream == AudioManager.STREAM_SYSTEM; + final boolean isAlarmStream = row.stream == AudioManager.STREAM_ALARM; + final boolean isMusicStream = row.stream == AudioManager.STREAM_MUSIC; final boolean isRingVibrate = isRingStream && mState.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE; - final boolean isNoned = (isRingStream || isSystemStream) - && mState.zenMode == Global.ZEN_MODE_NO_INTERRUPTIONS; - final boolean isLimited = isRingStream - && mState.zenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; + final boolean isRingSilent = isRingStream + && mState.ringerModeInternal == AudioManager.RINGER_MODE_SILENT; + final boolean isZenAlarms = mState.zenMode == Global.ZEN_MODE_ALARMS; + final boolean isZenNone = mState.zenMode == Global.ZEN_MODE_NO_INTERRUPTIONS; + final boolean isZenPriority = mState.zenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; + final boolean isRingZenNone = (isRingStream || isSystemStream) && isZenNone; + final boolean isRingLimited = isRingStream && isZenPriority; + final boolean zenMuted = isZenAlarms ? (isRingStream || isSystemStream) + : isZenNone ? (isRingStream || isSystemStream || isAlarmStream || isMusicStream) + : false; // update slider max final int max = ss.levelMax * 100; @@ -663,15 +591,15 @@ public class VolumeDialog { // update header text final String text; - if (isNoned) { + if (isRingZenNone) { text = mContext.getString(R.string.volume_stream_muted_dnd, ss.name); - } else if (isRingVibrate && isLimited) { + } else if (isRingVibrate && isRingLimited) { text = mContext.getString(R.string.volume_stream_vibrate_dnd, ss.name); } else if (isRingVibrate) { text = mContext.getString(R.string.volume_stream_vibrate, ss.name); } else if (ss.muted || mAutomute && ss.level == 0) { text = mContext.getString(R.string.volume_stream_muted, ss.name); - } else if (isLimited) { + } else if (isRingLimited) { text = mContext.getString(R.string.volume_stream_limited_dnd, ss.name); } else { text = ss.name; @@ -679,11 +607,12 @@ public class VolumeDialog { Util.setText(row.header, text); // update icon - final boolean iconEnabled = mAutomute || ss.muteSupported; + final boolean iconEnabled = (mAutomute || ss.muteSupported) && !zenMuted; row.icon.setEnabled(iconEnabled); row.icon.setAlpha(iconEnabled ? 1 : 0.5f); final int iconRes = isRingVibrate ? R.drawable.ic_volume_ringer_vibrate + : isRingSilent || zenMuted ? row.cachedIconRes : ss.routedToBluetooth ? (ss.muted ? R.drawable.ic_volume_media_bt_mute : R.drawable.ic_volume_media_bt) @@ -705,10 +634,11 @@ public class VolumeDialog { : Events.ICON_STATE_UNKNOWN; // update slider - updateVolumeRowSliderH(row); + updateVolumeRowSliderH(row, zenMuted); } - private void updateVolumeRowSliderH(VolumeRow row) { + private void updateVolumeRowSliderH(VolumeRow row, boolean zenMuted) { + row.slider.setEnabled(!zenMuted); if (row.tracking) { return; // don't update if user is sliding } @@ -887,46 +817,6 @@ public class VolumeDialog { } }; - private final View.OnClickListener mTurnOffDnd = new View.OnClickListener() { - @Override - public void onClick(View v) { - mSettingsButton.postDelayed(new Runnable() { - @Override - public void run() { - mController.setZenMode(Global.ZEN_MODE_OFF); - } - }, WAIT_FOR_RIPPLE); - } - }; - - private final ZenFooter.Callback mZenFooterCallback = new ZenFooter.Callback() { - @Override - public void onFooterExpanded() { - mHandler.sendEmptyMessage(H.RESCHEDULE_TIMEOUT); - } - - @Override - public void onSettingsClicked() { - dismiss(Events.DISMISS_REASON_SETTINGS_CLICKED); - if (mCallback != null) { - mCallback.onZenSettingsClicked(); - } - } - - @Override - public void onDoneClicked() { - dismiss(Events.DISMISS_REASON_DONE_CLICKED); - } - - @Override - public void onPrioritySettingsClicked() { - dismiss(Events.DISMISS_REASON_SETTINGS_CLICKED); - if (mCallback != null) { - mCallback.onZenPrioritySettingsClicked(); - } - } - }; - private final class H extends Handler { private static final int SHOW = 1; private static final int DISMISS = 2; diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java index 86abfcc..1083f40 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java @@ -24,6 +24,7 @@ import android.media.VolumePolicy; import android.os.Bundle; import android.os.Handler; import android.provider.Settings; +import android.view.WindowManager; import com.android.systemui.SystemUI; import com.android.systemui.keyguard.KeyguardViewMediator; @@ -61,7 +62,8 @@ public class VolumeDialogComponent implements VolumeComponent { } }; mZenModeController = zen; - mDialog = new VolumeDialog(context, mController, zen, mVolumeDialogCallback); + mDialog = new VolumeDialog(context, WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY, + mController, zen, mVolumeDialogCallback); applyConfiguration(); } @@ -76,12 +78,10 @@ public class VolumeDialogComponent implements VolumeComponent { mDialog.setStreamImportant(AudioManager.STREAM_ALARM, true); mDialog.setStreamImportant(AudioManager.STREAM_SYSTEM, false); mDialog.setShowHeaders(false); - mDialog.setShowFooter(true); - mDialog.setZenFooter(true); mDialog.setAutomute(true); mDialog.setSilentMode(false); mController.setVolumePolicy(mVolumePolicy); - mController.showDndTile(false); + mController.showDndTile(true); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java index 012eb41..3a8081f 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java @@ -100,7 +100,7 @@ public class VolumeDialogController { private boolean mEnabled; private boolean mDestroyed; private VolumePolicy mVolumePolicy; - private boolean mShowDndTile = false; + private boolean mShowDndTile = true; public VolumeDialogController(Context context, ComponentName component) { mContext = context.getApplicationContext(); @@ -125,6 +125,10 @@ public class VolumeDialogController { return mAudio; } + public ZenModeConfig getZenModeConfig() { + return mNoMan.getZenModeConfig(); + } + public void dismiss() { mCallbacks.onDismissRequested(Events.DISMISS_REASON_VOLUME_CONTROLLER); } @@ -342,7 +346,7 @@ public class VolumeDialogController { updateRingerModeExternalW(mAudio.getRingerMode()); updateZenModeW(); updateEffectsSuppressorW(mNoMan.getEffectsSuppressor()); - updateExitConditionW(); + updateZenModeConfigW(); mCallbacks.onStateChanged(mState); } @@ -395,17 +399,10 @@ public class VolumeDialogController { return stream == AudioManager.STREAM_RING || stream == AudioManager.STREAM_NOTIFICATION; } - private Condition getExitCondition() { - final ZenModeConfig config = mNoMan.getZenModeConfig(); - return config == null ? null - : config.manualRule == null ? null - : config.manualRule.condition; - } - - private boolean updateExitConditionW() { - final Condition exitCondition = getExitCondition(); - if (Objects.equals(mState.exitCondition, exitCondition)) return false; - mState.exitCondition = exitCondition; + private boolean updateZenModeConfigW() { + final ZenModeConfig zenModeConfig = getZenModeConfig(); + if (Objects.equals(mState.zenModeConfig, zenModeConfig)) return false; + mState.zenModeConfig = zenModeConfig; return true; } @@ -750,7 +747,7 @@ public class VolumeDialogController { changed = updateZenModeW(); } if (ZEN_MODE_CONFIG_URI.equals(uri)) { - changed = updateExitConditionW(); + changed = updateZenModeConfigW(); } if (changed) { mCallbacks.onStateChanged(mState); @@ -943,7 +940,7 @@ public class VolumeDialogController { public int zenMode; public ComponentName effectsSuppressor; public String effectsSuppressorName; - public Condition exitCondition; + public ZenModeConfig zenModeConfig; public int activeStream = NO_ACTIVE_STREAM; public State copy() { @@ -956,7 +953,7 @@ public class VolumeDialogController { rt.zenMode = zenMode; if (effectsSuppressor != null) rt.effectsSuppressor = effectsSuppressor.clone(); rt.effectsSuppressorName = effectsSuppressorName; - if (exitCondition != null) rt.exitCondition = exitCondition.copy(); + if (zenModeConfig != null) rt.zenModeConfig = zenModeConfig.copy(); rt.activeStream = activeStream; return rt; } @@ -977,10 +974,15 @@ public class VolumeDialogController { sb.append(",zenMode:").append(zenMode); sb.append(",effectsSuppressor:").append(effectsSuppressor); sb.append(",effectsSuppressorName:").append(effectsSuppressorName); - sb.append(",exitCondition:").append(exitCondition); + sb.append(",zenModeConfig:").append(zenModeConfig); sb.append(",activeStream:").append(activeStream); return sb.append('}').toString(); } + + public Condition getManualExitCondition() { + return zenModeConfig != null && zenModeConfig.manualRule != null + ? zenModeConfig.manualRule.condition : null; + } } public interface Callbacks { diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java index 915e998..04339eb 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java @@ -32,8 +32,6 @@ public class VolumePrefs { public static final String PREF_SHOW_HEADERS = "pref_show_headers"; public static final String PREF_SHOW_FAKE_REMOTE_1 = "pref_show_fake_remote_1"; public static final String PREF_SHOW_FAKE_REMOTE_2 = "pref_show_fake_remote_2"; - public static final String PREF_SHOW_FOOTER = "pref_show_footer"; - public static final String PREF_ZEN_FOOTER = "pref_zen_footer"; public static final String PREF_ENABLE_AUTOMUTE = "pref_enable_automute"; public static final String PREF_ENABLE_SILENT_MODE = "pref_enable_silent_mode"; public static final String PREF_DEBUG_LOGGING = "pref_debug_logging"; @@ -46,10 +44,8 @@ public class VolumePrefs { public static final String PREF_ADJUST_NOTIFICATION = "pref_adjust_notification"; public static final boolean DEFAULT_SHOW_HEADERS = true; - public static final boolean DEFAULT_SHOW_FOOTER = true; public static final boolean DEFAULT_ENABLE_AUTOMUTE = true; public static final boolean DEFAULT_ENABLE_SILENT_MODE = true; - public static final boolean DEFAULT_ZEN_FOOTER = true; public static void unregisterCallbacks(Context c, OnSharedPreferenceChangeListener listener) { prefs(c).unregisterOnSharedPreferenceChangeListener(listener); diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java index 5f04aaf..2688813 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java @@ -103,7 +103,7 @@ public class VolumeUI extends SystemUI { private void setDefaultVolumeController(boolean register) { if (register) { - DndTile.setVisible(mContext, false); + DndTile.setVisible(mContext, true); if (LOGD) Log.d(TAG, "Registering default volume controller"); getVolumeComponent().register(); } else { diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java index 775c87d..8aded45 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java @@ -16,20 +16,12 @@ package com.android.systemui.volume; import android.animation.LayoutTransition; -import android.animation.ValueAnimator; -import android.app.ActivityManager; import android.content.Context; -import android.content.res.Resources; import android.provider.Settings.Global; import android.service.notification.ZenModeConfig; import android.util.AttributeSet; -import android.util.Log; -import android.util.TypedValue; import android.view.View; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.LinearLayout; -import android.widget.Switch; import android.widget.TextView; import com.android.systemui.R; @@ -38,70 +30,36 @@ import com.android.systemui.statusbar.policy.ZenModeController; import java.util.Objects; /** - * Switch bar + zen mode panel (conditions) attached to the bottom of the volume dialog. + * Zen mode information (and end button) attached to the bottom of the volume dialog. */ public class ZenFooter extends LinearLayout { private static final String TAG = Util.logTag(ZenFooter.class); private final Context mContext; - private final float mSecondaryAlpha; - private final LayoutTransition mLayoutTransition; - private ZenModeController mController; - private Switch mSwitch; - private ZenModePanel mZenModePanel; - private View mZenModePanelButtons; - private View mZenModePanelMoreButton; - private View mZenModePanelDoneButton; - private View mSwitchBar; - private View mSwitchBarIcon; - private View mSummary; private TextView mSummaryLine1; private TextView mSummaryLine2; - private boolean mFooterExpanded; + private View mEndNowButton; private int mZen = -1; private ZenModeConfig mConfig; - private Callback mCallback; + private ZenModeController mController; public ZenFooter(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; - mSecondaryAlpha = getFloat(context.getResources(), R.dimen.volume_secondary_alpha); - mLayoutTransition = new LayoutTransition(); - mLayoutTransition.setDuration(new ValueAnimator().getDuration() / 2); - mLayoutTransition.disableTransitionType(LayoutTransition.DISAPPEARING); - mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); - } - - private static float getFloat(Resources r, int resId) { - final TypedValue tv = new TypedValue(); - r.getValue(resId, tv, true); - return tv.getFloat(); + setLayoutTransition(new LayoutTransition()); } @Override protected void onFinishInflate() { super.onFinishInflate(); - mSwitchBar = findViewById(R.id.volume_zen_switch_bar); - mSwitchBarIcon = findViewById(R.id.volume_zen_switch_bar_icon); - mSwitch = (Switch) findViewById(R.id.volume_zen_switch); - mZenModePanel = (ZenModePanel) findViewById(R.id.zen_mode_panel); - mZenModePanelButtons = findViewById(R.id.volume_zen_mode_panel_buttons); - mZenModePanelMoreButton = findViewById(R.id.volume_zen_mode_panel_more); - mZenModePanelDoneButton = findViewById(R.id.volume_zen_mode_panel_done); - mSummary = findViewById(R.id.volume_zen_panel_summary); - mSummaryLine1 = (TextView) findViewById(R.id.volume_zen_panel_summary_line_1); - mSummaryLine2 = (TextView) findViewById(R.id.volume_zen_panel_summary_line_2); + mSummaryLine1 = (TextView) findViewById(R.id.volume_zen_summary_line_1); + mSummaryLine2 = (TextView) findViewById(R.id.volume_zen_summary_line_2); + mEndNowButton = findViewById(R.id.volume_zen_end_now); } - public void init(ZenModeController controller, Callback callback) { - mCallback = callback; - mController = controller; - mZenModePanel.init(controller); - mZenModePanel.setEmbedded(true); - mZenModePanel.setCallback(mZenModePanelCallback); - mSwitch.setOnCheckedChangeListener(mCheckedListener); - mController.addCallback(new ZenModeController.Callback() { + public void init(final ZenModeController controller) { + controller.addCallback(new ZenModeController.Callback() { @Override public void onZenChanged(int zen) { setZen(zen); @@ -111,30 +69,15 @@ public class ZenFooter extends LinearLayout { setConfig(config); } }); - mSwitchBar.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - mSwitch.setChecked(!mSwitch.isChecked()); - } - }); - mZenModePanelMoreButton.setOnClickListener(new OnClickListener() { + mEndNowButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - if (mCallback != null) { - mCallback.onSettingsClicked(); - } + controller.setZen(Global.ZEN_MODE_OFF, null, TAG); } }); - mZenModePanelDoneButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - if (mCallback != null) { - mCallback.onDoneClicked(); - } - } - }); - mZen = mController.getZen(); - mConfig = mController.getConfig(); + mZen = controller.getZen(); + mConfig = controller.getConfig(); + mController = controller; update(); } @@ -166,96 +109,17 @@ public class ZenFooter extends LinearLayout { return mZen == Global.ZEN_MODE_NO_INTERRUPTIONS; } - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - setLayoutTransition(null); - setFooterExpanded(false); - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - setLayoutTransition(mLayoutTransition); - } - - private boolean setFooterExpanded(boolean expanded) { - if (mFooterExpanded == expanded) return false; - mFooterExpanded = expanded; - update(); - if (mCallback != null) { - mCallback.onFooterExpanded(); - } - return true; - } - - public boolean isFooterExpanded() { - return mFooterExpanded; - } - public void update() { - final boolean isZen = isZen(); - mSwitch.setOnCheckedChangeListener(null); - mSwitch.setChecked(isZen); - mSwitch.setOnCheckedChangeListener(mCheckedListener); - Util.setVisOrGone(mZenModePanel, isZen && mFooterExpanded); - Util.setVisOrGone(mZenModePanelButtons, isZen && mFooterExpanded); - Util.setVisOrGone(mSummary, isZen && !mFooterExpanded); - 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); + final String line2 = ZenModeConfig.getConditionSummary(mContext, mConfig, - ActivityManager.getCurrentUser()); + mController.getCurrentUser()); Util.setText(mSummaryLine2, line2); } - private final ZenModePanel.Callback mZenModePanelCallback = new ZenModePanel.Callback() { - @Override - public void onMoreSettings() { - if (mCallback != null) { - mCallback.onSettingsClicked(); - } - } - - @Override - public void onPrioritySettings() { - if (mCallback != null) { - mCallback.onPrioritySettingsClicked(); - } - } - - @Override - public void onInteraction() { - // noop - } - - @Override - public void onExpanded(boolean expanded) { - // noop - } - }; - - private final OnCheckedChangeListener mCheckedListener = new OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (D.BUG) Log.d(TAG, "onCheckedChanged " + isChecked); - if (isChecked != isZen()) { - final int newZen = isChecked ? Global.ZEN_MODE_ALARMS : Global.ZEN_MODE_OFF; - mZen = newZen; // this one's optimistic - setFooterExpanded(isChecked); - mController.setZen(newZen, null, TAG); - } - } - }; - - public interface Callback { - void onFooterExpanded(); - void onSettingsClicked(); - void onDoneClicked(); - void onPrioritySettingsClicked(); - } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java index 1b563dc..9f9c9ac 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java @@ -41,8 +41,6 @@ import android.util.MathUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.animation.AnimationUtils; -import android.view.animation.Interpolator; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ImageView; @@ -85,22 +83,14 @@ public class ZenModePanel extends LinearLayout { private final H mHandler = new H(); private final ZenPrefs mPrefs; private final IconPulser mIconPulser; - private final int mSubheadWarningColor; - private final int mSubheadColor; - private final Interpolator mInterpolator; private final TransitionHelper mTransitionHelper = new TransitionHelper(); private final Uri mForeverId; private String mTag = TAG + "/" + Integer.toHexString(System.identityHashCode(this)); private SegmentedButtons mZenButtons; - private ViewGroup mZenButtonsContainer; - private View mZenSubhead; - private TextView mZenSubheadCollapsed; - private TextView mZenSubheadExpanded; - private View mZenEmbeddedDivider; - private View mMoreSettings; private View mZenIntroduction; + private TextView mZenIntroductionMessage; private View mZenIntroductionConfirm; private View mZenIntroductionCustomize; private LinearLayout mZenConditions; @@ -113,7 +103,6 @@ public class ZenModePanel extends LinearLayout { private int mFirstConditionIndex; private boolean mRequestingConditions; private Condition mExitCondition; - private String mExitConditionText; private int mBucketIndex = -1; private boolean mExpanded; private boolean mHidden; @@ -123,7 +112,6 @@ public class ZenModePanel extends LinearLayout { private Condition mSessionExitCondition; private Condition[] mConditions; private Condition mTimeCondition; - private boolean mEmbedded; public ZenModePanel(Context context, AttributeSet attrs) { super(context, attrs); @@ -131,10 +119,6 @@ public class ZenModePanel extends LinearLayout { mPrefs = new ZenPrefs(); mInflater = LayoutInflater.from(mContext.getApplicationContext()); mIconPulser = new IconPulser(mContext); - mSubheadWarningColor = context.getColor(R.color.system_warning_color); - mSubheadColor = context.getColor(R.color.qs_subhead); - mInterpolator = AnimationUtils.loadInterpolator(mContext, - com.android.internal.R.interpolator.fast_out_slow_in); mForeverId = Condition.newId(mContext).appendPath("forever").build(); if (DEBUG) Log.d(mTag, "new ZenModePanel"); } @@ -149,25 +133,13 @@ public class ZenModePanel extends LinearLayout { pw.print(" mExpanded="); pw.println(mExpanded); pw.print(" mSessionZen="); pw.println(mSessionZen); pw.print(" mAttachedZen="); pw.println(mAttachedZen); - pw.print(" mEmbedded="); pw.println(mEmbedded); + pw.print(" mConfirmedPriorityIntroduction="); + pw.println(mPrefs.mConfirmedPriorityIntroduction); + pw.print(" mConfirmedSilenceIntroduction="); + pw.println(mPrefs.mConfirmedSilenceIntroduction); mTransitionHelper.dump(fd, pw, args); } - public void setEmbedded(boolean embedded) { - if (mEmbedded == embedded) return; - mEmbedded = embedded; - mZenButtonsContainer.setLayoutTransition(mEmbedded ? null : newLayoutTransition(null)); - setLayoutTransition(mEmbedded ? null : newLayoutTransition(null)); - if (mEmbedded) { - mZenButtonsContainer.setBackground(null); - } else { - mZenButtonsContainer.setBackgroundResource(R.drawable.qs_background_secondary); - } - mZenButtons.getChildAt(3).setVisibility(mEmbedded ? GONE : VISIBLE); - mZenEmbeddedDivider.setVisibility(mEmbedded ? VISIBLE : GONE); - updateWidgets(); - } - @Override protected void onFinishInflate() { super.onFinishInflate(); @@ -179,37 +151,10 @@ public class ZenModePanel extends LinearLayout { 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); - mZenButtonsContainer = (ViewGroup) findViewById(R.id.zen_buttons_container); - mZenButtonsContainer.setLayoutTransition(newLayoutTransition(null)); - - mZenSubhead = findViewById(R.id.zen_subhead); - mZenEmbeddedDivider = findViewById(R.id.zen_embedded_divider); - - mZenSubheadCollapsed = (TextView) findViewById(R.id.zen_subhead_collapsed); - mZenSubheadCollapsed.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - setExpanded(true); - } - }); - Interaction.register(mZenSubheadCollapsed, mInteractionCallback); - - mZenSubheadExpanded = (TextView) findViewById(R.id.zen_subhead_expanded); - Interaction.register(mZenSubheadExpanded, mInteractionCallback); - - mMoreSettings = findViewById(R.id.zen_more_settings); - mMoreSettings.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - fireMoreSettings(); - } - }); - Interaction.register(mMoreSettings, mInteractionCallback); - mZenIntroduction = findViewById(R.id.zen_introduction); + mZenIntroductionMessage = (TextView) findViewById(R.id.zen_introduction_message); mZenIntroductionConfirm = findViewById(R.id.zen_introduction_confirm); mZenIntroductionConfirm.setOnClickListener(new OnClickListener() { @Override @@ -230,25 +175,25 @@ public class ZenModePanel extends LinearLayout { mZenConditions = (LinearLayout) findViewById(R.id.zen_conditions); - setLayoutTransition(newLayoutTransition(mTransitionHelper)); } private void confirmZenIntroduction() { - if (DEBUG) Log.d(TAG, "confirmZenIntroduction"); - Prefs.putBoolean(mContext, Prefs.Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, true); + final String prefKey = prefKeyForConfirmation(getSelectedZen(Global.ZEN_MODE_OFF)); + if (prefKey == null) return; + if (DEBUG) Log.d(TAG, "confirmZenIntroduction " + prefKey); + Prefs.putBoolean(mContext, prefKey, true); mHandler.sendEmptyMessage(H.UPDATE_WIDGETS); } - private LayoutTransition newLayoutTransition(TransitionListener listener) { - final LayoutTransition transition = new LayoutTransition(); - transition.disableTransitionType(LayoutTransition.DISAPPEARING); - transition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); - transition.disableTransitionType(LayoutTransition.APPEARING); - transition.setInterpolator(LayoutTransition.CHANGE_APPEARING, mInterpolator); - if (listener != null) { - transition.addTransitionListener(listener); + private static String prefKeyForConfirmation(int zen) { + switch (zen) { + case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: + return Prefs.Key.DND_CONFIRMED_PRIORITY_INTRODUCTION; + case Global.ZEN_MODE_NO_INTERRUPTIONS: + return Prefs.Key.DND_CONFIRMED_SILENCE_INTRODUCTION; + default: + return null; } - return transition; } @Override @@ -260,7 +205,6 @@ public class ZenModePanel extends LinearLayout { mSessionZen = mAttachedZen; mTransitionHelper.clear(); setSessionExitCondition(copy(mExitCondition)); - refreshExitConditionText(); updateWidgets(); setRequestingConditions(!mHidden); } @@ -274,9 +218,6 @@ public class ZenModePanel extends LinearLayout { mAttachedZen = -1; mSessionZen = -1; setSessionExitCondition(null); - if (!mEmbedded) { - setExpanded(false); - } setRequestingConditions(false); mTransitionHelper.clear(); } @@ -359,7 +300,6 @@ public class ZenModePanel extends LinearLayout { for (int i = 0; i < mMaxConditions; i++) { mZenConditions.addView(mInflater.inflate(R.layout.zen_mode_condition, this, false)); } - refreshExitConditionText(); mSessionZen = getSelectedZen(-1); handleUpdateManualRule(mController.getManualRule()); if (DEBUG) Log.d(mTag, "init mExitCondition=" + mExitCondition); @@ -375,7 +315,6 @@ public class ZenModePanel extends LinearLayout { if (Objects.equals(mExitCondition, exitCondition)) return; mExitCondition = exitCondition; if (DEBUG) Log.d(mTag, "mExitCondition=" + getConditionId(mExitCondition)); - refreshExitConditionText(); updateWidgets(); } @@ -395,10 +334,6 @@ public class ZenModePanel extends LinearLayout { return condition == null ? null : condition.copy(); } - private void refreshExitConditionText() { - mExitConditionText = getExitConditionText(mContext, mExitCondition); - } - public static String getExitConditionText(Context context, Condition exitCondition) { if (exitCondition == null) { return foreverSummary(context); @@ -430,7 +365,7 @@ public class ZenModePanel extends LinearLayout { private void handleUpdateZen(int zen) { if (mSessionZen != -1 && mSessionZen != zen) { - setExpanded(mEmbedded && isShown() || !mEmbedded && zen != Global.ZEN_MODE_OFF); + setExpanded(isShown()); mSessionZen = zen; } mZenButtons.setSelectedValue(zen); @@ -480,30 +415,18 @@ public class ZenModePanel extends LinearLayout { return; } final int zen = getSelectedZen(Global.ZEN_MODE_OFF); - final boolean zenOff = zen == Global.ZEN_MODE_OFF; final boolean zenImportant = zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; final boolean zenNone = zen == Global.ZEN_MODE_NO_INTERRUPTIONS; - final boolean expanded = !mHidden && mExpanded; - final boolean conditions = mEmbedded || !zenOff && expanded; - final boolean introduction = conditions && zenImportant && !mPrefs.mConfirmedIntroduction; + final boolean introduction = (zenImportant && !mPrefs.mConfirmedPriorityIntroduction + || zenNone && !mPrefs.mConfirmedSilenceIntroduction); mZenButtons.setVisibility(mHidden ? GONE : VISIBLE); - mZenSubhead.setVisibility(!mHidden && !zenOff && !mEmbedded ? VISIBLE : GONE); - mZenSubheadExpanded.setVisibility(expanded ? VISIBLE : GONE); - mZenSubheadCollapsed.setVisibility(!expanded ? VISIBLE : GONE); - mMoreSettings.setVisibility(zenImportant && expanded ? VISIBLE : GONE); - mZenConditions.setVisibility(conditions ? VISIBLE : GONE); - - if (zenNone) { - mZenSubheadExpanded.setText(R.string.zen_no_interruptions_with_warning); - mZenSubheadCollapsed.setText(mExitConditionText); - } else if (zenImportant) { - mZenSubheadExpanded.setText(R.string.zen_important_interruptions); - mZenSubheadCollapsed.setText(mExitConditionText); - } - mZenSubheadExpanded.setTextColor(zenNone && mPrefs.isNoneDangerous() - ? mSubheadWarningColor : mSubheadColor); mZenIntroduction.setVisibility(introduction ? VISIBLE : GONE); + if (introduction) { + mZenIntroductionMessage.setText(zenImportant ? R.string.zen_priority_introduction + : R.string.zen_silence_introduction); + mZenIntroductionCustomize.setVisibility(zenImportant ? VISIBLE : GONE); + } } private static Condition parseExistingTimeCondition(Context context, Condition condition) { @@ -761,13 +684,13 @@ public class ZenModePanel extends LinearLayout { String modeText; switch(zen) { case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: - modeText = mContext.getString(R.string.zen_important_interruptions); + modeText = mContext.getString(R.string.interruption_level_priority); break; case Global.ZEN_MODE_NO_INTERRUPTIONS: - modeText = mContext.getString(R.string.zen_no_interruptions); + modeText = mContext.getString(R.string.interruption_level_none); break; case Global.ZEN_MODE_ALARMS: - modeText = mContext.getString(R.string.zen_alarms); + modeText = mContext.getString(R.string.interruption_level_alarms); break; default: return; @@ -837,12 +760,6 @@ public class ZenModePanel extends LinearLayout { setSessionExitCondition(copy(condition)); } - private void fireMoreSettings() { - if (mCallback != null) { - mCallback.onMoreSettings(); - } - } - private void fireInteraction() { if (mCallback != null) { mCallback.onInteraction(); @@ -887,7 +804,6 @@ public class ZenModePanel extends LinearLayout { } public interface Callback { - void onMoreSettings(); void onPrioritySettings(); void onInteraction(); void onExpanded(boolean expanded); @@ -907,7 +823,8 @@ public class ZenModePanel extends LinearLayout { private int mMinuteIndex; private int mNoneSelected; - private boolean mConfirmedIntroduction; + private boolean mConfirmedPriorityIntroduction; + private boolean mConfirmedSilenceIntroduction; private ZenPrefs() { mNoneDangerousThreshold = mContext.getResources() @@ -915,11 +832,8 @@ public class ZenModePanel extends LinearLayout { Prefs.registerListener(mContext, this); updateMinuteIndex(); updateNoneSelected(); - updateConfirmedIntroduction(); - } - - public boolean isNoneDangerous() { - return mNoneSelected < mNoneDangerousThreshold; + updateConfirmedPriorityIntroduction(); + updateConfirmedSilenceIntroduction(); } public void trackNoneSelected() { @@ -945,7 +859,8 @@ public class ZenModePanel extends LinearLayout { public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { updateMinuteIndex(); updateNoneSelected(); - updateConfirmedIntroduction(); + updateConfirmedPriorityIntroduction(); + updateConfirmedSilenceIntroduction(); } private void updateMinuteIndex() { @@ -968,12 +883,22 @@ public class ZenModePanel extends LinearLayout { return MathUtils.constrain(noneSelected, 0, Integer.MAX_VALUE); } - private void updateConfirmedIntroduction() { + private void updateConfirmedPriorityIntroduction() { final boolean confirmed = Prefs.getBoolean(mContext, Prefs.Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, false); - if (confirmed == mConfirmedIntroduction) return; - mConfirmedIntroduction = confirmed; - if (DEBUG) Log.d(mTag, "Confirmed introduction: " + mConfirmedIntroduction); + if (confirmed == mConfirmedPriorityIntroduction) return; + mConfirmedPriorityIntroduction = confirmed; + if (DEBUG) Log.d(mTag, "Confirmed priority introduction: " + + mConfirmedPriorityIntroduction); + } + + private void updateConfirmedSilenceIntroduction() { + final boolean confirmed = Prefs.getBoolean(mContext, + Prefs.Key.DND_CONFIRMED_SILENCE_INTRODUCTION, false); + if (confirmed == mConfirmedSilenceIntroduction) return; + mConfirmedSilenceIntroduction = confirmed; + if (DEBUG) Log.d(mTag, "Confirmed silence introduction: " + + mConfirmedSilenceIntroduction); } } @@ -981,12 +906,16 @@ public class ZenModePanel extends LinearLayout { @Override public void onSelected(final Object value) { if (value != null && mZenButtons.isShown() && isAttachedToWindow()) { - if (DEBUG) Log.d(mTag, "mZenButtonsCallback selected=" + value); + final int zen = (Integer) value; + if (DEBUG) Log.d(mTag, "mZenButtonsCallback selected=" + zen); final Uri realConditionId = getRealConditionId(mSessionExitCondition); AsyncTask.execute(new Runnable() { @Override public void run() { - mController.setZen((Integer) value, realConditionId, TAG + ".selectZen"); + mController.setZen(zen, realConditionId, TAG + ".selectZen"); + if (zen != Global.ZEN_MODE_OFF) { + Prefs.putInt(mContext, Prefs.Key.DND_FAVORITE_ZEN, zen); + } } }); } diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 6b56279..eb28ed0 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -1803,9 +1803,7 @@ public class AudioService extends IAudioService.Stub { if (!shouldMute) { // unmute // ring and notifications volume should never be 0 when not silenced - // on voice capable devices or devices that support vibration - if ((isPlatformVoice() || mHasVibrator) && - mStreamVolumeAlias[streamType] == AudioSystem.STREAM_RING) { + if (mStreamVolumeAlias[streamType] == AudioSystem.STREAM_RING) { synchronized (VolumeStreamState.class) { final VolumeStreamState vss = mStreamStates[streamType]; for (int i = 0; i < vss.mIndexMap.size(); i++) { @@ -2986,10 +2984,7 @@ public class AudioService extends IAudioService.Stub { mLoweredFromNormalToVibrateTime = SystemClock.uptimeMillis(); } } else { - // (oldIndex < step) is equivalent to (old UI index == 0) - if ((oldIndex < step) - && mVolumePolicy.volumeDownToEnterSilent - && mPrevVolDirection != AudioManager.ADJUST_LOWER) { + if (oldIndex == step && mVolumePolicy.volumeDownToEnterSilent) { ringerMode = RINGER_MODE_SILENT; } } @@ -3018,7 +3013,8 @@ public class AudioService extends IAudioService.Stub { if (mVolumePolicy.volumeDownToEnterSilent) { final long diff = SystemClock.uptimeMillis() - mLoweredFromNormalToVibrateTime; - if (diff > mVolumePolicy.vibrateToSilentDebounce) { + if (diff > mVolumePolicy.vibrateToSilentDebounce + && mRingerModeDelegate.canVolumeDownEnterSilent()) { ringerMode = RINGER_MODE_SILENT; } } else { diff --git a/services/core/java/com/android/server/notification/ZenLog.java b/services/core/java/com/android/server/notification/ZenLog.java index 1e318ef..44fbd2d 100644 --- a/services/core/java/com/android/server/notification/ZenLog.java +++ b/services/core/java/com/android/server/notification/ZenLog.java @@ -115,8 +115,8 @@ public class ZenLog { append(TYPE_UNSUBSCRIBE, uri + "," + subscribeResult(provider, e)); } - public static void traceConfig(ZenModeConfig oldConfig, ZenModeConfig newConfig) { - append(TYPE_CONFIG, newConfig != null ? newConfig.toString() : null); + public static void traceConfig(String reason, ZenModeConfig newConfig) { + append(TYPE_CONFIG, reason + "," + (newConfig != null ? newConfig.toString() : null)); } public static void traceDisableEffects(NotificationRecord record, String reason) { diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index 9cb8af5..83f0bcf 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -17,6 +17,7 @@ package com.android.server.notification; import static android.media.AudioAttributes.USAGE_ALARM; +import static android.media.AudioAttributes.USAGE_MEDIA; import static android.media.AudioAttributes.USAGE_NOTIFICATION; import static android.media.AudioAttributes.USAGE_NOTIFICATION_RINGTONE; @@ -262,8 +263,8 @@ public class ZenModeHelper { } mConditions.evaluateConfig(config); // may modify config if (config.equals(mConfig)) return true; - if (DEBUG) Log.d(TAG, "setConfig reason=" + reason); - ZenLog.traceConfig(mConfig, config); + if (DEBUG) Log.d(TAG, "setConfig reason=" + reason, new Throwable()); + ZenLog.traceConfig(reason, config); final boolean policyChanged = !Objects.equals(getNotificationPolicy(mConfig), getNotificationPolicy(config)); mConfig = config; @@ -329,9 +330,10 @@ public class ZenModeHelper { || mEffectsSuppressed; applyRestrictions(muteCalls, USAGE_NOTIFICATION_RINGTONE); - // alarm restrictions - final boolean muteAlarms = mZenMode == Global.ZEN_MODE_NO_INTERRUPTIONS; - applyRestrictions(muteAlarms, USAGE_ALARM); + // alarm/media restrictions + final boolean zenNone = mZenMode == Global.ZEN_MODE_NO_INTERRUPTIONS; + applyRestrictions(zenNone, USAGE_ALARM); + applyRestrictions(zenNone, USAGE_MEDIA); } private void applyRestrictions(boolean mute, int usage) { @@ -590,6 +592,11 @@ public class ZenModeHelper { ringerModeInternal, ringerModeInternalOut); return ringerModeInternalOut; } + + @Override + public boolean canVolumeDownEnterSilent() { + return mZenMode == Global.ZEN_MODE_OFF; + } } private final class SettingsObserver extends ContentObserver { |