ManageApplications.java revision 38305fb1777147cbcb86774c466e88434daff141
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; 2338305fb1777147cbcb86774c466e88434daff141Jeff Sharkeyimport android.app.ActivityManager; 2414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.AlertDialog; 25f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment; 2614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.INotificationManager; 2744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ComponentName; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 2914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.DialogInterface; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 3114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.IntentFilter; 3244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ServiceConnection; 3319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport android.content.pm.ApplicationInfo; 346dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.IPackageManager; 356dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.PackageInfo; 3614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.pm.PackageManager; 3714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.net.NetworkPolicyManager; 3814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.AsyncTask; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 401337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.os.Environment; 4114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.Handler; 4244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.os.IBinder; 436dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.RemoteException; 446dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.ServiceManager; 4538305fb1777147cbcb86774c466e88434daff141Jeff Sharkeyimport android.os.UserHandle; 46f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.preference.PreferenceActivity; 47a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackbornimport android.preference.PreferenceFrameLayout; 48728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.provider.Settings; 49309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerAdapter; 50309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerTabStrip; 51309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.ViewPager; 521337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.text.format.Formatter; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu; 56f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.MenuInflater; 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem; 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup; 60ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackbornimport android.view.animation.AnimationUtils; 61e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView; 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView; 63a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.widget.AdapterView.OnItemClickListener; 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter; 65c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filter; 66c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filterable; 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView; 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 69b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 7044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.internal.app.IMediaContainerService; 71b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.internal.content.PackageHelper; 72b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.R; 73b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.RunningServicesActivity; 74b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.StorageUseActivity; 75b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.applications.ApplicationsState.AppEntry; 7644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.settings.deviceinfo.StorageMeasurement; 77309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport com.android.settings.Utils; 78b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Comparator; 8114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport java.util.List; 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 836dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornfinal class CanBeOnSdCardChecker { 846dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn final IPackageManager mPm; 856dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn int mInstallLocation; 866dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 876dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn CanBeOnSdCardChecker() { 886dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mPm = IPackageManager.Stub.asInterface( 896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn ServiceManager.getService("package")); 906dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 916dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 926dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn void init() { 936dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn try { 946dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mInstallLocation = mPm.getInstallLocation(); 956dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } catch (RemoteException e) { 966dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn Log.e("CanBeOnSdCardChecker", "Is Package Manager running?"); 976dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn return; 986dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 996dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1006dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 1016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn boolean check(ApplicationInfo info) { 1026dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn boolean canBe = false; 1036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { 1046dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn canBe = true; 1056dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } else { 1063c24cfed8d5116ff21986acb60a918cb079a0efdKenny Root if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { 1076dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if (info.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL || 1086dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn info.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) { 1096dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn canBe = true; 1106dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } else if (info.installLocation 1116dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) { 1126dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if (mInstallLocation == PackageHelper.APP_INSTALL_EXTERNAL) { 1136dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn // For apps with no preference and the default value set 1146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn // to install on sdcard. 1156dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn canBe = true; 1166dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1176dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1186dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1196dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1206dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn return canBe; 1216dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1226dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn} 1236dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 124a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborninterface AppClickListener { 125a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn void onItemClick(ManageApplications.TabInfo tab, AdapterView<?> parent, 126a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn View view, int position, long id); 127a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn} 128a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to pick an application that will be used to display installation information and 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * options to uninstall/delete user data for system applications. This activity 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * intent. 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 135f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class ManageApplications extends Fragment implements 136a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn AppClickListener, DialogInterface.OnClickListener, 13714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn DialogInterface.OnDismissListener { 13802c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 139e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final String TAG = "ManageApplications"; 140e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final boolean DEBUG = false; 14102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 14202c22131e93e1a506141b1890c7134909ded876fAmith Yamasani private static final String EXTRA_SORT_ORDER = "sortOrder"; 14302c22131e93e1a506141b1890c7134909ded876fAmith Yamasani private static final String EXTRA_SHOW_BACKGROUND = "showBackground"; 1447a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani private static final String EXTRA_DEFAULT_LIST_TYPE = "defaultListType"; 14514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn private static final String EXTRA_RESET_DIALOG = "resetDialog"; 14602c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // attributes used as keys when passing values to InstalledAppDetails activity 14838b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu public static final String APP_CHG = "chg"; 14902c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // constant value that can be used to check return code from sub activity. 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int INSTALLED_APP_DETAILS = 1; 152d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn 153bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_TOTAL = 0; 154bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_INTERNAL = 1; 155bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_EXTERNAL = 2; 156bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // sort order that can be changed through the menu can be sorted alphabetically 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // or size(descending) 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int MENU_OPTIONS_BASE = 0; 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Filter options used for displayed list of applications 1616cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0; 162728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1; 163728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2; 164747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu 1656cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4; 1666cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5; 1671337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6; 1681337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7; 16914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 8; 170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // sort order 171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private int mSortOrder = SORT_ORDER_ALPHA; 172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 173e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ApplicationsState mApplicationsState; 174309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 175309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public static class TabInfo implements OnItemClickListener { 176309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final ManageApplications mOwner; 177309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final ApplicationsState mApplicationsState; 178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mLabel; 179309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final int mListType; 180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final int mFilter; 181a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public final AppClickListener mClickListener; 182309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mInvalidSizeStr; 183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mComputingSizeStr; 184309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final Bundle mSavedInstanceState; 185309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public ApplicationsAdapter mApplications; 187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public LayoutInflater mInflater; 188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View mRootView; 189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 190a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn private IMediaContainerService mContainerService; 191a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 192309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mLoadingContainer; 193309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 194309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mListContainer; 195309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // ListView used to display list 197309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ListView mListView; 198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Custom view used to display running processes 199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private RunningProcessesView mRunningProcessesView; 200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 201309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private LinearColorBar mColorBar; 202309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private TextView mStorageChartLabel; 203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private TextView mUsedStorageText; 204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private TextView mFreeStorageText; 205a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn private long mFreeStorage = 0, mAppStorage = 0, mTotalStorage = 0; 206309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage; 207309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 208309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final Runnable mRunningProcessesAvail = new Runnable() { 209309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void run() { 210309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn handleRunningProcessesAvail(); 211309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 212309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn }; 213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 214309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public TabInfo(ManageApplications owner, ApplicationsState apps, 215a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn CharSequence label, int listType, AppClickListener clickListener, 216309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Bundle savedInstanceState) { 217309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner = owner; 218309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplicationsState = apps; 219309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLabel = label; 220309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListType = listType; 221309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn switch (listType) { 222309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn case LIST_TYPE_DOWNLOADED: mFilter = FILTER_APPS_THIRD_PARTY; break; 223309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn case LIST_TYPE_SDCARD: mFilter = FILTER_APPS_SDCARD; break; 224309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn default: mFilter = FILTER_APPS_ALL; break; 225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mClickListener = clickListener; 227309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInvalidSizeStr = owner.getActivity().getText(R.string.invalid_size_value); 228309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mComputingSizeStr = owner.getActivity().getText(R.string.computing_size); 229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSavedInstanceState = savedInstanceState; 230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 232a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void setContainerService(IMediaContainerService containerService) { 233a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mContainerService = containerService; 234a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn updateStorageUsage(); 235a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 236a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 237309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View build(LayoutInflater inflater, ViewGroup contentParent, View contentChild) { 238309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRootView != null) { 239309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mRootView; 240309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 241309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 242309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInflater = inflater; 243309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRootView = inflater.inflate(mListType == LIST_TYPE_RUNNING 244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ? R.layout.manage_applications_running 245309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn : R.layout.manage_applications_apps, null); 246309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer = mRootView.findViewById(R.id.loading_container); 247309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.VISIBLE); 248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListContainer = mRootView.findViewById(R.id.list_container); 249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mListContainer != null) { 250309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Create adapter and list view here 251309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty); 252309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ListView lv = (ListView) mListContainer.findViewById(android.R.id.list); 253309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (emptyView != null) { 254309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setEmptyView(emptyView); 255309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 256309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setOnItemClickListener(this); 257309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setSaveEnabled(true); 258309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setItemsCanFocus(true); 259309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setTextFilterEnabled(true); 260309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListView = lv; 261309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplications = new ApplicationsAdapter(mApplicationsState, this, mFilter); 262309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListView.setAdapter(mApplications); 263309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListView.setRecyclerListener(mApplications); 264309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar); 265309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel); 266309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText); 267309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText); 268309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false); 269a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mFilter == FILTER_APPS_SDCARD) { 270a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mStorageChartLabel.setText(mOwner.getActivity().getText( 271a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn R.string.sd_card_storage)); 272a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } else { 273a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mStorageChartLabel.setText(mOwner.getActivity().getText( 274a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn R.string.internal_storage)); 275a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 276a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn applyCurrentStorage(); 277309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 278309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView = (RunningProcessesView)mRootView.findViewById( 279309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn R.id.running_processes); 280309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRunningProcessesView != null) { 281309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.doCreate(mSavedInstanceState); 282309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 283309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 284309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mRootView; 285309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 286309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 287a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void detachView() { 288a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mRootView != null) { 289a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ViewGroup group = (ViewGroup)mRootView.getParent(); 290a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (group != null) { 291a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn group.removeView(mRootView); 292a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 293a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 294a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 295a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 296309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void resume(int sortOrder) { 297309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 298309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplications.resume(sortOrder); 299309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 300309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRunningProcessesView != null) { 301309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn boolean haveData = mRunningProcessesView.doResume(mOwner, mRunningProcessesAvail); 302309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (haveData) { 303309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.setVisibility(View.VISIBLE); 304309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.INVISIBLE); 305309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } else { 306309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.VISIBLE); 307309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 308309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 309309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 310309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 311309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void pause() { 312309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 313309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplications.pause(); 314309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 315309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRunningProcessesView != null) { 316309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.doPause(); 317309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 318309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 319309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 320309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn void updateStorageUsage() { 321309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Make sure a callback didn't come at an inopportune time. 322309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mOwner.getActivity() == null) return; 323309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Doesn't make sense for stuff that is not an app list. 324309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications == null) return; 325309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 326a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = 0; 327a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage = 0; 328a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = 0; 329309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 330309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mFilter == FILTER_APPS_SDCARD) { 331309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mContainerService != null) { 332309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn try { 333309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final long[] stats = mContainerService.getFileSystemStats( 334309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Environment.getExternalStorageDirectory().getPath()); 335a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = stats[0]; 336a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = stats[1]; 337309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } catch (RemoteException e) { 338309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Log.w(TAG, "Problem in container service", e); 339309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 340309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 341309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 342309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 343309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final int N = mApplications.getCount(); 344309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<N; i++) { 345309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ApplicationsState.AppEntry ae = mApplications.getAppEntry(i); 3461f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mAppStorage += ae.externalCodeSize + ae.externalDataSize 3471f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn + ae.externalCacheSize; 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; 8287a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_ALL; 829762eaa77e3e12d5337ddc9cb87b473c47af5524aKenny Root } else if (Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)) { 8307a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani // Select the all-apps list, with the default sorting 8317a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_ALL; 832afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8337a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 834728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (savedInstanceState != null) { 83502c22131e93e1a506141b1890c7134909ded876fAmith Yamasani mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder); 8367a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani int tmp = savedInstanceState.getInt(EXTRA_DEFAULT_LIST_TYPE, -1); 8377a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani if (tmp != -1) defaultListType = tmp; 83802c22131e93e1a506141b1890c7134909ded876fAmith Yamasani mShowBackground = savedInstanceState.getBoolean(EXTRA_SHOW_BACKGROUND, false); 839728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 8407a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 8417a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani mDefaultListType = defaultListType; 8423b7dbcecf70788df4950340cbf750dbe524dca96Amith Yamasani 84344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey final Intent containerIntent = new Intent().setComponent( 84444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey StorageMeasurement.DEFAULT_CONTAINER_COMPONENT); 84544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE); 8461337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 847f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value); 848f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mComputingSizeStr = getActivity().getText(R.string.computing_size); 849f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 850a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn TabInfo tab = new TabInfo(this, mApplicationsState, 851309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_third_party), 852309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_DOWNLOADED, this, savedInstanceState); 853309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 854f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 855309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (!Environment.isExternalStorageEmulated()) { 856a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 857309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_onsdcard), 858309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_SDCARD, this, savedInstanceState); 859309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 860508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 8617a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 862a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 863309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_running), 864309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_RUNNING, this, savedInstanceState); 865309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 8667a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 867a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 868309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_all), 869309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_ALL, this, savedInstanceState); 870309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 871309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 8727a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 8737a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 874309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 875309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 876309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // initialize the inflater 877309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInflater = inflater; 8787a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 879309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn View rootView = mInflater.inflate(R.layout.manage_applications_content, 880309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn container, false); 881309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContentContainer = container; 882309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRootView = rootView; 8837a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 884309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager = (ViewPager) rootView.findViewById(R.id.pager); 885309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn MyPagerAdapter adapter = new MyPagerAdapter(); 886309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager.setAdapter(adapter); 887309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager.setOnPageChangeListener(adapter); 888309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs); 889309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn tabs.setTabIndicatorColorResource(android.R.color.holo_blue_light); 8907a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 891a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // We have to do this now because PreferenceFrameLayout looks at it 892a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // only when the view is added. 893a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (container instanceof PreferenceFrameLayout) { 894a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true; 895a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 896a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 89714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) { 89814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn buildResetDialog(); 89914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 90014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 90113ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn if (savedInstanceState == null) { 90213ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn // First time init: make sure view pager is showing the correct tab. 90313ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn for (int i = 0; i < mTabs.size(); i++) { 90413ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn TabInfo tab = mTabs.get(i); 90513ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn if (tab.mListType == mDefaultListType) { 90613ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn mViewPager.setCurrentItem(i); 90713ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn break; 90813ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn } 90913ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn } 91013ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn } 91113ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn 912309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return rootView; 913afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 914f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 915f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu @Override 916728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public void onStart() { 917728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onStart(); 918b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu } 919b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 920afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 921f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onResume() { 922728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onResume(); 923728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = true; 924309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateCurrentTab(mViewPager.getCurrentItem()); 925ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 926afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 927b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 928728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 929f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onSaveInstanceState(Bundle outState) { 930728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onSaveInstanceState(outState); 93102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani outState.putInt(EXTRA_SORT_ORDER, mSortOrder); 9327a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani if (mDefaultListType != -1) { 9337a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani outState.putInt(EXTRA_DEFAULT_LIST_TYPE, mDefaultListType); 934f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 93502c22131e93e1a506141b1890c7134909ded876fAmith Yamasani outState.putBoolean(EXTRA_SHOW_BACKGROUND, mShowBackground); 93614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog != null) { 93714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn outState.putBoolean(EXTRA_RESET_DIALOG, true); 93814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 939728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 940728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 941728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 942f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onPause() { 943728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onPause(); 944728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = false; 945309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 946309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.get(i).pause(); 947728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 948728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 949728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 950728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 95114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onStop() { 95214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn super.onStop(); 95314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog != null) { 95414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog.dismiss(); 95514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = null; 95614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 95714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 95814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 95914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 960a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void onDestroyView() { 961a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn super.onDestroyView(); 962a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 963a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // We are going to keep the tab data structures around, but they 964a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // are no longer attached to their view hierarchy. 965a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 966a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTabs.get(i).detachView(); 967a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 968a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 969a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 970a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn @Override 971f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 972728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) { 973e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsState.requestSize(mCurrentPkgName); 974ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 975afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 9767a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 977309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tabForType(int type) { 978309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i = 0; i < mTabs.size(); i++) { 979309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(i); 980309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (tab.mListType == type) { 981309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return tab; 982309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 9837a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 984309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return null; 9857a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 9867a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 987afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // utility method used to start sub activity 988afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void startApplicationDetailsActivity() { 989f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // start new fragment to display extended information 990f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Bundle args = new Bundle(); 991f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mCurrentPkgName); 992f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 993f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn PreferenceActivity pa = (PreferenceActivity)getActivity(); 994ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn pa.startPreferencePanel(InstalledAppDetails.class.getName(), args, 995ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn R.string.application_info_label, null, this, INSTALLED_APP_DETAILS); 996afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 997afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 998afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 999f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1000ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn Log.i(TAG, "onCreateOptionsMenu in " + this + ": " + menu); 1001ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu = menu; 10020385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn // note: icons removed for now because the cause the new action 10030385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn // bar UI to be very confusing. 1004afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha) 10050385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn //.setIcon(android.R.drawable.ic_menu_sort_alphabetically) 1006348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1007afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size) 10080385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn //.setIcon(android.R.drawable.ic_menu_sort_by_size) 1009348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1010ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services) 1011ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 1012ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes) 1013ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 101414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn menu.add(0, RESET_APP_PREFERENCES, 4, R.string.reset_app_preferences) 101514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1016ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1017afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1018afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1019afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1020f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 1021ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1022ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 1023ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 1024ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn @Override 1025ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onDestroyOptionsMenu() { 1026ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu = null; 1027ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 102844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 102944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 103044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onDestroy() { 103144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey getActivity().unbindService(mContainerConnection); 103244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey super.onDestroy(); 103344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 103444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 1035ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn void updateOptionsMenu() { 1036ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (mOptionsMenu == null) { 1037ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return; 1038ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 1039ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 1040673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root /* 1041673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root * The running processes screen doesn't use the mApplicationsAdapter 1042673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root * so bringing up this menu in that case doesn't make any sense. 1043673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root */ 1044309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mListType == LIST_TYPE_RUNNING) { 1045309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = tabForType(LIST_TYPE_RUNNING); 1046309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn boolean showingBackground = tab != null && tab.mRunningProcessesView != null 1047309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ? tab.mRunningProcessesView.mAdapter.getShowBackground() : false; 1048ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false); 1049ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false); 1050ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground); 1051ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground); 105214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false); 10531337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else { 1054ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA); 1055ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE); 1056ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false); 1057ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false); 105814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(true); 105914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 106014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 106114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 106214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn void buildResetDialog() { 106314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == null) { 106414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 106514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setTitle(R.string.reset_app_preferences_title); 106614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setMessage(R.string.reset_app_preferences_desc); 106714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setPositiveButton(R.string.reset_app_preferences_button, this); 106814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setNegativeButton(R.string.cancel, null); 106914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = builder.show(); 107014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog.setOnDismissListener(this); 107114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 107214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 107314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 107414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 107514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onDismiss(DialogInterface dialog) { 107614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == dialog) { 107714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = null; 107814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 107914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 108014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 108114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 108214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 108314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onClick(DialogInterface dialog, int which) { 108414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == dialog) { 108514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final PackageManager pm = getActivity().getPackageManager(); 108614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final INotificationManager nm = INotificationManager.Stub.asInterface( 108714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 108814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final NetworkPolicyManager npm = NetworkPolicyManager.from(getActivity()); 108914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final Handler handler = new Handler(getActivity().getMainLooper()); 109014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn (new AsyncTask<Void, Void, Void>() { 109114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override protected Void doInBackground(Void... params) { 109214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn List<ApplicationInfo> apps = pm.getInstalledApplications( 109314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.GET_DISABLED_COMPONENTS); 109414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn for (int i=0; i<apps.size(); i++) { 109514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ApplicationInfo app = apps.get(i); 109614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn try { 109714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName); 109814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn nm.setNotificationsEnabledForPackage(app.packageName, true); 109914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } catch (android.os.RemoteException ex) { 110014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 110114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Clearing preferred: " + app.packageName); 110214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn pm.clearPackagePreferredActivities(app.packageName); 110314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (!app.enabled) { 110414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName); 110514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (pm.getApplicationEnabledSetting(app.packageName) 110614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) { 110714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn pm.setApplicationEnabledSetting(app.packageName, 110814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 110914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.DONT_KILL_APP); 111014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 111114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 111214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 111314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn // We should have cleared all of the preferred apps above; 111414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn // just in case some may be lingering, retrieve whatever is 111514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn // still set and remove it. 111614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ArrayList<IntentFilter> filters = new ArrayList<IntentFilter>(); 111714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ArrayList<ComponentName> prefActivities = new ArrayList<ComponentName>(); 111814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn pm.getPreferredActivities(filters, prefActivities, null); 111914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn for (int i=0; i<prefActivities.size(); i++) { 112014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Clearing preferred: " 112114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn + prefActivities.get(i).getPackageName()); 112214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn pm.clearPackagePreferredActivities(prefActivities.get(i).getPackageName()); 112314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 112438305fb1777147cbcb86774c466e88434daff141Jeff Sharkey final int[] restrictedUids = npm.getUidsWithPolicy( 112514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn POLICY_REJECT_METERED_BACKGROUND); 112638305fb1777147cbcb86774c466e88434daff141Jeff Sharkey final int currentUserId = ActivityManager.getCurrentUser(); 112738305fb1777147cbcb86774c466e88434daff141Jeff Sharkey for (int uid : restrictedUids) { 112838305fb1777147cbcb86774c466e88434daff141Jeff Sharkey // Only reset for current user 112938305fb1777147cbcb86774c466e88434daff141Jeff Sharkey if (UserHandle.getUserId(uid) == currentUserId) { 113038305fb1777147cbcb86774c466e88434daff141Jeff Sharkey if (DEBUG) Log.v(TAG, "Clearing data policy: " + uid); 113138305fb1777147cbcb86774c466e88434daff141Jeff Sharkey npm.setUidPolicy(uid, POLICY_NONE); 113238305fb1777147cbcb86774c466e88434daff141Jeff Sharkey } 113314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 113414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn handler.post(new Runnable() { 113514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override public void run() { 113614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Done clearing"); 113714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (getActivity() != null && mActivityResumed) { 113814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Updating UI!"); 1139309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1140309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(i); 1141309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (tab.mApplications != null) { 1142309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn tab.mApplications.pause(); 1143309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 1144309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 1145309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null) { 1146309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.resume(mSortOrder); 1147309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 114814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 114914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 115014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn }); 115114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn return null; 115214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 115314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn }).execute(); 1154673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root } 1155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 1159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int menuId = item.getItemId(); 1160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) { 1161e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mSortOrder = menuId; 1162309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mApplications != null) { 1163309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mApplications.rebuild(mSortOrder); 11641337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 11651337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (menuId == SHOW_RUNNING_SERVICES) { 11660385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mShowBackground = false; 1167309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mRunningProcessesView != null) { 1168309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mRunningProcessesView.mAdapter.setShowBackground(false); 1169309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 11701337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (menuId == SHOW_BACKGROUND_PROCESSES) { 11710385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mShowBackground = true; 1172309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mRunningProcessesView != null) { 1173309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mRunningProcessesView.mAdapter.setShowBackground(true); 1174309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 117514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } else if (menuId == RESET_APP_PREFERENCES) { 117614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn buildResetDialog(); 1177f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani } else { 1178f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani // Handle the home button 1179f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani return false; 1180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1181ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 1183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1184d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn 1185a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void onItemClick(TabInfo tab, AdapterView<?> parent, View view, int position, 1186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long id) { 1187a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (tab.mApplications != null && tab.mApplications.getCount() > position) { 1188a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ApplicationsState.AppEntry entry = tab.mApplications.getAppEntry(position); 1189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurrentPkgName = entry.info.packageName; 1190309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn startApplicationDetailsActivity(); 11911337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 1192309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 11931337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 1194309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void updateCurrentTab(int position) { 1195309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(position); 1196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab = tab; 119744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 1198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Put things in the correct paused/resumed state. 1199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mActivityResumed) { 1200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.build(mInflater, mContentContainer, mRootView); 1201309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.resume(mSortOrder); 12021337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else { 1203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.pause(); 12041337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 1205309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1206309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo t = mTabs.get(i); 1207309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (t != mCurTab) { 1208309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn t.pause(); 12091337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 12101337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 12111337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 1212309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.updateStorageUsage(); 1213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateOptionsMenu(); 1214a31be80ef056add00e0d239414f80f932978277fAdam Powell final Activity host = getActivity(); 1215a31be80ef056add00e0d239414f80f932978277fAdam Powell if (host != null) { 1216a31be80ef056add00e0d239414f80f932978277fAdam Powell host.invalidateOptionsMenu(); 1217a31be80ef056add00e0d239414f80f932978277fAdam Powell } 1218e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 1219e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 122044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey private volatile IMediaContainerService mContainerService; 122144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 122244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey private final ServiceConnection mContainerConnection = new ServiceConnection() { 122344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 122444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onServiceConnected(ComponentName name, IBinder service) { 122544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey mContainerService = IMediaContainerService.Stub.asInterface(service); 1226a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1227a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTabs.get(i).setContainerService(mContainerService); 1228309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 122944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 123044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 123144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 123244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onServiceDisconnected(ComponentName name) { 123344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey mContainerService = null; 123444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 123544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey }; 1236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 1237