Merge "Alarm can end time-based rule." into nyc-dev

am: 7caa0b8724

* commit '7caa0b872479fef4067fbc1f824ca184addf9c37':
  Alarm can end time-based rule.
This commit is contained in:
Julia Reynolds
2016-02-17 15:27:48 +00:00
committed by android-build-merger
4 changed files with 57 additions and 23 deletions

View File

@@ -565,6 +565,10 @@ public class ZenModeConfig implements Parcelable {
private static boolean safeBoolean(XmlPullParser parser, String att, boolean defValue) {
final String val = parser.getAttributeValue(null, att);
return safeBoolean(val, defValue);
}
private static boolean safeBoolean(String val, boolean defValue) {
if (TextUtils.isEmpty(val)) return defValue;
return Boolean.valueOf(val);
}
@@ -802,6 +806,7 @@ public class ZenModeConfig implements Parcelable {
.appendQueryParameter("days", toDayList(schedule.days))
.appendQueryParameter("start", schedule.startHour + "." + schedule.startMinute)
.appendQueryParameter("end", schedule.endHour + "." + schedule.endMinute)
.appendQueryParameter("exitAtAlarm", String.valueOf(schedule.exitAtAlarm))
.build();
}
@@ -825,6 +830,7 @@ public class ZenModeConfig implements Parcelable {
rt.startMinute = start[1];
rt.endHour = end[0];
rt.endMinute = end[1];
rt.exitAtAlarm = safeBoolean(conditionId.getQueryParameter("exitAtAlarm"), false);
return rt;
}
@@ -838,6 +844,8 @@ public class ZenModeConfig implements Parcelable {
public int startMinute;
public int endHour;
public int endMinute;
public boolean exitAtAlarm;
public long nextAlarm;
@Override
public int hashCode() {
@@ -852,7 +860,8 @@ public class ZenModeConfig implements Parcelable {
&& startHour == other.startHour
&& startMinute == other.startMinute
&& endHour == other.endHour
&& endMinute == other.endMinute;
&& endMinute == other.endMinute
&& exitAtAlarm == other.exitAtAlarm;
}
public ScheduleInfo copy() {
@@ -865,6 +874,8 @@ public class ZenModeConfig implements Parcelable {
rt.startMinute = startMinute;
rt.endHour = endHour;
rt.endMinute = endMinute;
rt.exitAtAlarm = exitAtAlarm;
rt.nextAlarm = nextAlarm;
return rt;
}
}

View File

@@ -526,8 +526,8 @@ public class ZenModePanel extends LinearLayout {
setToMidnight(nextAlarm);
if (weekRange.compareTo(nextAlarm) >= 0) {
return ZenModeConfig.toNextAlarmCondition(mContext, now, nextAlarmMs,
ActivityManager.getCurrentUser());
return ZenModeConfig.toNextAlarmCondition(mContext, now,
nextAlarmMs, ActivityManager.getCurrentUser());
}
}
return null;

View File

@@ -40,16 +40,12 @@ public class ScheduleCalendar {
updateDays();
}
public long nextScheduleStart(long time) {
if (mSchedule == null || mDays.size() == 0) return Long.MAX_VALUE;
final long start = getTime(time, mSchedule.startHour, mSchedule.startMinute);
for (int i = 0; i < Calendar.SATURDAY; i++) {
final long t = addDays(start, i);
if (t > time && isInSchedule(t)) {
return t;
public void maybeSetNextAlarm(long now, long nextAlarm) {
if (mSchedule != null) {
if (mSchedule.exitAtAlarm && now > mSchedule.nextAlarm) {
mSchedule.nextAlarm = nextAlarm;
}
}
return Long.MAX_VALUE;
}
public void setTimeZone(TimeZone tz) {
@@ -60,7 +56,13 @@ public class ScheduleCalendar {
if (mSchedule == null) return 0;
final long nextStart = getNextTime(now, mSchedule.startHour, mSchedule.startMinute);
final long nextEnd = getNextTime(now, mSchedule.endHour, mSchedule.endMinute);
return Math.min(nextStart, nextEnd);
long nextScheduleTime = Math.min(nextStart, nextEnd);
if (mSchedule.exitAtAlarm && mSchedule.nextAlarm > now) {
return Math.min(nextScheduleTime, mSchedule.nextAlarm);
} else {
return nextScheduleTime;
}
}
private long getNextTime(long now, int hr, int min) {
@@ -84,7 +86,15 @@ public class ScheduleCalendar {
if (end <= start) {
end = addDays(end, 1);
}
return isInSchedule(-1, time, start, end) || isInSchedule(0, time, start, end);
boolean isInSchedule =
isInSchedule(-1, time, start, end) || isInSchedule(0, time, start, end);
if (isInSchedule && mSchedule.exitAtAlarm
&& mSchedule.nextAlarm != 0
&& time >= mSchedule.nextAlarm) {
return false;
} else {
return isInSchedule;
}
}
private boolean isInSchedule(int daysOffset, long time, long start, long end) {

View File

@@ -16,6 +16,7 @@
package com.android.server.notification;
import android.app.ActivityManager;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
@@ -28,7 +29,7 @@ import android.service.notification.Condition;
import android.service.notification.IConditionProvider;
import android.service.notification.ZenModeConfig;
import android.service.notification.ZenModeConfig.ScheduleInfo;
import android.util.ArraySet;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Slog;
@@ -42,7 +43,7 @@ import java.util.TimeZone;
*/
public class ScheduleConditionProvider extends SystemConditionProviderService {
private static final String TAG = "ConditionProviders.SCP";
private static final boolean DEBUG = Log.isLoggable("ConditionProviders", Log.DEBUG);
private static final boolean DEBUG = true || Log.isLoggable("ConditionProviders", Log.DEBUG);
public static final ComponentName COMPONENT =
new ComponentName("android", ScheduleConditionProvider.class.getName());
@@ -53,8 +54,9 @@ public class ScheduleConditionProvider extends SystemConditionProviderService {
private static final String EXTRA_TIME = "time";
private final Context mContext = this;
private final ArraySet<Uri> mSubscriptions = new ArraySet<Uri>();
private final ArrayMap<Uri, ScheduleCalendar> mSubscriptions = new ArrayMap<>();
private AlarmManager mAlarmManager;
private boolean mConnected;
private boolean mRegistered;
private long mNextAlarmTime;
@@ -80,9 +82,9 @@ public class ScheduleConditionProvider extends SystemConditionProviderService {
pw.print(" mRegistered="); pw.println(mRegistered);
pw.println(" mSubscriptions=");
final long now = System.currentTimeMillis();
for (Uri conditionId : mSubscriptions) {
for (Uri conditionId : mSubscriptions.keySet()) {
pw.print(" ");
pw.print(meetsSchedule(conditionId, now) ? "* " : " ");
pw.print(meetsSchedule(mSubscriptions.get(conditionId), now) ? "* " : " ");
pw.println(conditionId);
}
dumpUpcomingTime(pw, "mNextAlarmTime", mNextAlarmTime, now);
@@ -113,7 +115,7 @@ public class ScheduleConditionProvider extends SystemConditionProviderService {
notifyCondition(conditionId, Condition.STATE_FALSE, "badCondition");
return;
}
mSubscriptions.add(conditionId);
mSubscriptions.put(conditionId, toScheduleCalendar(conditionId));
evaluateSubscriptions();
}
@@ -135,13 +137,18 @@ public class ScheduleConditionProvider extends SystemConditionProviderService {
}
private void evaluateSubscriptions() {
if (mAlarmManager == null) {
mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
}
setRegistered(!mSubscriptions.isEmpty());
final long now = System.currentTimeMillis();
mNextAlarmTime = 0;
for (Uri conditionId : mSubscriptions) {
final ScheduleCalendar cal = toScheduleCalendar(conditionId);
long nextUserAlarmTime = getNextAlarm();
for (Uri conditionId : mSubscriptions.keySet()) {
final ScheduleCalendar cal = mSubscriptions.get(conditionId);
if (cal != null && cal.isInSchedule(now)) {
notifyCondition(conditionId, Condition.STATE_TRUE, "meetsSchedule");
cal.maybeSetNextAlarm(now, nextUserAlarmTime);
} else {
notifyCondition(conditionId, Condition.STATE_FALSE, "!meetsSchedule");
}
@@ -175,8 +182,13 @@ public class ScheduleConditionProvider extends SystemConditionProviderService {
}
}
private static boolean meetsSchedule(Uri conditionId, long time) {
final ScheduleCalendar cal = toScheduleCalendar(conditionId);
public long getNextAlarm() {
final AlarmManager.AlarmClockInfo info = mAlarmManager.getNextAlarmClock(
ActivityManager.getCurrentUser());
return info != null ? info.getTriggerTime() : 0;
}
private static boolean meetsSchedule(ScheduleCalendar cal, long time) {
return cal != null && cal.isInSchedule(time);
}
@@ -198,6 +210,7 @@ public class ScheduleConditionProvider extends SystemConditionProviderService {
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
filter.addAction(ACTION_EVALUATE);
filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
registerReceiver(mReceiver, filter);
} else {
unregisterReceiver(mReceiver);