diff options
3 files changed, 32 insertions, 8 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java index b325653..ed6ddd2 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java @@ -244,7 +244,7 @@ public class ZenModePanel extends LinearLayout { } private void setExitCondition(Condition exitCondition) { - if (sameConditionId(mExitCondition, exitCondition)) return; + if (Objects.equals(mExitCondition, exitCondition)) return; mExitCondition = exitCondition; refreshExitConditionText(); updateWidgets(); diff --git a/services/core/java/com/android/server/notification/ConditionProviders.java b/services/core/java/com/android/server/notification/ConditionProviders.java index a1085d3..5de1a64 100644 --- a/services/core/java/com/android/server/notification/ConditionProviders.java +++ b/services/core/java/com/android/server/notification/ConditionProviders.java @@ -260,9 +260,11 @@ public class ConditionProviders extends ManagedServices { for (int i = 0; i < N; i++) { final Condition c = conditions[i]; final ConditionRecord r = getRecordLocked(c.id, info.component); + final Condition oldCondition = r.condition; + final boolean conditionUpdate = oldCondition != null && !oldCondition.equals(c); r.info = info; r.condition = c; - // if manual, exit zen if false (or failed) + // if manual, exit zen if false (or failed), update if true (and changed) if (r.isManual) { if (c.state == Condition.STATE_FALSE || c.state == Condition.STATE_ERROR) { final boolean failed = c.state == Condition.STATE_ERROR; @@ -275,6 +277,10 @@ public class ConditionProviders extends ManagedServices { "manualConditionExit"); unsubscribeLocked(r); r.isManual = false; + } else if (c.state == Condition.STATE_TRUE && conditionUpdate) { + if (DEBUG) Slog.d(TAG, "Current condition updated, still true. old=" + + oldCondition + " new=" + c); + setZenModeCondition(c, "conditionUpdate"); } } // if automatic, exit zen if false (or failed), enter zen if true @@ -559,7 +565,7 @@ public class ConditionProviders extends ManagedServices { // enter downtime, or update mode if reconfigured during an active downtime if (inDowntime && (mode == Global.ZEN_MODE_OFF || downtimeCurrent) && config != null) { final Condition condition = mDowntime.createCondition(config.toDowntimeInfo(), - Condition.STATE_TRUE); + config.sleepNone, Condition.STATE_TRUE); mZenModeHelper.setZenMode(downtimeMode, "downtimeEnter"); setZenModeCondition(condition, "downtime"); } diff --git a/services/core/java/com/android/server/notification/DowntimeConditionProvider.java b/services/core/java/com/android/server/notification/DowntimeConditionProvider.java index 0fb5732..097589a 100644 --- a/services/core/java/com/android/server/notification/DowntimeConditionProvider.java +++ b/services/core/java/com/android/server/notification/DowntimeConditionProvider.java @@ -122,7 +122,8 @@ public class DowntimeConditionProvider extends ConditionProviderService { if (DEBUG) Slog.d(TAG, "onRequestConditions relevance=" + relevance); if ((relevance & Condition.FLAG_RELEVANT_NOW) != 0) { if (isInDowntime() && mConfig != null) { - notifyCondition(createCondition(mConfig.toDowntimeInfo(), Condition.STATE_TRUE)); + notifyCondition(createCondition(mConfig.toDowntimeInfo(), mConfig.sleepNone, + Condition.STATE_TRUE)); } } } @@ -135,7 +136,7 @@ public class DowntimeConditionProvider extends ConditionProviderService { final int state = mConfig.toDowntimeInfo().equals(downtime) && isInDowntime() ? Condition.STATE_TRUE : Condition.STATE_FALSE; if (DEBUG) Slog.d(TAG, "notify condition state: " + Condition.stateToString(state)); - notifyCondition(createCondition(downtime, state)); + notifyCondition(createCondition(downtime, mConfig.sleepNone, state)); } } @@ -157,14 +158,22 @@ public class DowntimeConditionProvider extends ConditionProviderService { return mDowntimeMode != Global.ZEN_MODE_OFF; } - public Condition createCondition(DowntimeInfo downtime, int state) { + public Condition createCondition(DowntimeInfo downtime, boolean orAlarm, int state) { if (downtime == null) return null; final Uri id = ZenModeConfig.toDowntimeConditionId(downtime); final String skeleton = DateFormat.is24HourFormat(mContext) ? "Hm" : "hma"; final Locale locale = Locale.getDefault(); final String pattern = DateFormat.getBestDateTimePattern(locale, skeleton); - final long time = getTime(System.currentTimeMillis(), downtime.endHour, downtime.endMinute); - final String formatted = new SimpleDateFormat(pattern, locale).format(new Date(time)); + final long now = System.currentTimeMillis(); + long endTime = getTime(now, downtime.endHour, downtime.endMinute); + if (orAlarm) { + final AlarmClockInfo nextAlarm = mTracker.getNextAlarm(); + final long nextAlarmTime = nextAlarm != null ? nextAlarm.getTriggerTime() : 0; + if (nextAlarmTime > now && nextAlarmTime < endTime) { + endTime = nextAlarmTime; + } + } + final String formatted = new SimpleDateFormat(pattern, locale).format(new Date(endTime)); final String summary = mContext.getString(R.string.downtime_condition_summary, formatted); final String line1 = mContext.getString(R.string.downtime_condition_line_one); return new Condition(id, summary, line1, formatted, 0, state, Condition.FLAG_RELEVANT_NOW); @@ -302,6 +311,11 @@ public class DowntimeConditionProvider extends ConditionProviderService { private void onEvaluateNextAlarm(AlarmClockInfo nextAlarm, long wakeupTime, boolean booted) { if (!booted) return; // we don't know yet + // update condition description if we're in downtime (mode = none) + if (isInDowntime() && mConfig != null && mConfig.sleepNone) { + notifyCondition(createCondition(mConfig.toDowntimeInfo(), true /*orAlarm*/, + Condition.STATE_TRUE)); + } if (nextAlarm == null) return; // not fireable if (DEBUG) Slog.d(TAG, "onEvaluateNextAlarm " + mTracker.formatAlarmDebug(nextAlarm)); if (System.currentTimeMillis() > wakeupTime) { @@ -336,6 +350,10 @@ public class DowntimeConditionProvider extends ConditionProviderService { } else if (Intent.ACTION_TIMEZONE_CHANGED.equals(action)) { if (DEBUG) Slog.d(TAG, "timezone changed to " + TimeZone.getDefault()); mCalendar.setTimeZone(TimeZone.getDefault()); + mFiredAlarms.clear(); + } else if (Intent.ACTION_TIME_CHANGED.equals(action)) { + if (DEBUG) Slog.d(TAG, "time changed to " + now); + mFiredAlarms.clear(); } else { if (DEBUG) Slog.d(TAG, action + " fired at " + now); } |