Loading core/java/android/service/notification/ZenModeConfig.java +12 −1 Original line number Original line Diff line number Diff line Loading @@ -565,6 +565,10 @@ public class ZenModeConfig implements Parcelable { private static boolean safeBoolean(XmlPullParser parser, String att, boolean defValue) { private static boolean safeBoolean(XmlPullParser parser, String att, boolean defValue) { final String val = parser.getAttributeValue(null, att); 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; if (TextUtils.isEmpty(val)) return defValue; return Boolean.valueOf(val); return Boolean.valueOf(val); } } Loading Loading @@ -802,6 +806,7 @@ public class ZenModeConfig implements Parcelable { .appendQueryParameter("days", toDayList(schedule.days)) .appendQueryParameter("days", toDayList(schedule.days)) .appendQueryParameter("start", schedule.startHour + "." + schedule.startMinute) .appendQueryParameter("start", schedule.startHour + "." + schedule.startMinute) .appendQueryParameter("end", schedule.endHour + "." + schedule.endMinute) .appendQueryParameter("end", schedule.endHour + "." + schedule.endMinute) .appendQueryParameter("exitAtAlarm", String.valueOf(schedule.exitAtAlarm)) .build(); .build(); } } Loading @@ -825,6 +830,7 @@ public class ZenModeConfig implements Parcelable { rt.startMinute = start[1]; rt.startMinute = start[1]; rt.endHour = end[0]; rt.endHour = end[0]; rt.endMinute = end[1]; rt.endMinute = end[1]; rt.exitAtAlarm = safeBoolean(conditionId.getQueryParameter("exitAtAlarm"), false); return rt; return rt; } } Loading @@ -838,6 +844,8 @@ public class ZenModeConfig implements Parcelable { public int startMinute; public int startMinute; public int endHour; public int endHour; public int endMinute; public int endMinute; public boolean exitAtAlarm; public long nextAlarm; @Override @Override public int hashCode() { public int hashCode() { Loading @@ -852,7 +860,8 @@ public class ZenModeConfig implements Parcelable { && startHour == other.startHour && startHour == other.startHour && startMinute == other.startMinute && startMinute == other.startMinute && endHour == other.endHour && endHour == other.endHour && endMinute == other.endMinute; && endMinute == other.endMinute && exitAtAlarm == other.exitAtAlarm; } } public ScheduleInfo copy() { public ScheduleInfo copy() { Loading @@ -865,6 +874,8 @@ public class ZenModeConfig implements Parcelable { rt.startMinute = startMinute; rt.startMinute = startMinute; rt.endHour = endHour; rt.endHour = endHour; rt.endMinute = endMinute; rt.endMinute = endMinute; rt.exitAtAlarm = exitAtAlarm; rt.nextAlarm = nextAlarm; return rt; return rt; } } } } Loading packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -526,8 +526,8 @@ public class ZenModePanel extends LinearLayout { setToMidnight(nextAlarm); setToMidnight(nextAlarm); if (weekRange.compareTo(nextAlarm) >= 0) { if (weekRange.compareTo(nextAlarm) >= 0) { return ZenModeConfig.toNextAlarmCondition(mContext, now, nextAlarmMs, return ZenModeConfig.toNextAlarmCondition(mContext, now, ActivityManager.getCurrentUser()); nextAlarmMs, ActivityManager.getCurrentUser()); } } } } return null; return null; Loading services/core/java/com/android/server/notification/ScheduleCalendar.java +20 −10 Original line number Original line Diff line number Diff line Loading @@ -40,16 +40,12 @@ public class ScheduleCalendar { updateDays(); updateDays(); } } public long nextScheduleStart(long time) { public void maybeSetNextAlarm(long now, long nextAlarm) { if (mSchedule == null || mDays.size() == 0) return Long.MAX_VALUE; if (mSchedule != null) { final long start = getTime(time, mSchedule.startHour, mSchedule.startMinute); if (mSchedule.exitAtAlarm && now > mSchedule.nextAlarm) { for (int i = 0; i < Calendar.SATURDAY; i++) { mSchedule.nextAlarm = nextAlarm; final long t = addDays(start, i); if (t > time && isInSchedule(t)) { return t; } } } } return Long.MAX_VALUE; } } public void setTimeZone(TimeZone tz) { public void setTimeZone(TimeZone tz) { Loading @@ -60,7 +56,13 @@ public class ScheduleCalendar { if (mSchedule == null) return 0; if (mSchedule == null) return 0; final long nextStart = getNextTime(now, mSchedule.startHour, mSchedule.startMinute); final long nextStart = getNextTime(now, mSchedule.startHour, mSchedule.startMinute); final long nextEnd = getNextTime(now, mSchedule.endHour, mSchedule.endMinute); 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) { private long getNextTime(long now, int hr, int min) { Loading @@ -84,7 +86,15 @@ public class ScheduleCalendar { if (end <= start) { if (end <= start) { end = addDays(end, 1); 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) { private boolean isInSchedule(int daysOffset, long time, long start, long end) { Loading services/core/java/com/android/server/notification/ScheduleConditionProvider.java +23 −10 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.notification; package com.android.server.notification; import android.app.ActivityManager; import android.app.AlarmManager; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.BroadcastReceiver; Loading @@ -28,7 +29,7 @@ import android.service.notification.Condition; import android.service.notification.IConditionProvider; import android.service.notification.IConditionProvider; import android.service.notification.ZenModeConfig; import android.service.notification.ZenModeConfig; import android.service.notification.ZenModeConfig.ScheduleInfo; import android.service.notification.ZenModeConfig.ScheduleInfo; import android.util.ArraySet; import android.util.ArrayMap; import android.util.Log; import android.util.Log; import android.util.Slog; import android.util.Slog; Loading @@ -42,7 +43,7 @@ import java.util.TimeZone; */ */ public class ScheduleConditionProvider extends SystemConditionProviderService { public class ScheduleConditionProvider extends SystemConditionProviderService { private static final String TAG = "ConditionProviders.SCP"; 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 = public static final ComponentName COMPONENT = new ComponentName("android", ScheduleConditionProvider.class.getName()); new ComponentName("android", ScheduleConditionProvider.class.getName()); Loading @@ -53,8 +54,9 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { private static final String EXTRA_TIME = "time"; private static final String EXTRA_TIME = "time"; private final Context mContext = this; 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 mConnected; private boolean mRegistered; private boolean mRegistered; private long mNextAlarmTime; private long mNextAlarmTime; Loading @@ -80,9 +82,9 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { pw.print(" mRegistered="); pw.println(mRegistered); pw.print(" mRegistered="); pw.println(mRegistered); pw.println(" mSubscriptions="); pw.println(" mSubscriptions="); final long now = System.currentTimeMillis(); final long now = System.currentTimeMillis(); for (Uri conditionId : mSubscriptions) { for (Uri conditionId : mSubscriptions.keySet()) { pw.print(" "); pw.print(" "); pw.print(meetsSchedule(conditionId, now) ? "* " : " "); pw.print(meetsSchedule(mSubscriptions.get(conditionId), now) ? "* " : " "); pw.println(conditionId); pw.println(conditionId); } } dumpUpcomingTime(pw, "mNextAlarmTime", mNextAlarmTime, now); dumpUpcomingTime(pw, "mNextAlarmTime", mNextAlarmTime, now); Loading Loading @@ -113,7 +115,7 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { notifyCondition(conditionId, Condition.STATE_FALSE, "badCondition"); notifyCondition(conditionId, Condition.STATE_FALSE, "badCondition"); return; return; } } mSubscriptions.add(conditionId); mSubscriptions.put(conditionId, toScheduleCalendar(conditionId)); evaluateSubscriptions(); evaluateSubscriptions(); } } Loading @@ -135,13 +137,18 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { } } private void evaluateSubscriptions() { private void evaluateSubscriptions() { if (mAlarmManager == null) { mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); } setRegistered(!mSubscriptions.isEmpty()); setRegistered(!mSubscriptions.isEmpty()); final long now = System.currentTimeMillis(); final long now = System.currentTimeMillis(); mNextAlarmTime = 0; mNextAlarmTime = 0; for (Uri conditionId : mSubscriptions) { long nextUserAlarmTime = getNextAlarm(); final ScheduleCalendar cal = toScheduleCalendar(conditionId); for (Uri conditionId : mSubscriptions.keySet()) { final ScheduleCalendar cal = mSubscriptions.get(conditionId); if (cal != null && cal.isInSchedule(now)) { if (cal != null && cal.isInSchedule(now)) { notifyCondition(conditionId, Condition.STATE_TRUE, "meetsSchedule"); notifyCondition(conditionId, Condition.STATE_TRUE, "meetsSchedule"); cal.maybeSetNextAlarm(now, nextUserAlarmTime); } else { } else { notifyCondition(conditionId, Condition.STATE_FALSE, "!meetsSchedule"); notifyCondition(conditionId, Condition.STATE_FALSE, "!meetsSchedule"); } } Loading Loading @@ -175,8 +182,13 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { } } } } private static boolean meetsSchedule(Uri conditionId, long time) { public long getNextAlarm() { final ScheduleCalendar cal = toScheduleCalendar(conditionId); 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); return cal != null && cal.isInSchedule(time); } } Loading @@ -198,6 +210,7 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(ACTION_EVALUATE); filter.addAction(ACTION_EVALUATE); filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); registerReceiver(mReceiver, filter); registerReceiver(mReceiver, filter); } else { } else { unregisterReceiver(mReceiver); unregisterReceiver(mReceiver); Loading Loading
core/java/android/service/notification/ZenModeConfig.java +12 −1 Original line number Original line Diff line number Diff line Loading @@ -565,6 +565,10 @@ public class ZenModeConfig implements Parcelable { private static boolean safeBoolean(XmlPullParser parser, String att, boolean defValue) { private static boolean safeBoolean(XmlPullParser parser, String att, boolean defValue) { final String val = parser.getAttributeValue(null, att); 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; if (TextUtils.isEmpty(val)) return defValue; return Boolean.valueOf(val); return Boolean.valueOf(val); } } Loading Loading @@ -802,6 +806,7 @@ public class ZenModeConfig implements Parcelable { .appendQueryParameter("days", toDayList(schedule.days)) .appendQueryParameter("days", toDayList(schedule.days)) .appendQueryParameter("start", schedule.startHour + "." + schedule.startMinute) .appendQueryParameter("start", schedule.startHour + "." + schedule.startMinute) .appendQueryParameter("end", schedule.endHour + "." + schedule.endMinute) .appendQueryParameter("end", schedule.endHour + "." + schedule.endMinute) .appendQueryParameter("exitAtAlarm", String.valueOf(schedule.exitAtAlarm)) .build(); .build(); } } Loading @@ -825,6 +830,7 @@ public class ZenModeConfig implements Parcelable { rt.startMinute = start[1]; rt.startMinute = start[1]; rt.endHour = end[0]; rt.endHour = end[0]; rt.endMinute = end[1]; rt.endMinute = end[1]; rt.exitAtAlarm = safeBoolean(conditionId.getQueryParameter("exitAtAlarm"), false); return rt; return rt; } } Loading @@ -838,6 +844,8 @@ public class ZenModeConfig implements Parcelable { public int startMinute; public int startMinute; public int endHour; public int endHour; public int endMinute; public int endMinute; public boolean exitAtAlarm; public long nextAlarm; @Override @Override public int hashCode() { public int hashCode() { Loading @@ -852,7 +860,8 @@ public class ZenModeConfig implements Parcelable { && startHour == other.startHour && startHour == other.startHour && startMinute == other.startMinute && startMinute == other.startMinute && endHour == other.endHour && endHour == other.endHour && endMinute == other.endMinute; && endMinute == other.endMinute && exitAtAlarm == other.exitAtAlarm; } } public ScheduleInfo copy() { public ScheduleInfo copy() { Loading @@ -865,6 +874,8 @@ public class ZenModeConfig implements Parcelable { rt.startMinute = startMinute; rt.startMinute = startMinute; rt.endHour = endHour; rt.endHour = endHour; rt.endMinute = endMinute; rt.endMinute = endMinute; rt.exitAtAlarm = exitAtAlarm; rt.nextAlarm = nextAlarm; return rt; return rt; } } } } Loading
packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -526,8 +526,8 @@ public class ZenModePanel extends LinearLayout { setToMidnight(nextAlarm); setToMidnight(nextAlarm); if (weekRange.compareTo(nextAlarm) >= 0) { if (weekRange.compareTo(nextAlarm) >= 0) { return ZenModeConfig.toNextAlarmCondition(mContext, now, nextAlarmMs, return ZenModeConfig.toNextAlarmCondition(mContext, now, ActivityManager.getCurrentUser()); nextAlarmMs, ActivityManager.getCurrentUser()); } } } } return null; return null; Loading
services/core/java/com/android/server/notification/ScheduleCalendar.java +20 −10 Original line number Original line Diff line number Diff line Loading @@ -40,16 +40,12 @@ public class ScheduleCalendar { updateDays(); updateDays(); } } public long nextScheduleStart(long time) { public void maybeSetNextAlarm(long now, long nextAlarm) { if (mSchedule == null || mDays.size() == 0) return Long.MAX_VALUE; if (mSchedule != null) { final long start = getTime(time, mSchedule.startHour, mSchedule.startMinute); if (mSchedule.exitAtAlarm && now > mSchedule.nextAlarm) { for (int i = 0; i < Calendar.SATURDAY; i++) { mSchedule.nextAlarm = nextAlarm; final long t = addDays(start, i); if (t > time && isInSchedule(t)) { return t; } } } } return Long.MAX_VALUE; } } public void setTimeZone(TimeZone tz) { public void setTimeZone(TimeZone tz) { Loading @@ -60,7 +56,13 @@ public class ScheduleCalendar { if (mSchedule == null) return 0; if (mSchedule == null) return 0; final long nextStart = getNextTime(now, mSchedule.startHour, mSchedule.startMinute); final long nextStart = getNextTime(now, mSchedule.startHour, mSchedule.startMinute); final long nextEnd = getNextTime(now, mSchedule.endHour, mSchedule.endMinute); 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) { private long getNextTime(long now, int hr, int min) { Loading @@ -84,7 +86,15 @@ public class ScheduleCalendar { if (end <= start) { if (end <= start) { end = addDays(end, 1); 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) { private boolean isInSchedule(int daysOffset, long time, long start, long end) { Loading
services/core/java/com/android/server/notification/ScheduleConditionProvider.java +23 −10 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.notification; package com.android.server.notification; import android.app.ActivityManager; import android.app.AlarmManager; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.BroadcastReceiver; Loading @@ -28,7 +29,7 @@ import android.service.notification.Condition; import android.service.notification.IConditionProvider; import android.service.notification.IConditionProvider; import android.service.notification.ZenModeConfig; import android.service.notification.ZenModeConfig; import android.service.notification.ZenModeConfig.ScheduleInfo; import android.service.notification.ZenModeConfig.ScheduleInfo; import android.util.ArraySet; import android.util.ArrayMap; import android.util.Log; import android.util.Log; import android.util.Slog; import android.util.Slog; Loading @@ -42,7 +43,7 @@ import java.util.TimeZone; */ */ public class ScheduleConditionProvider extends SystemConditionProviderService { public class ScheduleConditionProvider extends SystemConditionProviderService { private static final String TAG = "ConditionProviders.SCP"; 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 = public static final ComponentName COMPONENT = new ComponentName("android", ScheduleConditionProvider.class.getName()); new ComponentName("android", ScheduleConditionProvider.class.getName()); Loading @@ -53,8 +54,9 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { private static final String EXTRA_TIME = "time"; private static final String EXTRA_TIME = "time"; private final Context mContext = this; 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 mConnected; private boolean mRegistered; private boolean mRegistered; private long mNextAlarmTime; private long mNextAlarmTime; Loading @@ -80,9 +82,9 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { pw.print(" mRegistered="); pw.println(mRegistered); pw.print(" mRegistered="); pw.println(mRegistered); pw.println(" mSubscriptions="); pw.println(" mSubscriptions="); final long now = System.currentTimeMillis(); final long now = System.currentTimeMillis(); for (Uri conditionId : mSubscriptions) { for (Uri conditionId : mSubscriptions.keySet()) { pw.print(" "); pw.print(" "); pw.print(meetsSchedule(conditionId, now) ? "* " : " "); pw.print(meetsSchedule(mSubscriptions.get(conditionId), now) ? "* " : " "); pw.println(conditionId); pw.println(conditionId); } } dumpUpcomingTime(pw, "mNextAlarmTime", mNextAlarmTime, now); dumpUpcomingTime(pw, "mNextAlarmTime", mNextAlarmTime, now); Loading Loading @@ -113,7 +115,7 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { notifyCondition(conditionId, Condition.STATE_FALSE, "badCondition"); notifyCondition(conditionId, Condition.STATE_FALSE, "badCondition"); return; return; } } mSubscriptions.add(conditionId); mSubscriptions.put(conditionId, toScheduleCalendar(conditionId)); evaluateSubscriptions(); evaluateSubscriptions(); } } Loading @@ -135,13 +137,18 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { } } private void evaluateSubscriptions() { private void evaluateSubscriptions() { if (mAlarmManager == null) { mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); } setRegistered(!mSubscriptions.isEmpty()); setRegistered(!mSubscriptions.isEmpty()); final long now = System.currentTimeMillis(); final long now = System.currentTimeMillis(); mNextAlarmTime = 0; mNextAlarmTime = 0; for (Uri conditionId : mSubscriptions) { long nextUserAlarmTime = getNextAlarm(); final ScheduleCalendar cal = toScheduleCalendar(conditionId); for (Uri conditionId : mSubscriptions.keySet()) { final ScheduleCalendar cal = mSubscriptions.get(conditionId); if (cal != null && cal.isInSchedule(now)) { if (cal != null && cal.isInSchedule(now)) { notifyCondition(conditionId, Condition.STATE_TRUE, "meetsSchedule"); notifyCondition(conditionId, Condition.STATE_TRUE, "meetsSchedule"); cal.maybeSetNextAlarm(now, nextUserAlarmTime); } else { } else { notifyCondition(conditionId, Condition.STATE_FALSE, "!meetsSchedule"); notifyCondition(conditionId, Condition.STATE_FALSE, "!meetsSchedule"); } } Loading Loading @@ -175,8 +182,13 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { } } } } private static boolean meetsSchedule(Uri conditionId, long time) { public long getNextAlarm() { final ScheduleCalendar cal = toScheduleCalendar(conditionId); 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); return cal != null && cal.isInSchedule(time); } } Loading @@ -198,6 +210,7 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(ACTION_EVALUATE); filter.addAction(ACTION_EVALUATE); filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); registerReceiver(mReceiver, filter); registerReceiver(mReceiver, filter); } else { } else { unregisterReceiver(mReceiver); unregisterReceiver(mReceiver); Loading