1290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk/*
2290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk * Copyright (C) 2016 The Android Open Source Project
3290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk *
4290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk * except in compliance with the License. You may obtain a copy of the License at
6290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk *
7290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
8290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk *
9290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
10290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk * KIND, either express or implied. See the License for the specific language governing
12290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk * permissions and limitations under the License.
13290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk */
14290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk
15290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monkpackage com.android.settings.applications;
16290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk
17290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monkimport android.app.AppGlobals;
18290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monkimport android.content.Context;
19290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monkimport android.content.pm.ApplicationInfo;
20290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monkimport android.content.pm.IPackageManager;
21290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monkimport android.content.pm.PackageManager;
22290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monkimport android.content.pm.ParceledListSlice;
23290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monkimport android.content.pm.UserInfo;
24290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monkimport android.os.AsyncTask;
25290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monkimport android.os.RemoteException;
26290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monkimport android.os.UserHandle;
27290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monkimport android.os.UserManager;
28290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk
29290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monkpublic abstract class AppCounter extends AsyncTask<Void, Void, Integer> {
30290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk
31290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk    protected final PackageManager mPm;
32290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk    protected final IPackageManager mIpm;
33290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk    protected final UserManager mUm;
34290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk
35290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk    public AppCounter(Context context) {
36290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk        mPm = context.getPackageManager();
37290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk        mIpm = AppGlobals.getPackageManager();
38290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk        mUm = UserManager.get(context);
39290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk    }
40290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk
41290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk    @Override
42290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk    protected Integer doInBackground(Void... params) {
43290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk        int count = 0;
44290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk        for (UserInfo user : mUm.getProfiles(UserHandle.myUserId())) {
45290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk            try {
46290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk                @SuppressWarnings("unchecked")
47290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk                ParceledListSlice<ApplicationInfo> list =
48290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk                        mIpm.getInstalledApplications(PackageManager.GET_DISABLED_COMPONENTS
49290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk                                | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS
50290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk                                | (user.isAdmin() ? PackageManager.GET_UNINSTALLED_PACKAGES : 0),
51290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk                                user.id);
52290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk                for (ApplicationInfo info : list.getList()) {
53290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk                    if (includeInCount(info)) {
54290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk                        count++;
55290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk                    }
56290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk                }
57290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk            } catch (RemoteException e) {
58290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk            }
59290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk        }
60290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk        return count;
61290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk    }
62290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk
63290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk    @Override
64290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk    protected void onPostExecute(Integer count) {
65290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk        onCountComplete(count);
66290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk    }
67290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk
68290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk    protected abstract void onCountComplete(int num);
69290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk    protected abstract boolean includeInCount(ApplicationInfo info);
70290ca6ec5c1f029bff7a43d1d499359e25a41904Jason Monk}
71