summaryrefslogtreecommitdiffstats
path: root/core/java/android/service
diff options
context:
space:
mode:
authorGriff Hazen <griff@google.com>2014-09-02 17:10:47 -0700
committerGriff Hazen <griff@google.com>2014-09-02 17:10:47 -0700
commit84a00ea9e3df3ff051d3e86945d2befea32072ee (patch)
tree8e95ecd7e2f71025552f290c6dfa79cba26ff79a /core/java/android/service
parent5f4cfd3ab73f4d8173db05d7c94c098a06cd5f57 (diff)
downloadframeworks_base-84a00ea9e3df3ff051d3e86945d2befea32072ee.zip
frameworks_base-84a00ea9e3df3ff051d3e86945d2befea32072ee.tar.gz
frameworks_base-84a00ea9e3df3ff051d3e86945d2befea32072ee.tar.bz2
Reduce chance of notification listener dropped messages.
The existing code for notification manager/listeners uses a oneway binder api to deliver messages. One problem with this is that notification objects can sometimes get fairly large, and can bump into the oneway binder transaction buffer if many happen at once. To reduce this issue, flip the service into a oneway delivery of a status bar notification holder, whose wrapped content is then immediately fetched upon receipt of the one-way message. This moves the meat of the fetch to be over a two-way interface without changing the properties of which object is actually sent (a tickle solution with lookup key would have changed this) Further research: attempt to chunk notification objects themselves. They can sometimes transfer hundreds of KB over a binder transaction. Bug: 15426276 Change-Id: Ib1a1f4ff848c16f80bcf2ae4dfd2b87a9091f0b2
Diffstat (limited to 'core/java/android/service')
-rw-r--r--core/java/android/service/notification/INotificationListener.aidl5
-rw-r--r--core/java/android/service/notification/IStatusBarNotificationHolder.aidl24
-rw-r--r--core/java/android/service/notification/NotificationListenerService.java18
3 files changed, 43 insertions, 4 deletions
diff --git a/core/java/android/service/notification/INotificationListener.aidl b/core/java/android/service/notification/INotificationListener.aidl
index 8ca9b6c..e6bf6ba 100644
--- a/core/java/android/service/notification/INotificationListener.aidl
+++ b/core/java/android/service/notification/INotificationListener.aidl
@@ -16,6 +16,7 @@
package android.service.notification;
+import android.service.notification.IStatusBarNotificationHolder;
import android.service.notification.StatusBarNotification;
import android.service.notification.NotificationRankingUpdate;
@@ -23,9 +24,9 @@ import android.service.notification.NotificationRankingUpdate;
oneway interface INotificationListener
{
void onListenerConnected(in NotificationRankingUpdate update);
- void onNotificationPosted(in StatusBarNotification notification,
+ void onNotificationPosted(in IStatusBarNotificationHolder notificationHolder,
in NotificationRankingUpdate update);
- void onNotificationRemoved(in StatusBarNotification notification,
+ void onNotificationRemoved(in IStatusBarNotificationHolder notificationHolder,
in NotificationRankingUpdate update);
void onNotificationRankingUpdate(in NotificationRankingUpdate update);
void onListenerHintsChanged(int hints);
diff --git a/core/java/android/service/notification/IStatusBarNotificationHolder.aidl b/core/java/android/service/notification/IStatusBarNotificationHolder.aidl
new file mode 100644
index 0000000..fd6b59e
--- /dev/null
+++ b/core/java/android/service/notification/IStatusBarNotificationHolder.aidl
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2014, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.notification;
+
+import android.service.notification.StatusBarNotification;
+
+/** @hide */
+interface IStatusBarNotificationHolder {
+ StatusBarNotification get();
+}
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index cb0bcf2..eebac12 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -601,8 +601,15 @@ public abstract class NotificationListenerService extends Service {
private class INotificationListenerWrapper extends INotificationListener.Stub {
@Override
- public void onNotificationPosted(StatusBarNotification sbn,
+ public void onNotificationPosted(IStatusBarNotificationHolder sbnHolder,
NotificationRankingUpdate update) {
+ StatusBarNotification sbn;
+ try {
+ sbn = sbnHolder.get();
+ } catch (RemoteException e) {
+ Log.w(TAG, "onNotificationPosted: Error receiving StatusBarNotification", e);
+ return;
+ }
Notification.Builder.rebuild(getContext(), sbn.getNotification());
// protect subclass from concurrent modifications of (@link mNotificationKeys}.
@@ -616,8 +623,15 @@ public abstract class NotificationListenerService extends Service {
}
}
@Override
- public void onNotificationRemoved(StatusBarNotification sbn,
+ public void onNotificationRemoved(IStatusBarNotificationHolder sbnHolder,
NotificationRankingUpdate update) {
+ StatusBarNotification sbn;
+ try {
+ sbn = sbnHolder.get();
+ } catch (RemoteException e) {
+ Log.w(TAG, "onNotificationRemoved: Error receiving StatusBarNotification", e);
+ return;
+ }
// protect subclass from concurrent modifications of (@link mNotificationKeys}.
synchronized (mWrapper) {
applyUpdate(update);