Implement new notification LED blinking logic:
1) Do not pulse notification LED when screen is on.
2) Pulse once on new notification if Settings.System.NOTIFICATION_LIGHT_PULSE is false,
otherwise pulse persistently while screen is off.
Fixes part of bug b/2238250 (trackball should pulse occasionally to indicate new email)
Change-Id: Icc49422a4e9d14412fc159a8e2596503a85bac51
Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java
index 94aa458..d7e1d25 100755
--- a/services/java/com/android/server/NotificationManagerService.java
+++ b/services/java/com/android/server/NotificationManagerService.java
@@ -96,7 +96,11 @@
private NotificationRecord mVibrateNotification;
private Vibrator mVibrator = new Vibrator();
- // adb
+ // for enabling and disabling notification pulse behavior
+ private boolean mScreenOn = true;
+ private boolean mNotificationPulseEnabled;
+
+ // for adb connected notifications
private boolean mUsbConnected;
private boolean mAdbEnabled = false;
private boolean mAdbNotificationShown = false;
@@ -333,6 +337,12 @@
return;
}
cancelAllNotificationsInt(pkgName, 0, 0);
+ } else if (action.equals(Intent.ACTION_SCREEN_ON)) {
+ mScreenOn = true;
+ updateNotificationPulse();
+ } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
+ mScreenOn = false;
+ updateNotificationPulse();
}
}
};
@@ -346,6 +356,8 @@
ContentResolver resolver = mContext.getContentResolver();
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ADB_ENABLED), false, this);
+ resolver.registerContentObserver(Settings.System.getUriFor(
+ Settings.System.NOTIFICATION_LIGHT_PULSE), false, this);
update();
}
@@ -355,13 +367,21 @@
public void update() {
ContentResolver resolver = mContext.getContentResolver();
- mAdbEnabled = Settings.Secure.getInt(resolver,
+ boolean adbEnabled = Settings.Secure.getInt(resolver,
Settings.Secure.ADB_ENABLED, 0) != 0;
- updateAdbNotification();
+ if (mAdbEnabled != adbEnabled) {
+ mAdbEnabled = adbEnabled;
+ updateAdbNotification();
+ }
+ boolean pulseEnabled = Settings.System.getInt(resolver,
+ Settings.System.NOTIFICATION_LIGHT_PULSE, 0) != 0;
+ if (mNotificationPulseEnabled != pulseEnabled) {
+ mNotificationPulseEnabled = pulseEnabled;
+ updateNotificationPulse();
+ }
}
}
- private final SettingsObserver mSettingsObserver;
-
+
NotificationManagerService(Context context, StatusBarService statusBar,
HardwareService hardware)
{
@@ -392,10 +412,12 @@
filter.addAction(Intent.ACTION_UMS_DISCONNECTED);
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_RESTARTED);
+ filter.addAction(Intent.ACTION_SCREEN_ON);
+ filter.addAction(Intent.ACTION_SCREEN_OFF);
mContext.registerReceiver(mIntentReceiver, filter);
- mSettingsObserver = new SettingsObserver(mHandler);
- mSettingsObserver.observe();
+ SettingsObserver observer = new SettingsObserver(mHandler);
+ observer.observe();
}
void systemReady() {
@@ -1002,7 +1024,9 @@
mLedNotification = mLights.get(n-1);
}
}
- if (mLedNotification == null) {
+
+ // we only flash if screen is off and persistent pulsing is enabled
+ if (mLedNotification == null || mScreenOn || !mNotificationPulseEnabled) {
mHardware.setLightOff_UNCHECKED(HardwareService.LIGHT_ID_NOTIFICATIONS);
} else {
mHardware.setLightFlashing_UNCHECKED(
@@ -1095,7 +1119,13 @@
}
}
}
-
+
+ private void updateNotificationPulse() {
+ synchronized (mNotificationList) {
+ updateLightsLocked();
+ }
+ }
+
// ======================================================================
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {