Volume: Simple dialog footer, DND in quick settings.
- Show DND tile by default, this is now the only
place to manage DND modes / end conditions.
- Remove super footer from volume dialog, replace with
a simplified version that displays the current mode
and allows ending DND.
- Remove obsolete text-only footer from codebase.
- Migrate remaining volume items into main resource files.
- Rename "No interruptions" to "Total silence".
- Add new user information banner for "Total silence"
- Crude media filtering for Total Silence.
(deeper muting changes will be done as a followup)
- Disable volume dialog sliders completely if muted due
to zen.
- Cleanup ZenModePanel: assume embedded mode, remove
expandable subhead
- Remember "favorite" DND mode inside the DND config panel.
- AudioService: consult ringer-mode-delegate before voluming
down into silent.
- Add new hour options to time-based exit conditions.
- Volume dialog visual updates to move closer to final visuals.
- Unify ringer=silent with DND.
Bug: 19260237
Change-Id: I05d7e001eca3b5125418ec3bc4087d0cb8866717
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.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.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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
}
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 @@
// 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 @@
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 @@
: 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 @@
}
};
- 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;