19fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren/* 29fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * Copyright (C) 2015 The Android Open Source Project 39fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * 49fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * Licensed under the Apache License, Version 2.0 (the "License"); 59fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * you may not use this file except in compliance with the License. 69fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * You may obtain a copy of the License at 79fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * 89fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * http://www.apache.org/licenses/LICENSE-2.0 99fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * 109fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * Unless required by applicable law or agreed to in writing, software 119fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * distributed under the License is distributed on an "AS IS" BASIS, 129fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * See the License for the specific language governing permissions and 149fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * limitations under the License. 159fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren */ 169fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 179fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wrenpackage android.service.notification; 189fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 197eba593b8d88a9b087f06ef146d82c4c77a92473Julia Reynoldsimport android.annotation.SdkConstant; 20ab41eecf22352f54167ce9a272a397715ffd0015Chris Wrenimport android.annotation.SystemApi; 21ab41eecf22352f54167ce9a272a397715ffd0015Chris Wrenimport android.content.ComponentName; 22ab41eecf22352f54167ce9a272a397715ffd0015Chris Wrenimport android.content.Context; 237eba593b8d88a9b087f06ef146d82c4c77a92473Julia Reynoldsimport android.content.Intent; 249fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wrenimport android.net.Uri; 25e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynoldsimport android.os.Bundle; 26b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganovimport android.os.Handler; 2751017d0e23ce9855fabcf786a2067ceb19121fbcChris Wrenimport android.os.IBinder; 28b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganovimport android.os.Looper; 29b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganovimport android.os.Message; 30e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynoldsimport android.os.Parcel; 31e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynoldsimport android.os.Parcelable; 3251017d0e23ce9855fabcf786a2067ceb19121fbcChris Wrenimport android.os.RemoteException; 3351017d0e23ce9855fabcf786a2067ceb19121fbcChris Wrenimport android.util.Log; 34b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganovimport com.android.internal.os.SomeArgs; 359fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 36e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynoldsimport java.util.List; 37e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds 389fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren/** 39e0ba7eb365ac19fdc11c3f820349f0352761b9f4Chris Wren * A service that helps the user manage notifications. This class is only used to 40e0ba7eb365ac19fdc11c3f820349f0352761b9f4Chris Wren * extend the framework service and may not be implemented by non-framework components. 4110c63d8a12caf5117524799efea95120f8b0845bChris Wren * @hide 429fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren */ 4310c63d8a12caf5117524799efea95120f8b0845bChris Wren@SystemApi 44e0ba7eb365ac19fdc11c3f820349f0352761b9f4Chris Wrenpublic abstract class NotificationRankerService extends NotificationListenerService { 450efdb88ccc9d650e7a644b9be8f63792f2c66841Chris Wren private static final String TAG = "NotificationRankers"; 4651017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren 477eba593b8d88a9b087f06ef146d82c4c77a92473Julia Reynolds /** 487eba593b8d88a9b087f06ef146d82c4c77a92473Julia Reynolds * The {@link Intent} that must be declared as handled by the service. 497eba593b8d88a9b087f06ef146d82c4c77a92473Julia Reynolds */ 507eba593b8d88a9b087f06ef146d82c4c77a92473Julia Reynolds @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION) 517eba593b8d88a9b087f06ef146d82c4c77a92473Julia Reynolds public static final String SERVICE_INTERFACE 52e0ba7eb365ac19fdc11c3f820349f0352761b9f4Chris Wren = "android.service.notification.NotificationRankerService"; 537eba593b8d88a9b087f06ef146d82c4c77a92473Julia Reynolds 549fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** Notification was canceled by the status bar reporting a click. */ 559fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public static final int REASON_DELEGATE_CLICK = 1; 569fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 579fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** Notification was canceled by the status bar reporting a user dismissal. */ 589fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public static final int REASON_DELEGATE_CANCEL = 2; 599fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 609fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** Notification was canceled by the status bar reporting a user dismiss all. */ 619fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public static final int REASON_DELEGATE_CANCEL_ALL = 3; 629fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 639fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** Notification was canceled by the status bar reporting an inflation error. */ 649fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public static final int REASON_DELEGATE_ERROR = 4; 659fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 669fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** Notification was canceled by the package manager modifying the package. */ 679fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public static final int REASON_PACKAGE_CHANGED = 5; 689fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 699fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** Notification was canceled by the owning user context being stopped. */ 709fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public static final int REASON_USER_STOPPED = 6; 719fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 729fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** Notification was canceled by the user banning the package. */ 739fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public static final int REASON_PACKAGE_BANNED = 7; 749fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 759fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** Notification was canceled by the app canceling this specific notification. */ 769fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public static final int REASON_APP_CANCEL = 8; 779fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 789fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** Notification was canceled by the app cancelling all its notifications. */ 799fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public static final int REASON_APP_CANCEL_ALL = 9; 809fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 819fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** Notification was canceled by a listener reporting a user dismissal. */ 829fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public static final int REASON_LISTENER_CANCEL = 10; 839fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 849fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** Notification was canceled by a listener reporting a user dismiss all. */ 859fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public static final int REASON_LISTENER_CANCEL_ALL = 11; 869fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 879fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** Notification was canceled because it was a member of a canceled group. */ 889fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public static final int REASON_GROUP_SUMMARY_CANCELED = 12; 899fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 909fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** Notification was canceled because it was an invisible member of a group. */ 919fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public static final int REASON_GROUP_OPTIMIZATION = 13; 929fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 930122f651d1a1de8ccfe6e2789e150507977189c7Andrei Stingaceanu /** Notification was canceled by the device administrator suspending the package. */ 94ef37f284364cc45c2ed91bfe04c489d2cedd32d2Julia Reynolds public static final int REASON_PACKAGE_SUSPENDED = 14; 950122f651d1a1de8ccfe6e2789e150507977189c7Andrei Stingaceanu 967eadc1bf686de4df0801252263c887ed2c326090Rubin Xu /** Notification was canceled by the owning managed profile being turned off. */ 97ef37f284364cc45c2ed91bfe04c489d2cedd32d2Julia Reynolds public static final int REASON_PROFILE_TURNED_OFF = 15; 987eadc1bf686de4df0801252263c887ed2c326090Rubin Xu 99e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds /** Autobundled summary notification was canceled because its group was unbundled */ 100e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds public static final int REASON_UNAUTOBUNDLED = 16; 10151017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren 102b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov private Handler mHandler; 103b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov 104b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov /** @hide */ 105b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov @Override 106b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov public void registerAsSystemService(Context context, ComponentName componentName, 1070efdb88ccc9d650e7a644b9be8f63792f2c66841Chris Wren int currentUser) { 108b7c810957f1d8f73100aff645188eca13eb30171Chris Wren throw new UnsupportedOperationException("the ranker lifecycle is managed by the system."); 109b7c810957f1d8f73100aff645188eca13eb30171Chris Wren } 110b7c810957f1d8f73100aff645188eca13eb30171Chris Wren 111b7c810957f1d8f73100aff645188eca13eb30171Chris Wren /** @hide */ 112b7c810957f1d8f73100aff645188eca13eb30171Chris Wren @Override 113b7c810957f1d8f73100aff645188eca13eb30171Chris Wren public void unregisterAsSystemService() { 114b7c810957f1d8f73100aff645188eca13eb30171Chris Wren throw new UnsupportedOperationException("the ranker lifecycle is managed by the system."); 115b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov } 116b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov 117b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov @Override 118b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov protected void attachBaseContext(Context base) { 119b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov super.attachBaseContext(base); 120b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov mHandler = new MyHandler(getContext().getMainLooper()); 121b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov } 122b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov 12351017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren @Override 124b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov public final IBinder onBind(Intent intent) { 12551017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren if (mWrapper == null) { 126e0ba7eb365ac19fdc11c3f820349f0352761b9f4Chris Wren mWrapper = new NotificationRankingServiceWrapper(); 12751017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren } 12851017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren return mWrapper; 12951017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren } 13051017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren 1319fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** 1329fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * A notification was posted by an app. Called before alert. 1339fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * 1349fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param sbn the new notification 1359fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param importance the initial importance of the notification. 1369fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param user true if the initial importance reflects an explicit user preference. 1379fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @return an adjustment or null to take no action, within 100ms. 1389fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren */ 13951017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren abstract public Adjustment onNotificationEnqueued(StatusBarNotification sbn, 1409fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren int importance, boolean user); 1419fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 1429fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** 1439fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * The visibility of a notification has changed. 1449fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * 1459fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param key the notification key 1469fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param time milliseconds since midnight, January 1, 1970 UTC. 1479fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param visible true if the notification became visible, false if hidden. 1489fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren */ 1499fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public void onNotificationVisibilityChanged(String key, long time, boolean visible) 1509fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren { 1519fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren // Do nothing, Override this to collect visibility statistics. 1529fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren } 1539fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 1549fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** 1559fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * The user clicked on a notification. 1569fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * 1579fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param key the notification key 1589fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param time milliseconds since midnight, January 1, 1970 UTC. 1599fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren */ 1609fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public void onNotificationClick(String key, long time) 1619fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren { 1629fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren // Do nothing, Override this to collect click statistics 1639fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren } 1649fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 1659fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** 1669fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * The user clicked on a notification action. 1679fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * 1689fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param key the notification key 1699fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param time milliseconds since midnight, January 1, 1970 UTC. 1709fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param actionIndex the index of the action button that was pressed. 1719fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren */ 1729fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public void onNotificationActionClick(String key, long time, int actionIndex) 1739fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren { 1749fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren // Do nothing, Override this to collect action button click statistics 1759fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren } 1769fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 1779fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** 1789fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * A notification was removed. 1799fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 1809fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param key the notification key 1819fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param time milliseconds since midnight, January 1, 1970 UTC. 1829fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * @param reason see {@link #REASON_LISTENER_CANCEL}, etc. 1839fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren */ 1849fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren public void onNotificationRemoved(String key, long time, int reason) { 1859fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren // Do nothing, Override this to collect dismissal statistics 1869fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren } 1879fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 1889fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren /** 189e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds * Updates a notification. N.B. this won’t cause 1909fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * an existing notification to alert, but might allow a future update to 1919fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * this notification to alert. 1929fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren * 193e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds * @param adjustment the adjustment with an explanation 194e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds */ 195e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds public final void adjustNotification(Adjustment adjustment) { 196e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds if (!isBound()) return; 197e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds try { 198e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds getNotificationInterface().applyAdjustmentFromRankerService(mWrapper, adjustment); 199e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds } catch (android.os.RemoteException ex) { 200e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds Log.v(TAG, "Unable to contact notification manager", ex); 201e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds } 202e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds } 203e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds 204e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds /** 205e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds * Updates existing notifications. Re-ranking won't occur until all adjustments are applied. 206e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds * N.B. this won’t cause an existing notification to alert, but might allow a future update to 207e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds * these notifications to alert. 208e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds * 209e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds * @param adjustments a list of adjustments with explanations 2109fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren */ 211e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds public final void adjustNotifications(List<Adjustment> adjustments) { 21251017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren if (!isBound()) return; 21351017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren try { 214e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds getNotificationInterface().applyAdjustmentsFromRankerService(mWrapper, adjustments); 21551017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren } catch (android.os.RemoteException ex) { 21651017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren Log.v(TAG, "Unable to contact notification manager", ex); 21751017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren } 2189fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren } 2199fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren 220e0ba7eb365ac19fdc11c3f820349f0352761b9f4Chris Wren private class NotificationRankingServiceWrapper extends NotificationListenerWrapper { 22151017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren @Override 22251017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren public void onNotificationEnqueued(IStatusBarNotificationHolder sbnHolder, 223b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov int importance, boolean user) { 22451017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren StatusBarNotification sbn; 22551017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren try { 22651017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren sbn = sbnHolder.get(); 22751017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren } catch (RemoteException e) { 22851017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren Log.w(TAG, "onNotificationEnqueued: Error receiving StatusBarNotification", e); 22951017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren return; 23051017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren } 23151017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren 232b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov SomeArgs args = SomeArgs.obtain(); 233b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.arg1 = sbn; 234b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.argi1 = importance; 235b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.argi2 = user ? 1 : 0; 236b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_ENQUEUED, 237b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args).sendToTarget(); 23851017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren } 23951017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren 24051017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren @Override 241b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov public void onNotificationVisibilityChanged(String key, long time, boolean visible) { 242b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov SomeArgs args = SomeArgs.obtain(); 243b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.arg1 = key; 244b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.arg2 = time; 245b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.argi1 = visible ? 1 : 0; 246b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_VISIBILITY_CHANGED, 247b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args).sendToTarget(); 24851017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren } 24951017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren 25051017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren @Override 251b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov public void onNotificationClick(String key, long time) { 252b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov SomeArgs args = SomeArgs.obtain(); 253b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.arg1 = key; 254b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.arg2 = time; 255b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_CLICK, 256b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args).sendToTarget(); 25751017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren } 25851017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren 25951017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren @Override 260b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov public void onNotificationActionClick(String key, long time, int actionIndex) { 261b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov SomeArgs args = SomeArgs.obtain(); 262b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.arg1 = key; 263b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.arg2 = time; 264b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.argi1 = actionIndex; 265b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_ACTION_CLICK, 266b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args).sendToTarget(); 26751017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren } 26851017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren 26951017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren @Override 270b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov public void onNotificationRemovedReason(String key, long time, int reason) { 271b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov SomeArgs args = SomeArgs.obtain(); 272b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.arg1 = key; 273b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.arg2 = time; 274b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.argi1 = reason; 275b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_REMOVED_REASON, 276b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args).sendToTarget(); 277b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov } 278b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov } 279b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov 280b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov private final class MyHandler extends Handler { 281b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov public static final int MSG_ON_NOTIFICATION_ENQUEUED = 1; 282b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov public static final int MSG_ON_NOTIFICATION_VISIBILITY_CHANGED = 2; 283b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov public static final int MSG_ON_NOTIFICATION_CLICK = 3; 284b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov public static final int MSG_ON_NOTIFICATION_ACTION_CLICK = 4; 285b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov public static final int MSG_ON_NOTIFICATION_REMOVED_REASON = 5; 286b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov 287b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov public MyHandler(Looper looper) { 288b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov super(looper, null, false); 289b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov } 290b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov 291b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov @Override 292b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov public void handleMessage(Message msg) { 293b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov switch (msg.what) { 294b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov case MSG_ON_NOTIFICATION_ENQUEUED: { 295b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov SomeArgs args = (SomeArgs) msg.obj; 296b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov StatusBarNotification sbn = (StatusBarNotification) args.arg1; 297b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov final int importance = args.argi1; 298b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov final boolean user = args.argi2 == 1; 299b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.recycle(); 300b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov Adjustment adjustment = onNotificationEnqueued(sbn, importance, user); 301b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov if (adjustment != null) { 302e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds adjustNotification(adjustment); 303b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov } 304b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov } break; 305b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov 306b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov case MSG_ON_NOTIFICATION_VISIBILITY_CHANGED: { 307b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov SomeArgs args = (SomeArgs) msg.obj; 308b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov final String key = (String) args.arg1; 309b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov final long time = (long) args.arg2; 310b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov final boolean visible = args.argi1 == 1; 311b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.recycle(); 312b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov onNotificationVisibilityChanged(key, time, visible); 313b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov } break; 314b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov 315b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov case MSG_ON_NOTIFICATION_CLICK: { 316b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov SomeArgs args = (SomeArgs) msg.obj; 317b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov final String key = (String) args.arg1; 318b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov final long time = (long) args.arg2; 319b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.recycle(); 320b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov onNotificationClick(key, time); 321b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov } break; 322b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov 323b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov case MSG_ON_NOTIFICATION_ACTION_CLICK: { 324b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov SomeArgs args = (SomeArgs) msg.obj; 325b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov final String key = (String) args.arg1; 326b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov final long time = (long) args.arg2; 327b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov final int actionIndex = args.argi1; 328b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.recycle(); 329b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov onNotificationActionClick(key, time, actionIndex); 330b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov } break; 331b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov 332b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov case MSG_ON_NOTIFICATION_REMOVED_REASON: { 333b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov SomeArgs args = (SomeArgs) msg.obj; 334b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov final String key = (String) args.arg1; 335b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov final long time = (long) args.arg2; 336b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov final int reason = args.argi1; 337b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov args.recycle(); 338b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov onNotificationRemoved(key, time, reason); 339b8f53ee812b75b526c3b481b62334e45609fa70eSvet Ganov } break; 34051017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren } 34151017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren } 34251017d0e23ce9855fabcf786a2067ceb19121fbcChris Wren } 3439fa689f8b614d32f36b5f2de2e3065f4ad6b2358Chris Wren} 344