ManageApplications.java revision a4af18755e0a344c628e4ddc4ece793d3401e6fb
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport static android.net.NetworkPolicyManager.POLICY_NONE; 2014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; 2138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu 22a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.app.Activity; 2314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.AlertDialog; 24f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment; 2514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.INotificationManager; 2644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ComponentName; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 2814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.DialogInterface; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 3014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.IntentFilter; 3144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ServiceConnection; 3219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport android.content.pm.ApplicationInfo; 336dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.IPackageManager; 346dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.PackageInfo; 3514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.pm.PackageManager; 3614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.net.NetworkPolicyManager; 3714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.AsyncTask; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 391337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.os.Environment; 4014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.Handler; 4144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.os.IBinder; 426dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.RemoteException; 436dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.ServiceManager; 44f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.preference.PreferenceActivity; 45a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackbornimport android.preference.PreferenceFrameLayout; 46728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.provider.Settings; 47309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerAdapter; 48309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerTabStrip; 49309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.ViewPager; 501337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.text.format.Formatter; 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu; 54f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.MenuInflater; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem; 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup; 58ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackbornimport android.view.animation.AnimationUtils; 59e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView; 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView; 61a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.widget.AdapterView.OnItemClickListener; 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter; 63c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filter; 64c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filterable; 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView; 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 67b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 6844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.internal.app.IMediaContainerService; 69b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.internal.content.PackageHelper; 70b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.R; 71b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.RunningServicesActivity; 72b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.StorageUseActivity; 73b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.applications.ApplicationsState.AppEntry; 7444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.settings.deviceinfo.StorageMeasurement; 75309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport com.android.settings.Utils; 76b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Comparator; 7914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport java.util.List; 80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 816dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornfinal class CanBeOnSdCardChecker { 826dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn final IPackageManager mPm; 836dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn int mInstallLocation; 846dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 856dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn CanBeOnSdCardChecker() { 866dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mPm = IPackageManager.Stub.asInterface( 876dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn ServiceManager.getService("package")); 886dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 906dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn void init() { 916dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn try { 926dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mInstallLocation = mPm.getInstallLocation(); 936dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } catch (RemoteException e) { 946dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn Log.e("CanBeOnSdCardChecker", "Is Package Manager running?"); 956dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn return; 966dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 976dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 986dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 996dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn boolean check(ApplicationInfo info) { 1006dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn boolean canBe = false; 1016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { 1026dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn canBe = true; 1036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } else { 1043c24cfed8d5116ff21986acb60a918cb079a0efdKenny Root if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { 1056dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if (info.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL || 1066dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn info.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) { 1076dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn canBe = true; 1086dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } else if (info.installLocation 1096dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) { 1106dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if (mInstallLocation == PackageHelper.APP_INSTALL_EXTERNAL) { 1116dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn // For apps with no preference and the default value set 1126dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn // to install on sdcard. 1136dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn canBe = true; 1146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1156dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1166dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1176dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1186dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn return canBe; 1196dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1206dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn} 1216dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 122a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborninterface AppClickListener { 123a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn void onItemClick(ManageApplications.TabInfo tab, AdapterView<?> parent, 124a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn View view, int position, long id); 125a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn} 126a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to pick an application that will be used to display installation information and 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * options to uninstall/delete user data for system applications. This activity 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * intent. 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 133f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class ManageApplications extends Fragment implements 134a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn AppClickListener, DialogInterface.OnClickListener, 13514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn DialogInterface.OnDismissListener { 13602c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 137e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final String TAG = "ManageApplications"; 138e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final boolean DEBUG = false; 13902c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 14002c22131e93e1a506141b1890c7134909ded876fAmith Yamasani private static final String EXTRA_FILTER_APPS = "filterApps"; 14102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani private static final String EXTRA_SORT_ORDER = "sortOrder"; 14202c22131e93e1a506141b1890c7134909ded876fAmith Yamasani private static final String EXTRA_SHOW_BACKGROUND = "showBackground"; 1437a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani private static final String EXTRA_DEFAULT_LIST_TYPE = "defaultListType"; 14414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn private static final String EXTRA_RESET_DIALOG = "resetDialog"; 14502c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // attributes used as keys when passing values to InstalledAppDetails activity 14738b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu public static final String APP_CHG = "chg"; 14802c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // constant value that can be used to check return code from sub activity. 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int INSTALLED_APP_DETAILS = 1; 151d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn 152bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_TOTAL = 0; 153bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_INTERNAL = 1; 154bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_EXTERNAL = 2; 155bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // sort order that can be changed through the menu can be sorted alphabetically 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // or size(descending) 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int MENU_OPTIONS_BASE = 0; 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Filter options used for displayed list of applications 1606cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0; 161728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1; 162728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2; 163747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu 1646cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4; 1656cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5; 1661337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6; 1671337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7; 16814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 8; 169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // sort order 170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private int mSortOrder = SORT_ORDER_ALPHA; 171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Filter value 172fe4a2bc43f45b14db62c67d7c2531a3d7f1b8590Suchi Amalapurapu private int mFilterApps = FILTER_APPS_THIRD_PARTY; 173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 174e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ApplicationsState mApplicationsState; 175309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 176309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public static class TabInfo implements OnItemClickListener { 177309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final ManageApplications mOwner; 178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final ApplicationsState mApplicationsState; 179309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mLabel; 180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final int mListType; 181309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final int mFilter; 182a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public final AppClickListener mClickListener; 183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mInvalidSizeStr; 184309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mComputingSizeStr; 185309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final Bundle mSavedInstanceState; 186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public ApplicationsAdapter mApplications; 188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public LayoutInflater mInflater; 189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View mRootView; 190309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 191a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn private IMediaContainerService mContainerService; 192a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 193309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mLoadingContainer; 194309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 195309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mListContainer; 196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 197309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // ListView used to display list 198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ListView mListView; 199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Custom view used to display running processes 200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private RunningProcessesView mRunningProcessesView; 201309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 202309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private LinearColorBar mColorBar; 203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private TextView mStorageChartLabel; 204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private TextView mUsedStorageText; 205309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private TextView mFreeStorageText; 206a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn private long mFreeStorage = 0, mAppStorage = 0, mTotalStorage = 0; 207309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage; 208309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 209309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final Runnable mRunningProcessesAvail = new Runnable() { 210309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void run() { 211309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn handleRunningProcessesAvail(); 212309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn }; 214309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 215309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public TabInfo(ManageApplications owner, ApplicationsState apps, 216a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn CharSequence label, int listType, AppClickListener clickListener, 217309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Bundle savedInstanceState) { 218309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner = owner; 219309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplicationsState = apps; 220309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLabel = label; 221309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListType = listType; 222309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn switch (listType) { 223309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn case LIST_TYPE_DOWNLOADED: mFilter = FILTER_APPS_THIRD_PARTY; break; 224309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn case LIST_TYPE_SDCARD: mFilter = FILTER_APPS_SDCARD; break; 225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn default: mFilter = FILTER_APPS_ALL; break; 226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 227309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mClickListener = clickListener; 228309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInvalidSizeStr = owner.getActivity().getText(R.string.invalid_size_value); 229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mComputingSizeStr = owner.getActivity().getText(R.string.computing_size); 230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSavedInstanceState = savedInstanceState; 231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 232309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 233a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void setContainerService(IMediaContainerService containerService) { 234a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mContainerService = containerService; 235a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn updateStorageUsage(); 236a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 237a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 238309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View build(LayoutInflater inflater, ViewGroup contentParent, View contentChild) { 239309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRootView != null) { 240309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mRootView; 241309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 242309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 243309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInflater = inflater; 244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRootView = inflater.inflate(mListType == LIST_TYPE_RUNNING 245309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ? R.layout.manage_applications_running 246309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn : R.layout.manage_applications_apps, null); 247309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer = mRootView.findViewById(R.id.loading_container); 248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.VISIBLE); 249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListContainer = mRootView.findViewById(R.id.list_container); 250309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mListContainer != null) { 251309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Create adapter and list view here 252309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty); 253309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ListView lv = (ListView) mListContainer.findViewById(android.R.id.list); 254309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (emptyView != null) { 255309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setEmptyView(emptyView); 256309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 257309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setOnItemClickListener(this); 258309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setSaveEnabled(true); 259309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setItemsCanFocus(true); 260309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setTextFilterEnabled(true); 261309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListView = lv; 262309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplications = new ApplicationsAdapter(mApplicationsState, this, mFilter); 263309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListView.setAdapter(mApplications); 264309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListView.setRecyclerListener(mApplications); 265309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar); 266309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel); 267309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText); 268309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText); 269309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false); 270a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mFilter == FILTER_APPS_SDCARD) { 271a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mStorageChartLabel.setText(mOwner.getActivity().getText( 272a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn R.string.sd_card_storage)); 273a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } else { 274a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mStorageChartLabel.setText(mOwner.getActivity().getText( 275a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn R.string.internal_storage)); 276a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 277a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn applyCurrentStorage(); 278309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 279309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView = (RunningProcessesView)mRootView.findViewById( 280309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn R.id.running_processes); 281309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRunningProcessesView != null) { 282309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.doCreate(mSavedInstanceState); 283309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 284309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 285309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mRootView; 286309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 287309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 288a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void detachView() { 289a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mRootView != null) { 290a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ViewGroup group = (ViewGroup)mRootView.getParent(); 291a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (group != null) { 292a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn group.removeView(mRootView); 293a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 294a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 295a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 296a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 297309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void resume(int sortOrder) { 298309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 299309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplications.resume(sortOrder); 300309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 301309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRunningProcessesView != null) { 302309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn boolean haveData = mRunningProcessesView.doResume(mOwner, mRunningProcessesAvail); 303309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (haveData) { 304309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.setVisibility(View.VISIBLE); 305309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.INVISIBLE); 306309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } else { 307309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.VISIBLE); 308309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 309309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 310309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 311309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 312309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void pause() { 313309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 314309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplications.pause(); 315309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 316309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRunningProcessesView != null) { 317309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.doPause(); 318309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 319309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 320309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 321309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn void updateStorageUsage() { 322309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Make sure a callback didn't come at an inopportune time. 323309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mOwner.getActivity() == null) return; 324309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Doesn't make sense for stuff that is not an app list. 325309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications == null) return; 326309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 327a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = 0; 328a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage = 0; 329a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = 0; 330309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 331309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mFilter == FILTER_APPS_SDCARD) { 332309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mContainerService != null) { 333309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn try { 334309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final long[] stats = mContainerService.getFileSystemStats( 335309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Environment.getExternalStorageDirectory().getPath()); 336a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = stats[0]; 337a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = stats[1]; 338309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } catch (RemoteException e) { 339309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Log.w(TAG, "Problem in container service", e); 340309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 341309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 342309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 343309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 344309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final int N = mApplications.getCount(); 345309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<N; i++) { 346309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ApplicationsState.AppEntry ae = mApplications.getAppEntry(i); 347a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage += ae.externalCodeSize + ae.externalDataSize; 348309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 349309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 350309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } else { 351309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mContainerService != null) { 352309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn try { 353309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final long[] stats = mContainerService.getFileSystemStats( 354309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Environment.getDataDirectory().getPath()); 355a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = stats[0]; 356a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = stats[1]; 357309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } catch (RemoteException e) { 358309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Log.w(TAG, "Problem in container service", e); 359309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 360309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 361309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 362309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final boolean emulatedStorage = Environment.isExternalStorageEmulated(); 363309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 364309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final int N = mApplications.getCount(); 365309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<N; i++) { 366309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ApplicationsState.AppEntry ae = mApplications.getAppEntry(i); 367a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage += ae.codeSize + ae.dataSize; 368309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (emulatedStorage) { 369a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage += ae.externalCodeSize + ae.externalDataSize; 370309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 371309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 372309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 373a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage += mApplicationsState.sumCacheSizes(); 374309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 375a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 376a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn applyCurrentStorage(); 377a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 378a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 379a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn void applyCurrentStorage() { 380a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // If view hierarchy is not yet created, no views to update. 381a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mRootView == null) { 382a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn return; 383309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 384a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mTotalStorage > 0) { 385a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mColorBar.setRatios((mTotalStorage-mFreeStorage-mAppStorage)/(float)mTotalStorage, 386a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage/(float)mTotalStorage, mFreeStorage/(float)mTotalStorage); 387a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn long usedStorage = mTotalStorage - mFreeStorage; 388309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mLastUsedStorage != usedStorage) { 389309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLastUsedStorage = usedStorage; 390309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn String sizeStr = Formatter.formatShortFileSize( 391309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner.getActivity(), usedStorage); 392309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mUsedStorageText.setText(mOwner.getActivity().getResources().getString( 393309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn R.string.service_foreground_processes, sizeStr)); 394309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 395a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mLastFreeStorage != mFreeStorage) { 396a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mLastFreeStorage = mFreeStorage; 397309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn String sizeStr = Formatter.formatShortFileSize( 398a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mOwner.getActivity(), mFreeStorage); 399309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFreeStorageText.setText(mOwner.getActivity().getResources().getString( 400309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn R.string.service_background_processes, sizeStr)); 401309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 402309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } else { 403309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mColorBar.setRatios(0, 0, 0); 404309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mLastUsedStorage != -1) { 405309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLastUsedStorage = -1; 406309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mUsedStorageText.setText(""); 407309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 408309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mLastFreeStorage != -1) { 409309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLastFreeStorage = -1; 410309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFreeStorageText.setText(""); 411309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 412309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 413309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 414309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 415309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 416309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 417a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mClickListener.onItemClick(this, parent, view, position, id); 418309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 419309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 420309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn void handleRunningProcessesAvail() { 421309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.startAnimation(AnimationUtils.loadAnimation( 422309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner.getActivity(), android.R.anim.fade_out)); 423309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation( 424309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner.getActivity(), android.R.anim.fade_in)); 425309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.setVisibility(View.VISIBLE); 426309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.GONE); 427309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 428309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 429309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 430309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo mCurTab = null; 431309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Size resource used for packages whose size computation failed for some reason 4339244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn CharSequence mInvalidSizeStr; 434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingSizeStr; 435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // layout inflater object used to inflate views 437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private LayoutInflater mInflater; 438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 439de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private String mCurrentPkgName; 440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 441ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn private Menu mOptionsMenu; 4427a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 4437a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani // These are for keeping track of activity and spinner switch state. 444728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private boolean mActivityResumed; 445728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 4467a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_DOWNLOADED = 0; 4477a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_RUNNING = 1; 4487a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_SDCARD = 2; 4497a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_ALL = 3; 450f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 4510385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn private boolean mShowBackground = false; 4520385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn 4537a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani private int mDefaultListType = -1; 454f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 455309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ViewGroup mContentContainer; 456309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mRootView; 457309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ViewPager mViewPager; 458f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 45914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn AlertDialog mResetDialog; 46014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 461309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn class MyPagerAdapter extends PagerAdapter 462309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn implements ViewPager.OnPageChangeListener { 463309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn int mCurPos = 0; 464309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 465309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 466309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public int getCount() { 467309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mTabs.size(); 468309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 469309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 470309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 471309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public Object instantiateItem(ViewGroup container, int position) { 472309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(position); 473309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn View root = tab.build(mInflater, mContentContainer, mRootView); 474309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn container.addView(root); 475309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return root; 476309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 477309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 478309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 479309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void destroyItem(ViewGroup container, int position, Object object) { 480309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn container.removeView((View)object); 481ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn } 482ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn 483309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 484309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public boolean isViewFromObject(View view, Object object) { 485309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return view == object; 486309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 4877a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 488309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 489309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public CharSequence getPageTitle(int position) { 490309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mTabs.get(position).mLabel; 491309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 492309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 493309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 494309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 495309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 496309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 497309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 498309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onPageSelected(int position) { 499309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurPos = position; 500309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 501309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 502309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 503309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onPageScrollStateChanged(int state) { 504309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (state == ViewPager.SCROLL_STATE_IDLE) { 505309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateCurrentTab(mCurPos); 506309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 5077a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 5087a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 5097a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 510e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project /* 511e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * Custom adapter implementation for the ListView 512e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * This adapter maintains a map for each displayed application and its properties 513e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * An index value on each AppInfo object indicates the correct position or index 514e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * in the list. If the list gets updated dynamically when the user is viewing the list of 515e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * applications, we need to return the correct index of position. This is done by mapping 516e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * the getId methods via the package name into the internal maps and indices. 517e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * The order of applications in the list is mirrored in mAppLocalList 518e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project */ 519309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn static class ApplicationsAdapter extends BaseAdapter implements Filterable, 520e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.Callbacks, AbsListView.RecyclerListener { 521e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private final ApplicationsState mState; 522309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final ApplicationsState.Session mSession; 523309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final TabInfo mTab; 524309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final Context mContext; 525e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private final ArrayList<View> mActive = new ArrayList<View>(); 526309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final int mFilterMode; 527e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ArrayList<ApplicationsState.AppEntry> mBaseEntries; 528e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ArrayList<ApplicationsState.AppEntry> mEntries; 529e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private boolean mResumed; 530309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private int mLastSortMode=-1; 53119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn private boolean mWaitingForData; 532bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn private int mWhichSize = SIZE_TOTAL; 533e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn CharSequence mCurFilterPrefix; 534e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 535e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private Filter mFilter = new Filter() { 536e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 537e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn protected FilterResults performFiltering(CharSequence constraint) { 538e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> entries 539e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn = applyPrefixFilter(constraint, mBaseEntries); 540e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn FilterResults fr = new FilterResults(); 541e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn fr.values = entries; 542e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn fr.count = entries.size(); 543e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return fr; 544e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 545355b32faa924a0b39067dd759ba03e5af97065caSuchi Amalapurapu 546e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 547e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn protected void publishResults(CharSequence constraint, FilterResults results) { 548e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mCurFilterPrefix = constraint; 549e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values; 550e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn notifyDataSetChanged(); 551309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 552afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 553e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn }; 554c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 555309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public ApplicationsAdapter(ApplicationsState state, TabInfo tab, int filterMode) { 556e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState = state; 557309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession = state.newSession(this); 558309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab = tab; 559309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContext = tab.mOwner.getActivity(); 560309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFilterMode = filterMode; 561c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 562e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 563309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void resume(int sort) { 564e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "Resume! mResumed=" + mResumed); 565e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (!mResumed) { 566e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumed = true; 567309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.resume(); 568e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastSortMode = sort; 56919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(true); 570e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } else { 571309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn rebuild(sort); 572c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 573e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 574c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 575e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void pause() { 576e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mResumed) { 577e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumed = false; 578309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.pause(); 579e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 580afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 581b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 582309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void rebuild(int sort) { 583309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (sort == mLastSortMode) { 584e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return; 585e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 586e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastSortMode = sort; 58719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(true); 588afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 589afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 59019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void rebuild(boolean eraseold) { 591e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "Rebuilding app list..."); 592e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppFilter filterObj; 593e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn Comparator<AppEntry> comparatorObj; 594bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn boolean emulated = Environment.isExternalStorageEmulated(); 595bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn if (emulated) { 596bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_TOTAL; 597bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } else { 598bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_INTERNAL; 599bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 600309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn switch (mFilterMode) { 601e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case FILTER_APPS_THIRD_PARTY: 602e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = ApplicationsState.THIRD_PARTY_FILTER; 603e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 604e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case FILTER_APPS_SDCARD: 605e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = ApplicationsState.ON_SD_CARD_FILTER; 606bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn if (!emulated) { 607bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_EXTERNAL; 608bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 609e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 610e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn default: 611e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = null; 612e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 613e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 614e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn switch (mLastSortMode) { 615e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case SORT_ORDER_SIZE: 616430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn switch (mWhichSize) { 617430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn case SIZE_INTERNAL: 618430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR; 619430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 620430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn case SIZE_EXTERNAL: 621430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.EXTERNAL_SIZE_COMPARATOR; 622430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 623430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn default: 624430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.SIZE_COMPARATOR; 625430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 626430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn } 627e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 628e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn default: 629e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn comparatorObj = ApplicationsState.ALPHA_COMPARATOR; 630e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 631e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 63219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn ArrayList<ApplicationsState.AppEntry> entries 633309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn = mSession.rebuild(filterObj, comparatorObj); 63419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (entries == null && !eraseold) { 63519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn // Don't have new list yet, but can continue using the old one. 63619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn return; 63719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 63819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mBaseEntries = entries; 63919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (mBaseEntries != null) { 64019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries); 64119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } else { 64219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = null; 64319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 644e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn notifyDataSetChanged(); 645309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 64619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 64719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (entries == null) { 64819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mWaitingForData = true; 649309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.setVisibility(View.INVISIBLE); 650309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.setVisibility(View.VISIBLE); 65119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } else { 652309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.setVisibility(View.VISIBLE); 653309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.setVisibility(View.GONE); 65419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 655afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 656afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 657e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix, 658e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> origEntries) { 659e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (prefix == null || prefix.length() == 0) { 660e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return origEntries; 661afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 662e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn String prefixStr = ApplicationsState.normalize(prefix.toString()); 663e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn final String spacePrefixStr = " " + prefixStr; 664e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> newEntries 665e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn = new ArrayList<ApplicationsState.AppEntry>(); 666e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn for (int i=0; i<origEntries.size(); i++) { 667e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = origEntries.get(i); 668e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn String nlabel = entry.getNormalizedLabel(); 669e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) { 670e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn newEntries.add(entry); 671ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 672ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 673e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return newEntries; 674afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 675afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 676ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu 677e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 678e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onRunningStateChanged(boolean running) { 679309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mOwner.getActivity().setProgressBarIndeterminateVisibility(running); 680afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 681b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 682e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 68319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void onRebuildComplete(ArrayList<AppEntry> apps) { 684309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mTab.mLoadingContainer.getVisibility() == View.VISIBLE) { 685309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.startAnimation(AnimationUtils.loadAnimation( 686309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContext, android.R.anim.fade_out)); 687309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.startAnimation(AnimationUtils.loadAnimation( 688309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContext, android.R.anim.fade_in)); 6894e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn } 690309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.setVisibility(View.VISIBLE); 691309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.setVisibility(View.GONE); 69219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mWaitingForData = false; 69319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mBaseEntries = apps; 69419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries); 69519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn notifyDataSetChanged(); 696309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 69719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 69819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 69919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn @Override 700e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageListChanged() { 70119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 702afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 703b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 704e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 705e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageIconChanged() { 706e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // We ensure icons are loaded when their item is displayed, so 707e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // don't care about icons loaded in the background. 708afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 709b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 710e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 711e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageSizeChanged(String packageName) { 712e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 713e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag(); 714e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (holder.entry.info.packageName.equals(packageName)) { 715e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn synchronized (holder.entry) { 716309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize); 717c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 718309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (holder.entry.info.packageName.equals(mTab.mOwner.mCurrentPkgName) 719e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn && mLastSortMode == SORT_ORDER_SIZE) { 720e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // We got the size information for the last app the 721e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // user viewed, and are sorting by size... they may 722e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // have cleared data, so we immediately want to resort 723e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // the list with the new size to reflect it to the user. 72419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 725c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 726309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 727e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return; 728c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 729c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 730c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 731c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 732e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 733e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onAllSizesComputed() { 734e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mLastSortMode == SORT_ORDER_SIZE) { 73519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 736afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 737a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTab.updateStorageUsage(); 738afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 739afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 740afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getCount() { 741e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries != null ? mEntries.size() : 0; 742afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 743afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 744afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public Object getItem(int position) { 745e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position); 746afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 747afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 748e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public ApplicationsState.AppEntry getAppEntry(int position) { 749e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position); 750afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 751afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 752afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public long getItemId(int position) { 753e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position).id; 754afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 755afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 756afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 757347c9a0544328e65120582834ce330fb0d473f28Jeff Brown // A ViewHolder keeps references to children views to avoid unnecessary calls 758afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // to findViewById() on each row. 759309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn AppViewHolder holder = AppViewHolder.createOrRecycle(mTab.mInflater, convertView); 7609244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn convertView = holder.rootView; 761afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 762afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Bind the data efficiently with the holder 763e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = mEntries.get(position); 764e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn synchronized (entry) { 765e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.entry = entry; 766e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.label != null) { 767e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.appName.setText(entry.label); 768309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn holder.appName.setTextColor(mContext.getResources().getColorStateList( 769e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn entry.info.enabled ? android.R.color.primary_text_dark 7709db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn : android.R.color.secondary_text_dark)); 771afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 772e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState.ensureIcon(entry); 773e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.icon != null) { 774e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.appIcon.setImageDrawable(entry.icon); 775afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 776309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize); 77744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn if (InstalledAppDetails.SUPPORT_DISABLE_APPS) { 77844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn holder.disabled.setVisibility(entry.info.enabled ? View.GONE : View.VISIBLE); 77944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn } else { 78044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn holder.disabled.setVisibility(View.GONE); 78144178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn } 782309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mFilterMode == FILTER_APPS_SDCARD) { 7836dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setVisibility(View.VISIBLE); 7846dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setChecked((entry.info.flags 7856dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0); 7866dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } else { 7876dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setVisibility(View.GONE); 7886dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 789afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 790e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.remove(convertView); 791e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.add(convertView); 792afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return convertView; 793afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 794c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 795e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 796c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu public Filter getFilter() { 797e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mFilter; 798c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 799c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 800e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 801e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onMovedToScrapHeap(View view) { 802e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.remove(view); 803728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 804728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 805728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 806afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 807f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreate(Bundle savedInstanceState) { 808afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 809f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 810f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn setHasOptionsMenu(true); 811f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 812f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication()); 813f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Intent intent = getActivity().getIntent(); 814ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu String action = intent.getAction(); 8157a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani int defaultListType = LIST_TYPE_DOWNLOADED; 816ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn String className = getArguments() != null 817ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ? getArguments().getString("classname") : null; 818ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (className == null) { 819ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn className = intent.getComponent().getClassName(); 820ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 821af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani if (className.equals(RunningServicesActivity.class.getName()) 822af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || className.endsWith(".RunningServices")) { 8237a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_RUNNING; 8245203bdffe6ce2b829d0fab8c7691fa92aca6e972Amith Yamasani } else if (className.equals(StorageUseActivity.class.getName()) 825af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || Intent.ACTION_MANAGE_PACKAGE_STORAGE.equals(action) 826af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || className.endsWith(".StorageUse")) { 827afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSortOrder = SORT_ORDER_SIZE; 828fe4a2bc43f45b14db62c67d7c2531a3d7f1b8590Suchi Amalapurapu mFilterApps = FILTER_APPS_ALL; 8297a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_ALL; 830762eaa77e3e12d5337ddc9cb87b473c47af5524aKenny Root } else if (Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)) { 8317a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani // Select the all-apps list, with the default sorting 8327a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_ALL; 833afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8347a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 835728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (savedInstanceState != null) { 83602c22131e93e1a506141b1890c7134909ded876fAmith Yamasani mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder); 83702c22131e93e1a506141b1890c7134909ded876fAmith Yamasani mFilterApps = savedInstanceState.getInt(EXTRA_FILTER_APPS, mFilterApps); 8387a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani int tmp = savedInstanceState.getInt(EXTRA_DEFAULT_LIST_TYPE, -1); 8397a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani if (tmp != -1) defaultListType = tmp; 84002c22131e93e1a506141b1890c7134909ded876fAmith Yamasani mShowBackground = savedInstanceState.getBoolean(EXTRA_SHOW_BACKGROUND, false); 841728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 8427a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 8437a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani mDefaultListType = defaultListType; 8443b7dbcecf70788df4950340cbf750dbe524dca96Amith Yamasani 84544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey final Intent containerIntent = new Intent().setComponent( 84644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey StorageMeasurement.DEFAULT_CONTAINER_COMPONENT); 84744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE); 8481337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 849f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value); 850f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mComputingSizeStr = getActivity().getText(R.string.computing_size); 851f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 852a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn TabInfo tab = new TabInfo(this, mApplicationsState, 853309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_third_party), 854309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_DOWNLOADED, this, savedInstanceState); 855309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 856f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 857309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (!Environment.isExternalStorageEmulated()) { 858a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 859309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_onsdcard), 860309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_SDCARD, this, savedInstanceState); 861309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 862508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 8637a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 864a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 865309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_running), 866309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_RUNNING, this, savedInstanceState); 867309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 8687a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 869a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 870309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_all), 871309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_ALL, this, savedInstanceState); 872309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 873309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 8747a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 8757a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 876309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 877309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 878309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // initialize the inflater 879309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInflater = inflater; 8807a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 881309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn View rootView = mInflater.inflate(R.layout.manage_applications_content, 882309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn container, false); 883309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContentContainer = container; 884309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRootView = rootView; 8857a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 886309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager = (ViewPager) rootView.findViewById(R.id.pager); 887309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn MyPagerAdapter adapter = new MyPagerAdapter(); 888309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager.setAdapter(adapter); 889309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager.setOnPageChangeListener(adapter); 890309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs); 891309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn tabs.setTabIndicatorColorResource(android.R.color.holo_blue_light); 8927a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 893a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // We have to do this now because PreferenceFrameLayout looks at it 894a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // only when the view is added. 895a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (container instanceof PreferenceFrameLayout) { 896a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true; 897a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 898a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 89914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) { 90014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn buildResetDialog(); 90114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 90214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 903309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return rootView; 904afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 905f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 906f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu @Override 907728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public void onStart() { 908728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onStart(); 909b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu } 910b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 911afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 912f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onResume() { 913728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onResume(); 914728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = true; 915309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateCurrentTab(mViewPager.getCurrentItem()); 916ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 917afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 918b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 919728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 920f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onSaveInstanceState(Bundle outState) { 921728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onSaveInstanceState(outState); 92202c22131e93e1a506141b1890c7134909ded876fAmith Yamasani outState.putInt(EXTRA_SORT_ORDER, mSortOrder); 92302c22131e93e1a506141b1890c7134909ded876fAmith Yamasani outState.putInt(EXTRA_FILTER_APPS, mFilterApps); 9247a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani if (mDefaultListType != -1) { 9257a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani outState.putInt(EXTRA_DEFAULT_LIST_TYPE, mDefaultListType); 926f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 92702c22131e93e1a506141b1890c7134909ded876fAmith Yamasani outState.putBoolean(EXTRA_SHOW_BACKGROUND, mShowBackground); 92814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog != null) { 92914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn outState.putBoolean(EXTRA_RESET_DIALOG, true); 93014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 931728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 932728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 933728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 934f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onPause() { 935728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onPause(); 936728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = false; 937309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 938309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.get(i).pause(); 939728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 940728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 941728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 942728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 94314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onStop() { 94414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn super.onStop(); 94514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog != null) { 94614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog.dismiss(); 94714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = null; 94814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 94914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 95014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 95114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 952a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void onDestroyView() { 953a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn super.onDestroyView(); 954a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 955a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // We are going to keep the tab data structures around, but they 956a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // are no longer attached to their view hierarchy. 957a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 958a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTabs.get(i).detachView(); 959a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 960a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 961a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 962a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn @Override 963f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 964728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) { 965e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsState.requestSize(mCurrentPkgName); 966ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 967afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 9687a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 969309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tabForType(int type) { 970309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i = 0; i < mTabs.size(); i++) { 971309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(i); 972309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (tab.mListType == type) { 973309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return tab; 974309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 9757a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 976309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return null; 9777a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 9787a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 979afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // utility method used to start sub activity 980afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void startApplicationDetailsActivity() { 981f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // start new fragment to display extended information 982f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Bundle args = new Bundle(); 983f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mCurrentPkgName); 984f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 985f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn PreferenceActivity pa = (PreferenceActivity)getActivity(); 986ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn pa.startPreferencePanel(InstalledAppDetails.class.getName(), args, 987ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn R.string.application_info_label, null, this, INSTALLED_APP_DETAILS); 988afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 989afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 990afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 991f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 992ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn Log.i(TAG, "onCreateOptionsMenu in " + this + ": " + menu); 993ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu = menu; 9940385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn // note: icons removed for now because the cause the new action 9950385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn // bar UI to be very confusing. 996afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha) 9970385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn //.setIcon(android.R.drawable.ic_menu_sort_alphabetically) 998348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 999afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size) 10000385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn //.setIcon(android.R.drawable.ic_menu_sort_by_size) 1001348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1002ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services) 1003ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 1004ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes) 1005ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 100614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn menu.add(0, RESET_APP_PREFERENCES, 4, R.string.reset_app_preferences) 100714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1008ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1009afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1010afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1011afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1012f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 1013ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1014ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 1015ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 1016ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn @Override 1017ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onDestroyOptionsMenu() { 1018ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu = null; 1019ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 102044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 102144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 102244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onDestroy() { 102344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey getActivity().unbindService(mContainerConnection); 102444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey super.onDestroy(); 102544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 102644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 1027ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn void updateOptionsMenu() { 1028ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (mOptionsMenu == null) { 1029ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return; 1030ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 1031ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 1032673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root /* 1033673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root * The running processes screen doesn't use the mApplicationsAdapter 1034673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root * so bringing up this menu in that case doesn't make any sense. 1035673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root */ 1036309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mListType == LIST_TYPE_RUNNING) { 1037309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = tabForType(LIST_TYPE_RUNNING); 1038309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn boolean showingBackground = tab != null && tab.mRunningProcessesView != null 1039309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ? tab.mRunningProcessesView.mAdapter.getShowBackground() : false; 1040ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false); 1041ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false); 1042ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground); 1043ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground); 104414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false); 10451337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else { 1046ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA); 1047ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE); 1048ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false); 1049ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false); 105014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(true); 105114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 105214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 105314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 105414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn void buildResetDialog() { 105514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == null) { 105614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 105714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setTitle(R.string.reset_app_preferences_title); 105814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setMessage(R.string.reset_app_preferences_desc); 105914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setPositiveButton(R.string.reset_app_preferences_button, this); 106014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setNegativeButton(R.string.cancel, null); 106114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = builder.show(); 106214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog.setOnDismissListener(this); 106314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 106414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 106514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 106614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 106714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onDismiss(DialogInterface dialog) { 106814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == dialog) { 106914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = null; 107014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 107114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 107214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 107314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 107414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 107514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onClick(DialogInterface dialog, int which) { 107614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == dialog) { 107714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final PackageManager pm = getActivity().getPackageManager(); 107814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final INotificationManager nm = INotificationManager.Stub.asInterface( 107914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 108014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final NetworkPolicyManager npm = NetworkPolicyManager.from(getActivity()); 108114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final Handler handler = new Handler(getActivity().getMainLooper()); 108214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn (new AsyncTask<Void, Void, Void>() { 108314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override protected Void doInBackground(Void... params) { 108414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn List<ApplicationInfo> apps = pm.getInstalledApplications( 108514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.GET_DISABLED_COMPONENTS); 108614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn for (int i=0; i<apps.size(); i++) { 108714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ApplicationInfo app = apps.get(i); 108814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn try { 108914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName); 109014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn nm.setNotificationsEnabledForPackage(app.packageName, true); 109114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } catch (android.os.RemoteException ex) { 109214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 109314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Clearing preferred: " + app.packageName); 109414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn pm.clearPackagePreferredActivities(app.packageName); 109514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (!app.enabled) { 109614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName); 109714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (pm.getApplicationEnabledSetting(app.packageName) 109814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) { 109914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn pm.setApplicationEnabledSetting(app.packageName, 110014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 110114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.DONT_KILL_APP); 110214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 110314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 110414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 110514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn // We should have cleared all of the preferred apps above; 110614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn // just in case some may be lingering, retrieve whatever is 110714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn // still set and remove it. 110814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ArrayList<IntentFilter> filters = new ArrayList<IntentFilter>(); 110914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ArrayList<ComponentName> prefActivities = new ArrayList<ComponentName>(); 111014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn pm.getPreferredActivities(filters, prefActivities, null); 111114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn for (int i=0; i<prefActivities.size(); i++) { 111214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Clearing preferred: " 111314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn + prefActivities.get(i).getPackageName()); 111414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn pm.clearPackagePreferredActivities(prefActivities.get(i).getPackageName()); 111514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 111614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final int[] restrictedAppIds = npm.getAppsWithPolicy( 111714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn POLICY_REJECT_METERED_BACKGROUND); 111814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn for (int i : restrictedAppIds) { 111914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Clearing data policy: " + i); 112014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn npm.setAppPolicy(i, POLICY_NONE); 112114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 112214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn handler.post(new Runnable() { 112314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override public void run() { 112414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Done clearing"); 112514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (getActivity() != null && mActivityResumed) { 112614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Updating UI!"); 1127309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1128309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(i); 1129309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (tab.mApplications != null) { 1130309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn tab.mApplications.pause(); 1131309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 1132309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 1133309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null) { 1134309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.resume(mSortOrder); 1135309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 113614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 113714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 113814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn }); 113914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn return null; 114014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 114114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn }).execute(); 1142673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root } 1143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 1147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int menuId = item.getItemId(); 1148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) { 1149e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mSortOrder = menuId; 1150309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mApplications != null) { 1151309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mApplications.rebuild(mSortOrder); 11521337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 11531337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (menuId == SHOW_RUNNING_SERVICES) { 11540385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mShowBackground = false; 1155309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mRunningProcessesView != null) { 1156309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mRunningProcessesView.mAdapter.setShowBackground(false); 1157309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 11581337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (menuId == SHOW_BACKGROUND_PROCESSES) { 11590385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mShowBackground = true; 1160309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mRunningProcessesView != null) { 1161309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mRunningProcessesView.mAdapter.setShowBackground(true); 1162309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 116314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } else if (menuId == RESET_APP_PREFERENCES) { 116414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn buildResetDialog(); 1165f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani } else { 1166f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani // Handle the home button 1167f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani return false; 1168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1169ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 1171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1172d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn 1173a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void onItemClick(TabInfo tab, AdapterView<?> parent, View view, int position, 1174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long id) { 1175a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (tab.mApplications != null && tab.mApplications.getCount() > position) { 1176a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ApplicationsState.AppEntry entry = tab.mApplications.getAppEntry(position); 1177309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurrentPkgName = entry.info.packageName; 1178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn startApplicationDetailsActivity(); 11791337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 1180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 11811337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 1182309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void updateCurrentTab(int position) { 1183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(position); 1184309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab = tab; 118544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 1186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Put things in the correct paused/resumed state. 1187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mActivityResumed) { 1188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.build(mInflater, mContentContainer, mRootView); 1189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.resume(mSortOrder); 11901337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else { 1191309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.pause(); 11921337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 1193309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1194309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo t = mTabs.get(i); 1195309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (t != mCurTab) { 1196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn t.pause(); 11971337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 11981337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 11991337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 1200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.updateStorageUsage(); 1201309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateOptionsMenu(); 1202a31be80ef056add00e0d239414f80f932978277fAdam Powell final Activity host = getActivity(); 1203a31be80ef056add00e0d239414f80f932978277fAdam Powell if (host != null) { 1204a31be80ef056add00e0d239414f80f932978277fAdam Powell host.invalidateOptionsMenu(); 1205a31be80ef056add00e0d239414f80f932978277fAdam Powell } 1206e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 1207e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 120844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey private volatile IMediaContainerService mContainerService; 120944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 121044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey private final ServiceConnection mContainerConnection = new ServiceConnection() { 121144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 121244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onServiceConnected(ComponentName name, IBinder service) { 121344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey mContainerService = IMediaContainerService.Stub.asInterface(service); 1214a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1215a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTabs.get(i).setContainerService(mContainerService); 1216309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 121744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 121844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 121944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 122044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onServiceDisconnected(ComponentName name) { 122144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey mContainerService = null; 122244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 122344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey }; 1224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 1225