diff options
author | John Spurlock <jspurlock@google.com> | 2014-07-16 21:03:15 -0400 |
---|---|---|
committer | John Spurlock <jspurlock@google.com> | 2014-07-17 11:41:18 -0400 |
commit | 89f060a1e0fa48c497855d061b5c9ec44bb576c8 (patch) | |
tree | 8f179d97fc8d326be7abfdcce3ab29e7631e9318 /packages/SystemUI/src/com | |
parent | 9d32507a8608f82d430fcaf1de0eb81de93dcdea (diff) | |
download | frameworks_base-89f060a1e0fa48c497855d061b5c9ec44bb576c8.zip frameworks_base-89f060a1e0fa48c497855d061b5c9ec44bb576c8.tar.gz frameworks_base-89f060a1e0fa48c497855d061b5c9ec44bb576c8.tar.bz2 |
Zen: Return of the alarm warning.
- Remove the term timers from subtitle, the term "alarms"
is now inclusive of timers.
- Resurrect the alarm warning, give it a more prominent
appearance if we can detect an overlap in a time-based
exit condition and the next alarm time.
Change-Id: I5d6d67694c7acc9e2a5a7c63e647069744a22cec
Diffstat (limited to 'packages/SystemUI/src/com')
4 files changed, 110 insertions, 10 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 8564409..72c12d6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -549,6 +549,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mDozeServiceHost = new DozeServiceHost(); putComponent(DozeService.Host.class, mDozeServiceHost); + + setControllerUsers(); } // ================================================================================ @@ -2797,6 +2799,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, animateCollapsePanels(); updateNotifications(); resetUserSetupObserver(); + setControllerUsers(); + } + + private void setControllerUsers() { + if (mZenModeController != null) { + mZenModeController.setUserId(mCurrentUserId); + } } private void resetUserSetupObserver() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java index 61902a2..2e97d18 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java @@ -27,11 +27,13 @@ public interface ZenModeController { void requestConditions(boolean request); void setExitConditionId(Uri exitConditionId); Uri getExitConditionId(); - boolean hasNextAlarm(); + long getNextAlarm(); + void setUserId(int userId); public static class Callback { public void onZenChanged(int zen) {} public void onExitConditionChanged(Uri exitConditionId) {} public void onConditionsChanged(Condition[] conditions) {} + public void onNextAlarmChanged() {} } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java index 7703966..ae037f9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java @@ -16,19 +16,25 @@ package com.android.systemui.statusbar.policy; +import android.app.AlarmClockInfo; +import android.app.AlarmManager; import android.app.INotificationManager; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.net.Uri; import android.os.Handler; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.UserHandle; import android.provider.Settings.Global; import android.service.notification.Condition; import android.service.notification.IConditionListener; import android.service.notification.ZenModeConfig; +import android.util.Log; import android.util.Slog; -import com.android.internal.widget.LockPatternUtils; import com.android.systemui.qs.GlobalSetting; import java.util.ArrayList; @@ -36,8 +42,8 @@ import java.util.LinkedHashMap; /** Platform implementation of the zen mode controller. **/ public class ZenModeControllerImpl implements ZenModeController { - private static final String TAG = "ZenModeControllerImpl"; - private static final boolean DEBUG = false; + private static final String TAG = "ZenModeController"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>(); private final Context mContext; @@ -45,13 +51,13 @@ public class ZenModeControllerImpl implements ZenModeController { private final GlobalSetting mConfigSetting; private final INotificationManager mNoMan; private final LinkedHashMap<Uri, Condition> mConditions = new LinkedHashMap<Uri, Condition>(); - private final LockPatternUtils mUtils; + private final AlarmManager mAlarmManager; + private int mUserId; private boolean mRequesting; public ZenModeControllerImpl(Context context, Handler handler) { mContext = context; - mUtils = new LockPatternUtils(mContext); mModeSetting = new GlobalSetting(mContext, handler, Global.ZEN_MODE) { @Override protected void handleValueChanged(int value) { @@ -68,6 +74,7 @@ public class ZenModeControllerImpl implements ZenModeController { mConfigSetting.setListening(true); mNoMan = INotificationManager.Stub.asInterface( ServiceManager.getService(Context.NOTIFICATION_SERVICE)); + mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); } @Override @@ -126,8 +133,22 @@ public class ZenModeControllerImpl implements ZenModeController { } @Override - public boolean hasNextAlarm() { - return mUtils.getNextAlarm() != null; + public long getNextAlarm() { + final AlarmClockInfo info = mAlarmManager.getNextAlarmClock(mUserId); + return info != null ? info.getTriggerTime() : 0; + } + + @Override + public void setUserId(int userId) { + mUserId = userId; + mContext.registerReceiverAsUser(mReceiver, new UserHandle(mUserId), + new IntentFilter(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED), null, null); + } + + private void fireNextAlarmChanged() { + for (Callback cb : mCallbacks) { + cb.onNextAlarmChanged(); + } } private void fireZenChanged(int zen) { @@ -169,4 +190,13 @@ public class ZenModeControllerImpl implements ZenModeController { updateConditions(conditions); } }; + + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED.equals(intent.getAction())) { + fireNextAlarmChanged(); + } + } + }; } diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java index cf04219..d7aa3d6 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java @@ -30,6 +30,8 @@ import android.provider.Settings; import android.provider.Settings.Global; import android.service.notification.Condition; import android.service.notification.ZenModeConfig; +import android.text.format.DateFormat; +import android.text.format.Time; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; @@ -46,7 +48,10 @@ import android.widget.TextView; import com.android.systemui.R; import com.android.systemui.statusbar.policy.ZenModeController; +import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Date; +import java.util.Locale; import java.util.Objects; public class ZenModePanel extends LinearLayout { @@ -75,6 +80,8 @@ public class ZenModePanel extends LinearLayout { private final H mHandler = new H(); private final Favorites mFavorites; private final Interpolator mFastOutSlowInInterpolator; + private final int mTextColor; + private final int mAccentColor; private char mLogTag = '?'; private String mTag; @@ -85,6 +92,7 @@ public class ZenModePanel extends LinearLayout { private TextView mZenSubheadExpanded; private View mMoreSettings; private LinearLayout mZenConditions; + private TextView mAlarmWarning; private Callback mCallback; private ZenModeController mController; @@ -94,6 +102,7 @@ public class ZenModePanel extends LinearLayout { private boolean mExpanded; private int mAttachedZen; private String mExitConditionText; + private long mNextAlarm; public ZenModePanel(Context context, AttributeSet attrs) { super(context, attrs); @@ -102,6 +111,8 @@ public class ZenModePanel extends LinearLayout { mInflater = LayoutInflater.from(mContext.getApplicationContext()); mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(mContext, android.R.interpolator.fast_out_slow_in); + mTextColor = mContext.getResources().getColor(R.color.qs_text); + mAccentColor = mContext.getResources().getColor(R.color.system_accent_color); updateTag(); if (DEBUG) Log.d(mTag, "new ZenModePanel"); } @@ -144,6 +155,7 @@ public class ZenModePanel extends LinearLayout { }); mZenConditions = (LinearLayout) findViewById(R.id.zen_conditions); + mAlarmWarning = (TextView) findViewById(R.id.zen_alarm_warning); } @Override @@ -152,6 +164,7 @@ public class ZenModePanel extends LinearLayout { if (DEBUG) Log.d(mTag, "onAttachedToWindow"); mAttachedZen = getSelectedZen(-1); refreshExitConditionText(); + refreshNextAlarm(); updateWidgets(); } @@ -213,6 +226,7 @@ public class ZenModePanel extends LinearLayout { if (Objects.equals(mExitConditionId, exitConditionId)) return; mExitConditionId = exitConditionId; refreshExitConditionText(); + updateWidgets(); } private void refreshExitConditionText() { @@ -267,12 +281,34 @@ public class ZenModePanel extends LinearLayout { final boolean zenImportant = zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; final boolean zenNone = zen == Global.ZEN_MODE_NO_INTERRUPTIONS; final boolean foreverSelected = mExitConditionId == null; + final boolean hasNextAlarm = mNextAlarm != 0; mZenSubhead.setVisibility(!zenOff && (mExpanded || !foreverSelected) ? VISIBLE : GONE); mZenSubheadExpanded.setVisibility(mExpanded ? VISIBLE : GONE); mZenSubheadCollapsed.setVisibility(!mExpanded ? VISIBLE : GONE); mMoreSettings.setVisibility(zenImportant && mExpanded ? VISIBLE : GONE); mZenConditions.setVisibility(!zenOff && mExpanded ? VISIBLE : GONE); + mAlarmWarning.setVisibility(zenNone && mExpanded && hasNextAlarm ? VISIBLE : GONE); + + if (zenNone && mExpanded && hasNextAlarm) { + final long exitTime = ZenModeConfig.tryParseCountdownConditionId(mExitConditionId); + final long now = System.currentTimeMillis(); + final boolean alarmToday = time(mNextAlarm).yearDay == time(now).yearDay; + final String skeleton = (alarmToday ? "" : "E") + + (DateFormat.is24HourFormat(mContext) ? "Hm" : "hma"); + final String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton); + final String alarm = new SimpleDateFormat(pattern).format(new Date(mNextAlarm)); + final boolean isWarning = exitTime > 0 && mNextAlarm > now && mNextAlarm < exitTime; + if (isWarning) { + mAlarmWarning.setText(mContext.getString(R.string.zen_alarm_warning, alarm)); + mAlarmWarning.setTextColor(mAccentColor); + } else { + mAlarmWarning.setText(mContext.getString(alarmToday + ? R.string.zen_alarm_information_time + : R.string.zen_alarm_information_day_time, alarm)); + mAlarmWarning.setTextColor(mTextColor); + } + } if (zenNone) { mZenSubheadExpanded.setText(R.string.zen_no_interruptions_with_warning); @@ -283,6 +319,12 @@ public class ZenModePanel extends LinearLayout { } } + private static Time time(long millis) { + final Time t = new Time(); + t.set(millis); + return t; + } + private Condition parseExistingTimeCondition(Uri conditionId) { final long time = ZenModeConfig.tryParseCountdownConditionId(conditionId); if (time == 0) return null; @@ -308,6 +350,15 @@ public class ZenModePanel extends LinearLayout { Condition.FLAG_RELEVANT_NOW); } + private void refreshNextAlarm() { + mNextAlarm = mController.getNextAlarm(); + } + + private void handleNextAlarmChanged() { + refreshNextAlarm(); + updateWidgets(); + } + private void handleUpdateConditions(Condition[] conditions) { final int newCount = conditions == null ? 0 : conditions.length; if (DEBUG) Log.d(mTag, "handleUpdateConditions newCount=" + newCount); @@ -518,12 +569,18 @@ public class ZenModePanel extends LinearLayout { public void onExitConditionChanged(Uri exitConditionId) { mHandler.obtainMessage(H.EXIT_CONDITION_CHANGED, exitConditionId).sendToTarget(); } + + @Override + public void onNextAlarmChanged() { + mHandler.sendEmptyMessage(H.NEXT_ALARM_CHANGED); + } }; private final class H extends Handler { private static final int UPDATE_CONDITIONS = 1; private static final int EXIT_CONDITION_CHANGED = 2; private static final int UPDATE_ZEN = 3; + private static final int NEXT_ALARM_CHANGED = 4; private H() { super(Looper.getMainLooper()); @@ -532,12 +589,14 @@ public class ZenModePanel extends LinearLayout { @Override public void handleMessage(Message msg) { if (msg.what == UPDATE_CONDITIONS) { - handleUpdateConditions((Condition[])msg.obj); + handleUpdateConditions((Condition[]) msg.obj); checkForDefault(); } else if (msg.what == EXIT_CONDITION_CHANGED) { - handleExitConditionChanged((Uri)msg.obj); + handleExitConditionChanged((Uri) msg.obj); } else if (msg.what == UPDATE_ZEN) { handleUpdateZen(msg.arg1); + } else if (msg.what == NEXT_ALARM_CHANGED) { + handleNextAlarmChanged(); } } } |