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