diff options
6 files changed, 132 insertions, 35 deletions
diff --git a/core/java/android/service/notification/ScheduleCalendar.java b/core/java/android/service/notification/ScheduleCalendar.java index 01287104f9b2..8b7946ce7651 100644 --- a/core/java/android/service/notification/ScheduleCalendar.java +++ b/core/java/android/service/notification/ScheduleCalendar.java @@ -135,6 +135,24 @@ public class ScheduleCalendar { } /** + * @param alarm milliseconds since Epoch + * @param now milliseconds since Epoch + * @return true if alarm and now is within the schedule, else false + */ + public boolean isAlarmInSchedule(long alarm, long now) { + if (mSchedule == null || mDays.size() == 0) return false; + final long start = getTime(alarm, mSchedule.startHour, mSchedule.startMinute); + long end = getTime(alarm, mSchedule.endHour, mSchedule.endMinute); + if (end <= start) { + end = addDays(end, 1); + } + return (isInSchedule(-1, alarm, start, end) + && isInSchedule(-1, now, start, end)) + || (isInSchedule(0, alarm, start, end) + && isInSchedule(0, now, start, end)); + } + + /** * @param time milliseconds since Epoch * @return true if should exit at time for next alarm, else false */ @@ -145,7 +163,7 @@ public class ScheduleCalendar { return mSchedule.exitAtAlarm && mSchedule.nextAlarm != 0 && time >= mSchedule.nextAlarm - && isInSchedule(mSchedule.nextAlarm); + && isAlarmInSchedule(mSchedule.nextAlarm, time); } private boolean isInSchedule(int daysOffset, long time, long start, long end) { diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml index f6c2eebbab66..c70e8296340e 100644 --- a/packages/SystemUI/res/layout/volume_dialog.xml +++ b/packages/SystemUI/res/layout/volume_dialog.xml @@ -53,7 +53,11 @@ android:layout_gravity="center" android:soundEffectsEnabled="false" /> - <include layout="@layout/volume_dnd_icon"/> + <include layout="@layout/volume_dnd_icon" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginRight="@dimen/volume_dialog_stream_padding" + android:layout_marginTop="6dp"/> </FrameLayout> <LinearLayout @@ -71,7 +75,9 @@ android:layout_height="wrap_content" android:minWidth="@dimen/volume_dialog_panel_width" android:gravity="center" - android:orientation="horizontal" > + android:orientation="horizontal" + android:paddingRight="@dimen/volume_dialog_stream_padding" + android:paddingLeft="@dimen/volume_dialog_stream_padding"> <!-- volume rows added and removed here! :-) --> </LinearLayout> <FrameLayout diff --git a/packages/SystemUI/res/layout/volume_dnd_icon.xml b/packages/SystemUI/res/layout/volume_dnd_icon.xml index ac235b7090c5..037d143fa69e 100644 --- a/packages/SystemUI/res/layout/volume_dnd_icon.xml +++ b/packages/SystemUI/res/layout/volume_dnd_icon.xml @@ -17,14 +17,13 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dnd_icon" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:layout_marginTop="6dp"> <ImageView android:layout_width="14dp" android:layout_height="14dp" - android:layout_marginTop="6dp" - android:layout_marginRight="6dp" android:layout_gravity="right|top" android:src="@drawable/ic_dnd" android:tint="?android:attr/textColorTertiary"/> -</FrameLayout> +</FrameLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index ad74725aa19d..f3fe29794bac 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -296,6 +296,8 @@ <dimen name="volume_dialog_panel_transparent_padding">20dp</dimen> + <dimen name="volume_dialog_stream_padding">8dp</dimen> + <!-- the amount the volume panel should be offset at the end from the view next to it (or the screen edge, in portrait--> <dimen name="volume_dialog_base_margin">8dp</dimen> diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index b0e40fc88054..6b322c72936c 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -695,26 +695,6 @@ public class VolumeDialogImpl implements VolumeDialog { private void enableVolumeRowViewsH(VolumeRow row, boolean enable) { boolean showDndIcon = !enable; row.dndIcon.setVisibility(showDndIcon ? VISIBLE : GONE); - - if (showDndIcon && getNumVisibleRows() == 1) { - row.dndIcon.setLayoutParams(new FrameLayout.LayoutParams( - mContext.getResources().getDimensionPixelSize( - R.dimen.volume_dialog_panel_width), - FrameLayout.LayoutParams.WRAP_CONTENT)); - } else if (row.view.getVisibility() == VISIBLE) { - row.dndIcon.setLayoutParams(new FrameLayout.LayoutParams( - FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT)); - } - } - - private int getNumVisibleRows() { - int count = 0; - for (int i = 0; i < mRows.size(); i++) { - if (mRows.get(i).view.getVisibility() == VISIBLE) { - count++; - } - } - return count; } /** diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java index 1be164395d23..942a07acbf9f 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java @@ -206,15 +206,14 @@ public class ScheduleCalendarTest extends UiServiceTestCase { assertTrue(mScheduleCalendar.shouldExitForAlarm(1000)); } - @Ignore @Test public void testShouldExitForAlarm_oldAlarm() { // Cal: today 2:15pm - Calendar cal = new GregorianCalendar(); - cal.set(Calendar.HOUR_OF_DAY, 14); - cal.set(Calendar.MINUTE, 15); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); + Calendar now = new GregorianCalendar(); + now.set(Calendar.HOUR_OF_DAY, 14); + now.set(Calendar.MINUTE, 15); + now.set(Calendar.SECOND, 0); + now.set(Calendar.MILLISECOND, 0); // ScheduleInfo: today 12:16pm - today 3:15pm mScheduleInfo.days = new int[] {getTodayDay()}; @@ -226,10 +225,45 @@ public class ScheduleCalendarTest extends UiServiceTestCase { mScheduleInfo.nextAlarm = 1000; // very old alarm mScheduleCalendar.setSchedule(mScheduleInfo); - assertTrue(mScheduleCalendar.isInSchedule(cal.getTimeInMillis())); + assertTrue(mScheduleCalendar.isInSchedule(now.getTimeInMillis())); // don't exit for an alarm if it's an old alarm - assertFalse(mScheduleCalendar.shouldExitForAlarm(1000)); + assertFalse(mScheduleCalendar.shouldExitForAlarm(now.getTimeInMillis())); + } + + @Test + public void testShouldExitForAlarm_oldAlarmInSchedule() { + // calNow: day 2 at 9pm + Calendar calNow = new GregorianCalendar(); + calNow.set(Calendar.HOUR_OF_DAY, 21); + calNow.set(Calendar.MINUTE, 0); + calNow.set(Calendar.SECOND, 0); + calNow.set(Calendar.MILLISECOND, 0); + calNow.add(Calendar.DATE, 1); // add a day + + // calAlarm: day 2 at 5am + Calendar calAlarm = new GregorianCalendar(); + calAlarm.set(Calendar.HOUR_OF_DAY, 5); + calAlarm.set(Calendar.MINUTE, 0); + calAlarm.set(Calendar.SECOND, 0); + calAlarm.set(Calendar.MILLISECOND, 0); + calAlarm.add(Calendar.DATE, 1); // add a day + + // ScheduleInfo: day 1, day 2: 9pm-7am + mScheduleInfo.days = new int[] {getTodayDay(), getTodayDay() + 1}; + mScheduleInfo.startHour = 21; + mScheduleInfo.endHour = 7; + mScheduleInfo.startMinute = 0; + mScheduleInfo.endMinute = 0; + mScheduleInfo.exitAtAlarm = true; + mScheduleInfo.nextAlarm = calAlarm.getTimeInMillis(); // old alarm (5am day 2) + + mScheduleCalendar.setSchedule(mScheduleInfo); + assertTrue(mScheduleCalendar.isInSchedule(calNow.getTimeInMillis())); + assertTrue(mScheduleCalendar.isInSchedule(calAlarm.getTimeInMillis())); + + // don't exit for an alarm if it's an old alarm + assertFalse(mScheduleCalendar.shouldExitForAlarm(calNow.getTimeInMillis())); } @Test @@ -369,6 +403,64 @@ public class ScheduleCalendarTest extends UiServiceTestCase { assertFalse(mScheduleCalendar.isInSchedule(cal.getTimeInMillis())); } + @Test + public void testIsAlarmInSchedule_alarmAndNowInSchedule_sameScheduleTrigger() { + Calendar alarm = new GregorianCalendar(); + alarm.set(Calendar.HOUR_OF_DAY, 23); + alarm.set(Calendar.MINUTE, 15); + alarm.set(Calendar.SECOND, 0); + alarm.set(Calendar.MILLISECOND, 0); + + Calendar now = new GregorianCalendar(); + now.set(Calendar.HOUR_OF_DAY, 2); + now.set(Calendar.MINUTE, 15); + now.set(Calendar.SECOND, 0); + now.set(Calendar.MILLISECOND, 0); + now.add(Calendar.DATE, 1); // add a day + + mScheduleInfo.days = new int[] {getTodayDay(), getTodayDay() + 1}; + mScheduleInfo.startHour = 22; + mScheduleInfo.startMinute = 15; + mScheduleInfo.endHour = 3; + mScheduleInfo.endMinute = 15; + mScheduleCalendar.setSchedule(mScheduleInfo); + + assertTrue(mScheduleCalendar.isInSchedule(alarm.getTimeInMillis())); + assertTrue(mScheduleCalendar.isInSchedule(now.getTimeInMillis())); + assertTrue(mScheduleCalendar.isAlarmInSchedule(alarm.getTimeInMillis(), + now.getTimeInMillis())); + } + + @Test + public void testIsAlarmInSchedule_alarmAndNowInSchedule_differentScheduleTrigger() { + Calendar alarm = new GregorianCalendar(); + alarm.set(Calendar.HOUR_OF_DAY, 23); + alarm.set(Calendar.MINUTE, 15); + alarm.set(Calendar.SECOND, 0); + alarm.set(Calendar.MILLISECOND, 0); + + Calendar now = new GregorianCalendar(); + now.set(Calendar.HOUR_OF_DAY, 23); + now.set(Calendar.MINUTE, 15); + now.set(Calendar.SECOND, 0); + now.set(Calendar.MILLISECOND, 0); + now.add(Calendar.DATE, 1); // add a day + + mScheduleInfo.days = new int[] {getTodayDay(), getTodayDay() + 1}; + mScheduleInfo.startHour = 22; + mScheduleInfo.startMinute = 15; + mScheduleInfo.endHour = 3; + mScheduleInfo.endMinute = 15; + mScheduleCalendar.setSchedule(mScheduleInfo); + + // even though both alarm and now are in schedule, they are not in the same part of + // the schedule (alarm is in schedule for the previous day's schedule compared to now) + assertTrue(mScheduleCalendar.isInSchedule(alarm.getTimeInMillis())); + assertTrue(mScheduleCalendar.isInSchedule(now.getTimeInMillis())); + assertFalse(mScheduleCalendar.isAlarmInSchedule(alarm.getTimeInMillis(), + now.getTimeInMillis())); + } + private int getTodayDay() { return new GregorianCalendar().get(Calendar.DAY_OF_WEEK); } |