AppStateNotificationBridge.java revision 584b2b2bc17a4ccf42952b188722de1091c101be
1584b2b2bc17a4ccf42952b188722de1091c101beJason Monk/*
2584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * Copyright (C) 2015 The Android Open Source Project
3584b2b2bc17a4ccf42952b188722de1091c101beJason Monk *
4584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * Licensed under the Apache License, Version 2.0 (the "License");
5584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * you may not use this file except in compliance with the License.
6584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * You may obtain a copy of the License at
7584b2b2bc17a4ccf42952b188722de1091c101beJason Monk *
8584b2b2bc17a4ccf42952b188722de1091c101beJason Monk *      http://www.apache.org/licenses/LICENSE-2.0
9584b2b2bc17a4ccf42952b188722de1091c101beJason Monk *
10584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * Unless required by applicable law or agreed to in writing, software
11584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * distributed under the License is distributed on an "AS IS" BASIS,
12584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * See the License for the specific language governing permissions and
14584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * limitations under the License.
15584b2b2bc17a4ccf42952b188722de1091c101beJason Monk */
16584b2b2bc17a4ccf42952b188722de1091c101beJason Monkpackage com.android.settings.applications;
17584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
18584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.content.pm.PackageManager;
19584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.os.Handler;
20584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.os.Looper;
21584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport android.os.Message;
22584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
23584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.applications.ApplicationsState.AppEntry;
24584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.applications.ApplicationsState.AppFilter;
25584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.applications.ApplicationsState.Session;
26584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.notification.NotificationBackend;
27584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.notification.NotificationBackend.AppRow;
28584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
29584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport java.util.ArrayList;
30584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport java.util.List;
31584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
32584b2b2bc17a4ccf42952b188722de1091c101beJason Monk/**
33584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * Connects the info provided by ApplicationsState and the NotificationBackend.
34584b2b2bc17a4ccf42952b188722de1091c101beJason Monk * Also provides app filters that can use the notification data.
35584b2b2bc17a4ccf42952b188722de1091c101beJason Monk */
36584b2b2bc17a4ccf42952b188722de1091c101beJason Monkpublic class AppStateNotificationBridge implements ApplicationsState.Callbacks {
37584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
38584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    private final ApplicationsState mAppState;
39584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    private final NotificationBackend mNotifBackend;
40584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    private final Session mAppSession;
41584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    private final Callback mCallback;
42584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    private final BackgroundHandler mHandler;
43584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    private final MainHandler mMainHandler;
44584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    private final PackageManager mPm;
45584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
46584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public AppStateNotificationBridge(PackageManager pm, ApplicationsState appState,
47584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            NotificationBackend notifBackend, Callback callback) {
48584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mAppState = appState;
49584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mPm = pm;
50584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mAppSession = mAppState.newSession(this);
51584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mNotifBackend = notifBackend;
52584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mCallback = callback;
53584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        // Running on the same background thread as the ApplicationsState lets
54584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        // us run in the background and make sure they aren't doing updates at
55584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        // the same time as us as well.
56584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mHandler = new BackgroundHandler(mAppState.getBackgroundLooper());
57584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mMainHandler = new MainHandler();
58584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ALL);
59584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
60584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
61584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public void resume() {
62584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ALL);
63584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mAppSession.resume();
64584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
65584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
66584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public void pause() {
67584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mAppSession.pause();
68584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
69584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
70584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public void release() {
71584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mAppSession.release();
72584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
73584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
74584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public void forceUpdate(String pkg, int uid) {
75584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mHandler.obtainMessage(BackgroundHandler.MSG_FORCE_LOAD_PKG, uid, 0, pkg).sendToTarget();
76584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
77584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
78584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    @Override
79584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public void onPackageListChanged() {
80584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ALL);
81584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
82584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
83584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    @Override
84584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public void onLoadEntriesCompleted() {
85584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        mHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ALL);
86584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
87584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
88584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    @Override
89584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public void onRunningStateChanged(boolean running) {
90584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        // No op.
91584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
92584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
93584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    @Override
94584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public void onRebuildComplete(ArrayList<AppEntry> apps) {
95584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        // No op.
96584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
97584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
98584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    @Override
99584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public void onPackageIconChanged() {
100584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        // No op.
101584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
102584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
103584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    @Override
104584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public void onPackageSizeChanged(String packageName) {
105584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        // No op.
106584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
107584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
108584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    @Override
109584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public void onAllSizesComputed() {
110584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        // No op.
111584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
112584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
113584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    @Override
114584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public void onLauncherInfoChanged() {
115584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        // No op.
116584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
117584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
118584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    private class MainHandler extends Handler {
119584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        private static final int MSG_NOTIF_UPDATED = 1;
120584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
121584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        @Override
122584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public void handleMessage(Message msg) {
123584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            switch (msg.what) {
124584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                case MSG_NOTIF_UPDATED:
125584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                    mCallback.onNotificationInfoUpdated();
126584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                    break;
127584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            }
128584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
129584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
130584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
131584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    private class BackgroundHandler extends Handler {
132584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        private static final int MSG_LOAD_ALL = 1;
133584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        private static final int MSG_FORCE_LOAD_PKG = 2;
134584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
135584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public BackgroundHandler(Looper looper) {
136584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            super(looper);
137584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
138584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
139584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        @Override
140584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public void handleMessage(Message msg) {
141584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            List<AppEntry> apps = mAppSession.getAllApps();
142584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            final int N = apps.size();
143584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            switch (msg.what) {
144584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                case MSG_LOAD_ALL:
145584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                    for (int i = 0; i < N; i++) {
146584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                        AppEntry app = apps.get(i);
147584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                        app.extraInfo = mNotifBackend.loadAppRow(mPm, app.info);
148584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                    }
149584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                    mMainHandler.sendEmptyMessage(MainHandler.MSG_NOTIF_UPDATED);
150584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                    break;
151584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                case MSG_FORCE_LOAD_PKG:
152584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                    String pkg = (String) msg.obj;
153584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                    int uid = msg.arg1;
154584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                    for (int i = 0; i < N; i++) {
155584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                        AppEntry app = apps.get(i);
156584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                        if (app.info.uid == uid && pkg.equals(app.info.packageName)) {
157584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                            app.extraInfo = mNotifBackend.loadAppRow(mPm, app.info);
158584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                            break;
159584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                        }
160584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                    }
161584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                    mMainHandler.sendEmptyMessage(MainHandler.MSG_NOTIF_UPDATED);
162584b2b2bc17a4ccf42952b188722de1091c101beJason Monk                    break;
163584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            }
164584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
165584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
166584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
167584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public interface Callback {
168584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        void onNotificationInfoUpdated();
169584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    }
170584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
171584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public static final AppFilter FILTER_APP_NOTIFICATION_BLOCKED = new AppFilter() {
172584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        @Override
173584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public void init() {
174584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
175584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
176584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        @Override
177584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public boolean filterApp(AppEntry info) {
178584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            return info.extraInfo != null && ((AppRow) info.extraInfo).banned;
179584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
180584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    };
181584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
182584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public static final AppFilter FILTER_APP_NOTIFICATION_PRIORITY = new AppFilter() {
183584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        @Override
184584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public void init() {
185584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
186584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
187584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        @Override
188584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public boolean filterApp(AppEntry info) {
189584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            return info.extraInfo != null && ((AppRow) info.extraInfo).priority;
190584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
191584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    };
192584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
193584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    public static final AppFilter FILTER_APP_NOTIFICATION_SENSITIVE = new AppFilter() {
194584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        @Override
195584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public void init() {
196584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
197584b2b2bc17a4ccf42952b188722de1091c101beJason Monk
198584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        @Override
199584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        public boolean filterApp(AppEntry info) {
200584b2b2bc17a4ccf42952b188722de1091c101beJason Monk            return info.extraInfo != null && ((AppRow) info.extraInfo).sensitive;
201584b2b2bc17a4ccf42952b188722de1091c101beJason Monk        }
202584b2b2bc17a4ccf42952b188722de1091c101beJason Monk    };
203584b2b2bc17a4ccf42952b188722de1091c101beJason Monk}
204