1d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk/* 2d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * Copyright (C) 2015 The Android Open Source Project 3d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * 4d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); 5d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * you may not use this file except in compliance with the License. 6d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * You may obtain a copy of the License at 7d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * 8d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * http://www.apache.org/licenses/LICENSE-2.0 9d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * 10d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * Unless required by applicable law or agreed to in writing, software 11d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * distributed under the License is distributed on an "AS IS" BASIS, 12d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * See the License for the specific language governing permissions and 14d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * limitations under the License. 15d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk */ 16d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monkpackage com.android.settings.applications; 17d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 18d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monkimport android.os.Handler; 19d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monkimport android.os.Looper; 20d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monkimport android.os.Message; 21d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 2267cd6ab93a526fe65877743e458590f4e6f187eeTony Mantlerimport com.android.settingslib.applications.ApplicationsState; 2367cd6ab93a526fe65877743e458590f4e6f187eeTony Mantlerimport com.android.settingslib.applications.ApplicationsState.AppEntry; 2467cd6ab93a526fe65877743e458590f4e6f187eeTony Mantlerimport com.android.settingslib.applications.ApplicationsState.Session; 25d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 26d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monkimport java.util.ArrayList; 27d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 28d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk/** 29d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk * Common base class for bridging information to ApplicationsState. 30d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk */ 31d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monkpublic abstract class AppStateBaseBridge implements ApplicationsState.Callbacks { 32d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 33d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk protected final ApplicationsState mAppState; 34d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk protected final Session mAppSession; 35d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk protected final Callback mCallback; 36d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk protected final BackgroundHandler mHandler; 37d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk protected final MainHandler mMainHandler; 38d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 39d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public AppStateBaseBridge(ApplicationsState appState, Callback callback) { 40d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mAppState = appState; 41d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mAppSession = mAppState != null ? mAppState.newSession(this) : null; 42d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mCallback = callback; 43d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk // Running on the same background thread as the ApplicationsState lets 44d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk // us run in the background and make sure they aren't doing updates at 45d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk // the same time as us as well. 46d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mHandler = new BackgroundHandler(mAppState.getBackgroundLooper()); 47d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mMainHandler = new MainHandler(); 48d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 49d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 50d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void resume() { 51d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ALL); 52d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mAppSession.resume(); 53d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 54d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 55d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void pause() { 56d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mAppSession.pause(); 57d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 58d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 59d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void release() { 60d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mAppSession.release(); 61d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 62d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 63d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void forceUpdate(String pkg, int uid) { 64d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mHandler.obtainMessage(BackgroundHandler.MSG_FORCE_LOAD_PKG, uid, 0, pkg).sendToTarget(); 65d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 66d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 67d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk @Override 68d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void onPackageListChanged() { 69d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ALL); 70d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 71d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 72d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk @Override 73d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void onLoadEntriesCompleted() { 74d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ALL); 75d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 76d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 77d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk @Override 78d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void onRunningStateChanged(boolean running) { 79d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk // No op. 80d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 81d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 82d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk @Override 83d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void onRebuildComplete(ArrayList<AppEntry> apps) { 84d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk // No op. 85d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 86d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 87d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk @Override 88d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void onPackageIconChanged() { 89d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk // No op. 90d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 91d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 92d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk @Override 93d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void onPackageSizeChanged(String packageName) { 94d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk // No op. 95d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 96d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 97d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk @Override 98d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void onAllSizesComputed() { 99d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk // No op. 100d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 101d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 102d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk @Override 103d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void onLauncherInfoChanged() { 104d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk // No op. 105d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 106d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 107d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk protected abstract void loadAllExtraInfo(); 108d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk protected abstract void updateExtraInfo(AppEntry app, String pkg, int uid); 109d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 110d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk private class MainHandler extends Handler { 111d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk private static final int MSG_INFO_UPDATED = 1; 112d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 113d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk @Override 114d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void handleMessage(Message msg) { 115d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk switch (msg.what) { 116d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk case MSG_INFO_UPDATED: 117d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mCallback.onExtraInfoUpdated(); 118d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk break; 119d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 120d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 121d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 122d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 123d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk private class BackgroundHandler extends Handler { 124d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk private static final int MSG_LOAD_ALL = 1; 125d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk private static final int MSG_FORCE_LOAD_PKG = 2; 126d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 127d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public BackgroundHandler(Looper looper) { 128d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk super(looper); 129d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 130d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 131d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk @Override 132d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public void handleMessage(Message msg) { 133d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk switch (msg.what) { 134d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk case MSG_LOAD_ALL: 135d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk loadAllExtraInfo(); 136d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mMainHandler.sendEmptyMessage(MainHandler.MSG_INFO_UPDATED); 137d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk break; 138d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk case MSG_FORCE_LOAD_PKG: 139d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk ArrayList<AppEntry> apps = mAppSession.getAllApps(); 140d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk final int N = apps.size(); 141d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk String pkg = (String) msg.obj; 142d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk int uid = msg.arg1; 143d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk for (int i = 0; i < N; i++) { 144d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk AppEntry app = apps.get(i); 145d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk if (app.info.uid == uid && pkg.equals(app.info.packageName)) { 146d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk updateExtraInfo(app, pkg, uid); 147d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 148d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 149d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk mMainHandler.sendEmptyMessage(MainHandler.MSG_INFO_UPDATED); 150d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk break; 151d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 152d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 153d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 154d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 155d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk 156d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk public interface Callback { 157d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk void onExtraInfoUpdated(); 158d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk } 159d8da51ccfecf16f2c06f788e6bcbc232d1f0cb32Jason Monk} 160