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