From b9826dd191f118d19afbb531adeb038e40fa55ae Mon Sep 17 00:00:00 2001 From: Beverly Date: Thu, 12 Apr 2018 15:02:45 -0400 Subject: [PATCH] Don't show ringer status if dnd overrides it If DND is overriding the ringer then: - Don't show silent/vibrate ringer in status bar - Don't show silent/vibrate ringer status in QS Change-Id: I0c921905c6b06e1379b497dd1ac9e3fce483d5fd Fixes:77651394 Test: manual --- .../service/notification/ZenModeConfig.java | 11 +++ .../systemui/qs/QuickStatusBarHeader.java | 72 +++++++++++++++---- .../statusbar/phone/PhoneStatusBarPolicy.java | 26 ++++--- 3 files changed, 84 insertions(+), 25 deletions(-) diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index 7b01f7a49be4f..e3f4ad1887aeb 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -1469,6 +1469,17 @@ public class ZenModeConfig implements Parcelable { && !allowRepeatCallers; } + /** + * Determines if DND is currently overriding the ringer + */ + public static boolean isZenOverridingRinger(int zen, ZenModeConfig zenConfig) { + // TODO (beverlyt): check if apps can bypass dnd b/77729075 + return zen == Global.ZEN_MODE_NO_INTERRUPTIONS + || zen == Global.ZEN_MODE_ALARMS + || (zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS + && ZenModeConfig.areAllPriorityOnlyNotificationZenSoundsMuted(zenConfig)); + } + /** * Determines whether dnd behavior should mute all sounds controlled by ringer */ diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index e2af90d6bbce2..129b4e99f9956 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -32,6 +32,7 @@ import android.graphics.Rect; import android.media.AudioManager; import android.os.Handler; import android.provider.AlarmClock; +import android.service.notification.ZenModeConfig; import android.support.annotation.VisibleForTesting; import android.text.format.DateUtils; import android.util.AttributeSet; @@ -48,10 +49,8 @@ import com.android.systemui.BatteryMeterView; import com.android.systemui.Dependency; import com.android.systemui.Prefs; import com.android.systemui.R; -import com.android.systemui.SysUiServiceProvider; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.qs.QSDetail.Callback; -import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.PhoneStatusBarView; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager; @@ -60,8 +59,10 @@ import com.android.systemui.statusbar.policy.DarkIconDispatcher; import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver; import com.android.systemui.statusbar.policy.DateView; import com.android.systemui.statusbar.policy.NextAlarmController; +import com.android.systemui.statusbar.policy.ZenModeController; import java.util.Locale; +import java.util.Objects; /** * View that contains the top-most bits of the screen (primarily the status bar with date, time, and @@ -69,7 +70,8 @@ import java.util.Locale; * contents. */ public class QuickStatusBarHeader extends RelativeLayout implements - View.OnClickListener, NextAlarmController.NextAlarmChangeCallback { + View.OnClickListener, NextAlarmController.NextAlarmChangeCallback, + ZenModeController.Callback { private static final String TAG = "QuickStatusBarHeader"; private static final boolean DEBUG = false; @@ -116,6 +118,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements private DateView mDateView; private NextAlarmController mAlarmController; + private ZenModeController mZenController; /** Counts how many times the long press tooltip has been shown to the user. */ private int mShownCount; @@ -135,6 +138,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements public QuickStatusBarHeader(Context context, AttributeSet attrs) { super(context, attrs); mAlarmController = Dependency.get(NextAlarmController.class); + mZenController = Dependency.get(ZenModeController.class); mShownCount = getStoredShownCount(); } @@ -179,19 +183,45 @@ public class QuickStatusBarHeader extends RelativeLayout implements } private void updateStatusText() { + boolean changed = updateRingerStatus() || updateAlarmStatus(); + + if (changed) { + boolean alarmVisible = mNextAlarmTextView.getVisibility() == View.VISIBLE; + boolean ringerVisible = mRingerModeTextView.getVisibility() == View.VISIBLE; + mStatusSeparator.setVisibility(alarmVisible && ringerVisible ? View.VISIBLE + : View.GONE); + updateTooltipShow(); + } + } + + private boolean updateRingerStatus() { + boolean isOriginalVisible = mRingerModeTextView.getVisibility() == View.VISIBLE; + CharSequence originalRingerText = mRingerModeTextView.getText(); + boolean ringerVisible = false; - if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE) { - mRingerModeIcon.setImageResource(R.drawable.stat_sys_ringer_vibrate); - mRingerModeTextView.setText(R.string.qs_status_phone_vibrate); - ringerVisible = true; - } else if (mRingerMode == AudioManager.RINGER_MODE_SILENT) { - mRingerModeIcon.setImageResource(R.drawable.stat_sys_ringer_silent); - mRingerModeTextView.setText(R.string.qs_status_phone_muted); - ringerVisible = true; + if (!ZenModeConfig.isZenOverridingRinger(mZenController.getZen(), + mZenController.getConfig())) { + if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE) { + mRingerModeIcon.setImageResource(R.drawable.stat_sys_ringer_vibrate); + mRingerModeTextView.setText(R.string.qs_status_phone_vibrate); + ringerVisible = true; + } else if (mRingerMode == AudioManager.RINGER_MODE_SILENT) { + mRingerModeIcon.setImageResource(R.drawable.stat_sys_ringer_silent); + mRingerModeTextView.setText(R.string.qs_status_phone_muted); + ringerVisible = true; + } } mRingerModeIcon.setVisibility(ringerVisible ? View.VISIBLE : View.GONE); mRingerModeTextView.setVisibility(ringerVisible ? View.VISIBLE : View.GONE); + return isOriginalVisible != ringerVisible || + !Objects.equals(originalRingerText, mRingerModeTextView.getText()); + } + + private boolean updateAlarmStatus() { + boolean isOriginalVisible = mNextAlarmTextView.getVisibility() == View.VISIBLE; + CharSequence originalAlarmText = mNextAlarmTextView.getText(); + boolean alarmVisible = false; if (mNextAlarm != null) { alarmVisible = true; @@ -199,10 +229,10 @@ public class QuickStatusBarHeader extends RelativeLayout implements } mNextAlarmIcon.setVisibility(alarmVisible ? View.VISIBLE : View.GONE); mNextAlarmTextView.setVisibility(alarmVisible ? View.VISIBLE : View.GONE); - mStatusSeparator.setVisibility(alarmVisible && ringerVisible ? View.VISIBLE : View.GONE); - updateTooltipShow(); - } + return isOriginalVisible != alarmVisible || + !Objects.equals(originalAlarmText, mNextAlarmTextView.getText()); + } private void applyDarkness(int id, Rect tintArea, float intensity, int color) { View v = findViewById(id); @@ -365,10 +395,12 @@ public class QuickStatusBarHeader extends RelativeLayout implements mListening = listening; if (listening) { + mZenController.addCallback(this); mAlarmController.addCallback(this); mContext.registerReceiver(mRingerReceiver, new IntentFilter(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION)); } else { + mZenController.removeCallback(this); mAlarmController.removeCallback(this); mContext.unregisterReceiver(mRingerReceiver); } @@ -388,6 +420,17 @@ public class QuickStatusBarHeader extends RelativeLayout implements updateStatusText(); } + @Override + public void onZenChanged(int zen) { + updateStatusText(); + + } + + @Override + public void onConfigChanged(ZenModeConfig config) { + updateStatusText(); + } + private void updateTooltipShow() { if (hasStatusText()) { hideLongPressTooltip(true /* shouldShowStatusText */); @@ -544,5 +587,4 @@ public class QuickStatusBarHeader extends RelativeLayout implements public static float getColorIntensity(@ColorInt int color) { return color == Color.WHITE ? 0 : 1; } - } 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 3e7b0d9f62d03..420c517aa651a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -50,6 +50,7 @@ import android.os.UserManager; import android.provider.Settings; import android.provider.Settings.Global; import android.service.notification.StatusBarNotification; +import android.service.notification.ZenModeConfig; import android.telecom.TelecomManager; import android.util.ArraySet; import android.util.Log; @@ -286,6 +287,11 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, updateVolumeZen(); } + @Override + public void onConfigChanged(ZenModeConfig config) { + updateVolumeZen(); + } + @Override public void onLocationActiveChanged(boolean active) { updateLocation(); @@ -363,16 +369,16 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, zenDescription = mContext.getString(R.string.interruption_level_priority); } - if (zen != Global.ZEN_MODE_NO_INTERRUPTIONS && zen != Global.ZEN_MODE_ALARMS && - audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE) { - volumeVisible = true; - volumeIconId = R.drawable.stat_sys_ringer_vibrate; - volumeDescription = mContext.getString(R.string.accessibility_ringer_vibrate); - } else if (zen != Global.ZEN_MODE_NO_INTERRUPTIONS && zen != Global.ZEN_MODE_ALARMS && - audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) { - volumeVisible = true; - volumeIconId = R.drawable.stat_sys_ringer_silent; - volumeDescription = mContext.getString(R.string.accessibility_ringer_silent); + if (!ZenModeConfig.isZenOverridingRinger(zen, mZenController.getConfig())) { + if (audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE) { + volumeVisible = true; + volumeIconId = R.drawable.stat_sys_ringer_vibrate; + volumeDescription = mContext.getString(R.string.accessibility_ringer_vibrate); + } else if (audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) { + volumeVisible = true; + volumeIconId = R.drawable.stat_sys_ringer_silent; + volumeDescription = mContext.getString(R.string.accessibility_ringer_silent); + } } if (zenVisible) {