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