summaryrefslogtreecommitdiffstats
path: root/packages/SystemUI/src/com
diff options
context:
space:
mode:
authorJohn Spurlock <jspurlock@google.com>2014-07-16 21:03:15 -0400
committerJohn Spurlock <jspurlock@google.com>2014-07-17 11:41:18 -0400
commit89f060a1e0fa48c497855d061b5c9ec44bb576c8 (patch)
tree8f179d97fc8d326be7abfdcce3ab29e7631e9318 /packages/SystemUI/src/com
parent9d32507a8608f82d430fcaf1de0eb81de93dcdea (diff)
downloadframeworks_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')
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java44
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java63
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();
}
}
}