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