ManageApplications.java revision cc22af08117a2f90d879cc360f76de48fd234e0d
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; 25a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackbornimport android.app.AppOpsManager; 26f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment; 2714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.INotificationManager; 2844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ComponentName; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 3014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.DialogInterface; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 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; 46a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackbornimport android.preference.PreferenceFrameLayout; 47309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerAdapter; 48309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerTabStrip; 49309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.ViewPager; 5037f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglioimport android.text.BidiFormatter; 511337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.text.format.Formatter; 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater; 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu; 55f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.MenuInflater; 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem; 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup; 59ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackbornimport android.view.animation.AnimationUtils; 60e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView; 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView; 62a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.widget.AdapterView.OnItemClickListener; 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter; 64c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filter; 65c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filterable; 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView; 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 68b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 6944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.internal.app.IMediaContainerService; 70b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.internal.content.PackageHelper; 71b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.R; 72263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglioimport com.android.settings.SettingsActivity; 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; 16418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn public static final int FILTER_APPS_DISABLED = MENU_OPTIONS_BASE + 3; 165747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu 1666cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4; 1676cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5; 1681337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6; 1691337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7; 17014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 8; 171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // sort order 172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private int mSortOrder = SORT_ORDER_ALPHA; 173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 174e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ApplicationsState mApplicationsState; 175309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 176309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public static class TabInfo implements OnItemClickListener { 177309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final ManageApplications mOwner; 178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final ApplicationsState mApplicationsState; 179309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mLabel; 180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final int mListType; 181309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final int mFilter; 182a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public final AppClickListener mClickListener; 183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mInvalidSizeStr; 184309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mComputingSizeStr; 185309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final Bundle mSavedInstanceState; 186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public ApplicationsAdapter mApplications; 188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public LayoutInflater mInflater; 189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View mRootView; 190309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 191a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn private IMediaContainerService mContainerService; 192a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 193309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mLoadingContainer; 194309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 195309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mListContainer; 196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 197309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // ListView used to display list 198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ListView mListView; 199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Custom view used to display running processes 200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private RunningProcessesView mRunningProcessesView; 201309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 202309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private LinearColorBar mColorBar; 203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private TextView mStorageChartLabel; 204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private TextView mUsedStorageText; 205309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private TextView mFreeStorageText; 206a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn private long mFreeStorage = 0, mAppStorage = 0, mTotalStorage = 0; 207309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage; 208309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 209309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final Runnable mRunningProcessesAvail = new Runnable() { 210309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void run() { 211309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn handleRunningProcessesAvail(); 212309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn }; 214309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 215309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public TabInfo(ManageApplications owner, ApplicationsState apps, 216a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn CharSequence label, int listType, AppClickListener clickListener, 217309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Bundle savedInstanceState) { 218309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner = owner; 219309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplicationsState = apps; 220309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLabel = label; 221309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListType = listType; 222309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn switch (listType) { 223309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn case LIST_TYPE_DOWNLOADED: mFilter = FILTER_APPS_THIRD_PARTY; break; 224309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn case LIST_TYPE_SDCARD: mFilter = FILTER_APPS_SDCARD; break; 22518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn case LIST_TYPE_DISABLED: mFilter = FILTER_APPS_DISABLED; break; 226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn default: mFilter = FILTER_APPS_ALL; break; 227309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 228309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mClickListener = clickListener; 229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInvalidSizeStr = owner.getActivity().getText(R.string.invalid_size_value); 230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mComputingSizeStr = owner.getActivity().getText(R.string.computing_size); 231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSavedInstanceState = savedInstanceState; 232309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 233309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 234a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void setContainerService(IMediaContainerService containerService) { 235a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mContainerService = containerService; 236a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn updateStorageUsage(); 237a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 238a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 239309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View build(LayoutInflater inflater, ViewGroup contentParent, View contentChild) { 240309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRootView != null) { 241309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mRootView; 242309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 243309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInflater = inflater; 245309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRootView = inflater.inflate(mListType == LIST_TYPE_RUNNING 246309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ? R.layout.manage_applications_running 247309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn : R.layout.manage_applications_apps, null); 248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer = mRootView.findViewById(R.id.loading_container); 249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.VISIBLE); 250309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListContainer = mRootView.findViewById(R.id.list_container); 251309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mListContainer != null) { 252309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Create adapter and list view here 253309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty); 254309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ListView lv = (ListView) mListContainer.findViewById(android.R.id.list); 255309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (emptyView != null) { 256309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setEmptyView(emptyView); 257309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 258309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setOnItemClickListener(this); 259309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setSaveEnabled(true); 260309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setItemsCanFocus(true); 261309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setTextFilterEnabled(true); 262309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListView = lv; 263309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplications = new ApplicationsAdapter(mApplicationsState, this, mFilter); 264309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListView.setAdapter(mApplications); 265309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListView.setRecyclerListener(mApplications); 266309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar); 267309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel); 268309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText); 269309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText); 270309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false); 271a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mFilter == FILTER_APPS_SDCARD) { 272a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mStorageChartLabel.setText(mOwner.getActivity().getText( 273a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn R.string.sd_card_storage)); 274a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } else { 275a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mStorageChartLabel.setText(mOwner.getActivity().getText( 276a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn R.string.internal_storage)); 277a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 278a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn applyCurrentStorage(); 279309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 280309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView = (RunningProcessesView)mRootView.findViewById( 281309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn R.id.running_processes); 282309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRunningProcessesView != null) { 283309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.doCreate(mSavedInstanceState); 284309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 285309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 286309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mRootView; 287309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 288309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 289a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void detachView() { 290a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mRootView != null) { 291a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ViewGroup group = (ViewGroup)mRootView.getParent(); 292a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (group != null) { 293a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn group.removeView(mRootView); 294a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 295a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 296a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 297a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 298309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void resume(int sortOrder) { 299309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 300309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplications.resume(sortOrder); 301309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 302309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRunningProcessesView != null) { 303309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn boolean haveData = mRunningProcessesView.doResume(mOwner, mRunningProcessesAvail); 304309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (haveData) { 305309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.setVisibility(View.VISIBLE); 306309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.INVISIBLE); 307309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } else { 308309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.VISIBLE); 309309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 310309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 311309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 312309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 313309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void pause() { 314309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 315309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplications.pause(); 316309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 317309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRunningProcessesView != null) { 318309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.doPause(); 319309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 320309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 321309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 322f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su public void release() { 323f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su if (mApplications != null) { 324f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su mApplications.release(); 325f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su } 326f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su } 327f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su 328309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn void updateStorageUsage() { 329309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Make sure a callback didn't come at an inopportune time. 330309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mOwner.getActivity() == null) return; 331309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Doesn't make sense for stuff that is not an app list. 332309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications == null) return; 333309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 334a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = 0; 335a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage = 0; 336a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = 0; 337309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 338309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mFilter == FILTER_APPS_SDCARD) { 339309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mContainerService != null) { 340309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn try { 341309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final long[] stats = mContainerService.getFileSystemStats( 342309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Environment.getExternalStorageDirectory().getPath()); 343a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = stats[0]; 344a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = stats[1]; 345309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } catch (RemoteException e) { 346309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Log.w(TAG, "Problem in container service", e); 347309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 348309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 349309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 350309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 351309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final int N = mApplications.getCount(); 352309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<N; i++) { 353309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ApplicationsState.AppEntry ae = mApplications.getAppEntry(i); 3541f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mAppStorage += ae.externalCodeSize + ae.externalDataSize 3551f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn + ae.externalCacheSize; 356309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 357309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 358309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } else { 359309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mContainerService != null) { 360309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn try { 361309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final long[] stats = mContainerService.getFileSystemStats( 362309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Environment.getDataDirectory().getPath()); 363a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = stats[0]; 364a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = stats[1]; 365309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } catch (RemoteException e) { 366309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Log.w(TAG, "Problem in container service", e); 367309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 368309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 369309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 370309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final boolean emulatedStorage = Environment.isExternalStorageEmulated(); 371309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 372309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final int N = mApplications.getCount(); 373309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<N; i++) { 374309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ApplicationsState.AppEntry ae = mApplications.getAppEntry(i); 375a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage += ae.codeSize + ae.dataSize; 376309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (emulatedStorage) { 377a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage += ae.externalCodeSize + ae.externalDataSize; 378309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 379309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 380309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 381a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage += mApplicationsState.sumCacheSizes(); 382309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 383a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 384a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn applyCurrentStorage(); 385a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 386a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 387a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn void applyCurrentStorage() { 388a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // If view hierarchy is not yet created, no views to update. 389a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mRootView == null) { 390a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn return; 391309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 392a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mTotalStorage > 0) { 39337f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio BidiFormatter bidiFormatter = BidiFormatter.getInstance(); 394a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mColorBar.setRatios((mTotalStorage-mFreeStorage-mAppStorage)/(float)mTotalStorage, 395a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage/(float)mTotalStorage, mFreeStorage/(float)mTotalStorage); 396a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn long usedStorage = mTotalStorage - mFreeStorage; 397309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mLastUsedStorage != usedStorage) { 398309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLastUsedStorage = usedStorage; 39937f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio String sizeStr = bidiFormatter.unicodeWrap( 40037f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio Formatter.formatShortFileSize(mOwner.getActivity(), usedStorage)); 401309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mUsedStorageText.setText(mOwner.getActivity().getResources().getString( 402309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn R.string.service_foreground_processes, sizeStr)); 403309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 404a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mLastFreeStorage != mFreeStorage) { 405a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mLastFreeStorage = mFreeStorage; 40637f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio String sizeStr = bidiFormatter.unicodeWrap( 40737f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio Formatter.formatShortFileSize(mOwner.getActivity(), mFreeStorage)); 408309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFreeStorageText.setText(mOwner.getActivity().getResources().getString( 409309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn R.string.service_background_processes, sizeStr)); 410309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 411309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } else { 412309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mColorBar.setRatios(0, 0, 0); 413309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mLastUsedStorage != -1) { 414309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLastUsedStorage = -1; 415309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mUsedStorageText.setText(""); 416309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 417309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mLastFreeStorage != -1) { 418309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLastFreeStorage = -1; 419309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFreeStorageText.setText(""); 420309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 421309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 422309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 423309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 424309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 425309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 426a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mClickListener.onItemClick(this, parent, view, position, id); 427309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 428309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 429309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn void handleRunningProcessesAvail() { 430309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.startAnimation(AnimationUtils.loadAnimation( 431309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner.getActivity(), android.R.anim.fade_out)); 432309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation( 433309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner.getActivity(), android.R.anim.fade_in)); 434309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.setVisibility(View.VISIBLE); 435309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.GONE); 436309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 437309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 438309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 43918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn private int mNumTabs; 440309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo mCurTab = null; 441309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Size resource used for packages whose size computation failed for some reason 4439244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn CharSequence mInvalidSizeStr; 444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingSizeStr; 445afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // layout inflater object used to inflate views 447afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private LayoutInflater mInflater; 448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 449de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private String mCurrentPkgName; 450afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 451ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn private Menu mOptionsMenu; 4527a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 4537a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani // These are for keeping track of activity and spinner switch state. 454728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private boolean mActivityResumed; 455728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 4567a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_DOWNLOADED = 0; 4577a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_RUNNING = 1; 4587a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_SDCARD = 2; 4597a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_ALL = 3; 46018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn static final int LIST_TYPE_DISABLED = 4; 461f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 4620385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn private boolean mShowBackground = false; 4630385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn 4647a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani private int mDefaultListType = -1; 465f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 466309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ViewGroup mContentContainer; 467309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mRootView; 468309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ViewPager mViewPager; 469f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 47014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn AlertDialog mResetDialog; 47114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 472309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn class MyPagerAdapter extends PagerAdapter 473309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn implements ViewPager.OnPageChangeListener { 474309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn int mCurPos = 0; 475309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 476309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 477309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public int getCount() { 47818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn return mNumTabs; 479309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 480309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 481309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 482309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public Object instantiateItem(ViewGroup container, int position) { 483309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(position); 484309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn View root = tab.build(mInflater, mContentContainer, mRootView); 485309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn container.addView(root); 48618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn root.setTag(R.id.name, tab); 487309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return root; 488309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 489309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 490309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 491309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void destroyItem(ViewGroup container, int position, Object object) { 492309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn container.removeView((View)object); 493ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn } 494ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn 495309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 496309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public boolean isViewFromObject(View view, Object object) { 497309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return view == object; 498309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 4997a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 500309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 50118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn public int getItemPosition(Object object) { 50218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn return super.getItemPosition(object); 50318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn //return ((TabInfo)((View)object).getTag(R.id.name)).mListType; 50418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn } 50518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn 50618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn @Override 507309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public CharSequence getPageTitle(int position) { 508309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mTabs.get(position).mLabel; 509309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 510309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 511309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 512309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 513309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 514309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 515309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 516309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onPageSelected(int position) { 517309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurPos = position; 518309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 519309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 520309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 521309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onPageScrollStateChanged(int state) { 522309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (state == ViewPager.SCROLL_STATE_IDLE) { 523309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateCurrentTab(mCurPos); 524309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 5257a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 5267a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 5277a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 528e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project /* 529e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * Custom adapter implementation for the ListView 530e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * This adapter maintains a map for each displayed application and its properties 531e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * An index value on each AppInfo object indicates the correct position or index 532e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * in the list. If the list gets updated dynamically when the user is viewing the list of 533e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * applications, we need to return the correct index of position. This is done by mapping 534e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * the getId methods via the package name into the internal maps and indices. 535e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * The order of applications in the list is mirrored in mAppLocalList 536e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project */ 537309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn static class ApplicationsAdapter extends BaseAdapter implements Filterable, 538e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.Callbacks, AbsListView.RecyclerListener { 539e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private final ApplicationsState mState; 540309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final ApplicationsState.Session mSession; 541309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final TabInfo mTab; 542309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final Context mContext; 543e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private final ArrayList<View> mActive = new ArrayList<View>(); 544309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final int mFilterMode; 545e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ArrayList<ApplicationsState.AppEntry> mBaseEntries; 546e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ArrayList<ApplicationsState.AppEntry> mEntries; 547e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private boolean mResumed; 548309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private int mLastSortMode=-1; 54919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn private boolean mWaitingForData; 550bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn private int mWhichSize = SIZE_TOTAL; 551e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn CharSequence mCurFilterPrefix; 552e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 553e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private Filter mFilter = new Filter() { 554e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 555e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn protected FilterResults performFiltering(CharSequence constraint) { 556e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> entries 557e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn = applyPrefixFilter(constraint, mBaseEntries); 558e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn FilterResults fr = new FilterResults(); 559e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn fr.values = entries; 560e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn fr.count = entries.size(); 561e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return fr; 562e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 563355b32faa924a0b39067dd759ba03e5af97065caSuchi Amalapurapu 564e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 565e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn protected void publishResults(CharSequence constraint, FilterResults results) { 566e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mCurFilterPrefix = constraint; 567e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values; 568e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn notifyDataSetChanged(); 569309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 570afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 571e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn }; 572c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 573309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public ApplicationsAdapter(ApplicationsState state, TabInfo tab, int filterMode) { 574e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState = state; 575309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession = state.newSession(this); 576309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab = tab; 577309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContext = tab.mOwner.getActivity(); 578309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFilterMode = filterMode; 579c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 580e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 581309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void resume(int sort) { 582e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "Resume! mResumed=" + mResumed); 583e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (!mResumed) { 584e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumed = true; 585309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.resume(); 586e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastSortMode = sort; 58719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(true); 588e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } else { 589309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn rebuild(sort); 590c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 591e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 592c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 593e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void pause() { 594e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mResumed) { 595e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumed = false; 596309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.pause(); 597e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 598afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 599b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 600f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su public void release() { 601f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su mSession.release(); 602f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su } 603f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su 604309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void rebuild(int sort) { 605309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (sort == mLastSortMode) { 606e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return; 607e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 608e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastSortMode = sort; 60919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(true); 610afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 611afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 61219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void rebuild(boolean eraseold) { 613e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "Rebuilding app list..."); 614e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppFilter filterObj; 615e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn Comparator<AppEntry> comparatorObj; 616bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn boolean emulated = Environment.isExternalStorageEmulated(); 617bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn if (emulated) { 618bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_TOTAL; 619bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } else { 620bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_INTERNAL; 621bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 622309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn switch (mFilterMode) { 623e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case FILTER_APPS_THIRD_PARTY: 624e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = ApplicationsState.THIRD_PARTY_FILTER; 625e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 626e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case FILTER_APPS_SDCARD: 627e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = ApplicationsState.ON_SD_CARD_FILTER; 628bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn if (!emulated) { 629bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_EXTERNAL; 630bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 631e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 63218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn case FILTER_APPS_DISABLED: 63318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn filterObj = ApplicationsState.DISABLED_FILTER; 63418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn break; 635e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn default: 63618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn filterObj = ApplicationsState.ALL_ENABLED_FILTER; 637e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 638e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 639e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn switch (mLastSortMode) { 640e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case SORT_ORDER_SIZE: 641430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn switch (mWhichSize) { 642430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn case SIZE_INTERNAL: 643430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR; 644430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 645430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn case SIZE_EXTERNAL: 646430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.EXTERNAL_SIZE_COMPARATOR; 647430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 648430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn default: 649430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.SIZE_COMPARATOR; 650430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 651430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn } 652e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 653e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn default: 654e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn comparatorObj = ApplicationsState.ALPHA_COMPARATOR; 655e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 656e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 65719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn ArrayList<ApplicationsState.AppEntry> entries 658309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn = mSession.rebuild(filterObj, comparatorObj); 65919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (entries == null && !eraseold) { 66019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn // Don't have new list yet, but can continue using the old one. 66119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn return; 66219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 66319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mBaseEntries = entries; 66419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (mBaseEntries != null) { 66519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries); 66619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } else { 66719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = null; 66819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 669e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn notifyDataSetChanged(); 670309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 67119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 67219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (entries == null) { 67319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mWaitingForData = true; 674309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.setVisibility(View.INVISIBLE); 675309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.setVisibility(View.VISIBLE); 67619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } else { 677309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.setVisibility(View.VISIBLE); 678309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.setVisibility(View.GONE); 67919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 680afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 681afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 682e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix, 683e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> origEntries) { 684e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (prefix == null || prefix.length() == 0) { 685e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return origEntries; 686afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 687e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn String prefixStr = ApplicationsState.normalize(prefix.toString()); 688e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn final String spacePrefixStr = " " + prefixStr; 689e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> newEntries 690e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn = new ArrayList<ApplicationsState.AppEntry>(); 691e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn for (int i=0; i<origEntries.size(); i++) { 692e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = origEntries.get(i); 693e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn String nlabel = entry.getNormalizedLabel(); 694e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) { 695e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn newEntries.add(entry); 696ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 697ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 698e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return newEntries; 699afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 700afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 701ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu 702e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 703e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onRunningStateChanged(boolean running) { 704309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mOwner.getActivity().setProgressBarIndeterminateVisibility(running); 705afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 706b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 707e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 70819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void onRebuildComplete(ArrayList<AppEntry> apps) { 709309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mTab.mLoadingContainer.getVisibility() == View.VISIBLE) { 710309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.startAnimation(AnimationUtils.loadAnimation( 711309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContext, android.R.anim.fade_out)); 712309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.startAnimation(AnimationUtils.loadAnimation( 713309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContext, android.R.anim.fade_in)); 7144e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn } 715309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.setVisibility(View.VISIBLE); 716309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.setVisibility(View.GONE); 71719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mWaitingForData = false; 71819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mBaseEntries = apps; 71919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries); 72019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn notifyDataSetChanged(); 721309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 72219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 72319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 72419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn @Override 725e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageListChanged() { 72619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 727afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 728b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 729e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 730e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageIconChanged() { 731e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // We ensure icons are loaded when their item is displayed, so 732e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // don't care about icons loaded in the background. 733afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 734b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 735e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 736e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageSizeChanged(String packageName) { 737e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 738e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag(); 739e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (holder.entry.info.packageName.equals(packageName)) { 740e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn synchronized (holder.entry) { 741309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize); 742c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 743309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (holder.entry.info.packageName.equals(mTab.mOwner.mCurrentPkgName) 744e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn && mLastSortMode == SORT_ORDER_SIZE) { 745e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // We got the size information for the last app the 746e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // user viewed, and are sorting by size... they may 747e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // have cleared data, so we immediately want to resort 748e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // the list with the new size to reflect it to the user. 74919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 750c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 751309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 752e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return; 753c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 754c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 755c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 756c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 757e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 758e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onAllSizesComputed() { 759e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mLastSortMode == SORT_ORDER_SIZE) { 76019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 761afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 762a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTab.updateStorageUsage(); 763afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 764afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 765afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getCount() { 766e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries != null ? mEntries.size() : 0; 767afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 768afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 769afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public Object getItem(int position) { 770e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position); 771afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 772afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 773e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public ApplicationsState.AppEntry getAppEntry(int position) { 774e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position); 775afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 776afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 777afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public long getItemId(int position) { 778e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position).id; 779afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 780afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 781afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 782347c9a0544328e65120582834ce330fb0d473f28Jeff Brown // A ViewHolder keeps references to children views to avoid unnecessary calls 783afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // to findViewById() on each row. 784309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn AppViewHolder holder = AppViewHolder.createOrRecycle(mTab.mInflater, convertView); 7859244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn convertView = holder.rootView; 786afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 787afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Bind the data efficiently with the holder 788e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = mEntries.get(position); 789e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn synchronized (entry) { 790e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.entry = entry; 791e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.label != null) { 792e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.appName.setText(entry.label); 793afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 794e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState.ensureIcon(entry); 795e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.icon != null) { 796e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.appIcon.setImageDrawable(entry.icon); 797afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 798309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize); 7993db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if ((entry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0) { 8003db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn holder.disabled.setVisibility(View.VISIBLE); 8013db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn holder.disabled.setText(R.string.not_installed); 8023db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (!entry.info.enabled) { 8033db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn holder.disabled.setVisibility(View.VISIBLE); 8043db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn holder.disabled.setText(R.string.disabled); 80544178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn } else { 80644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn holder.disabled.setVisibility(View.GONE); 80744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn } 808309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mFilterMode == FILTER_APPS_SDCARD) { 8096dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setVisibility(View.VISIBLE); 8106dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setChecked((entry.info.flags 8116dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0); 8126dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } else { 8136dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setVisibility(View.GONE); 8146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 815afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 816e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.remove(convertView); 817e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.add(convertView); 818afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return convertView; 819afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 820c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 821e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 822c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu public Filter getFilter() { 823e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mFilter; 824c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 825c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 826e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 827e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onMovedToScrapHeap(View view) { 828e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.remove(view); 829728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 830728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 831728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 832afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 833f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreate(Bundle savedInstanceState) { 834afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 835f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 836f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn setHasOptionsMenu(true); 837f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 838f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication()); 839f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Intent intent = getActivity().getIntent(); 840ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu String action = intent.getAction(); 8417a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani int defaultListType = LIST_TYPE_DOWNLOADED; 842ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn String className = getArguments() != null 843ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ? getArguments().getString("classname") : null; 844ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (className == null) { 845ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn className = intent.getComponent().getClassName(); 846ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 847af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani if (className.equals(RunningServicesActivity.class.getName()) 848af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || className.endsWith(".RunningServices")) { 8497a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_RUNNING; 8505203bdffe6ce2b829d0fab8c7691fa92aca6e972Amith Yamasani } else if (className.equals(StorageUseActivity.class.getName()) 851af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || Intent.ACTION_MANAGE_PACKAGE_STORAGE.equals(action) 852af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || className.endsWith(".StorageUse")) { 853afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSortOrder = SORT_ORDER_SIZE; 8547a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_ALL; 855263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio } else if (android.provider.Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)) { 8567a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani // Select the all-apps list, with the default sorting 8577a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_ALL; 858afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8597a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 860728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (savedInstanceState != null) { 86102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder); 8627a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani int tmp = savedInstanceState.getInt(EXTRA_DEFAULT_LIST_TYPE, -1); 8637a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani if (tmp != -1) defaultListType = tmp; 86402c22131e93e1a506141b1890c7134909ded876fAmith Yamasani mShowBackground = savedInstanceState.getBoolean(EXTRA_SHOW_BACKGROUND, false); 865728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 8667a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 8677a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani mDefaultListType = defaultListType; 8683b7dbcecf70788df4950340cbf750dbe524dca96Amith Yamasani 86944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey final Intent containerIntent = new Intent().setComponent( 87044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey StorageMeasurement.DEFAULT_CONTAINER_COMPONENT); 87144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE); 8721337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 873f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value); 874f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mComputingSizeStr = getActivity().getText(R.string.computing_size); 875f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 876a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn TabInfo tab = new TabInfo(this, mApplicationsState, 877309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_third_party), 878309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_DOWNLOADED, this, savedInstanceState); 879309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 880f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 881309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (!Environment.isExternalStorageEmulated()) { 882a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 883309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_onsdcard), 884309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_SDCARD, this, savedInstanceState); 885309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 886508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 8877a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 888a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 889309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_running), 890309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_RUNNING, this, savedInstanceState); 891309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 8927a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 893a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 894309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_all), 895309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_ALL, this, savedInstanceState); 896309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 89718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn 89818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn tab = new TabInfo(this, mApplicationsState, 89918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn getActivity().getString(R.string.filter_apps_disabled), 90018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn LIST_TYPE_DISABLED, this, savedInstanceState); 90118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn mTabs.add(tab); 90218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn 90318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn mNumTabs = mTabs.size(); 904309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 9057a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 9067a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 907309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 908309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 909309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // initialize the inflater 910309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInflater = inflater; 9117a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 912309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn View rootView = mInflater.inflate(R.layout.manage_applications_content, 913309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn container, false); 914309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContentContainer = container; 915309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRootView = rootView; 9167a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 917309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager = (ViewPager) rootView.findViewById(R.id.pager); 918309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn MyPagerAdapter adapter = new MyPagerAdapter(); 919309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager.setAdapter(adapter); 920309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager.setOnPageChangeListener(adapter); 921309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs); 922cc22af08117a2f90d879cc360f76de48fd234e0dFabrice Di Meglio tabs.setTabIndicatorColorResource(R.color.theme_accent); 9237a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 924a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // We have to do this now because PreferenceFrameLayout looks at it 925a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // only when the view is added. 926a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (container instanceof PreferenceFrameLayout) { 927a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true; 928a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 929a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 93014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) { 93114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn buildResetDialog(); 93214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 93314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 93413ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn if (savedInstanceState == null) { 93513ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn // First time init: make sure view pager is showing the correct tab. 93613ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn for (int i = 0; i < mTabs.size(); i++) { 93713ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn TabInfo tab = mTabs.get(i); 93813ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn if (tab.mListType == mDefaultListType) { 93913ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn mViewPager.setCurrentItem(i); 94013ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn break; 94113ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn } 94213ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn } 94313ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn } 94413ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn 945309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return rootView; 946afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 947f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 948f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu @Override 949728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public void onStart() { 950728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onStart(); 951b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu } 952b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 953afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 954f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onResume() { 955728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onResume(); 956728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = true; 957309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateCurrentTab(mViewPager.getCurrentItem()); 958f5f08628cc0129e92277d6ddfcf6ae680887573dDianne Hackborn updateNumTabs(); 959ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 960afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 961b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 962728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 963f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onSaveInstanceState(Bundle outState) { 964728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onSaveInstanceState(outState); 96502c22131e93e1a506141b1890c7134909ded876fAmith Yamasani outState.putInt(EXTRA_SORT_ORDER, mSortOrder); 9667a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani if (mDefaultListType != -1) { 9677a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani outState.putInt(EXTRA_DEFAULT_LIST_TYPE, mDefaultListType); 968f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 96902c22131e93e1a506141b1890c7134909ded876fAmith Yamasani outState.putBoolean(EXTRA_SHOW_BACKGROUND, mShowBackground); 97014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog != null) { 97114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn outState.putBoolean(EXTRA_RESET_DIALOG, true); 97214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 973728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 974728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 975728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 976f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onPause() { 977728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onPause(); 978728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = false; 979309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 980309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.get(i).pause(); 981728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 982728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 983728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 984728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 98514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onStop() { 98614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn super.onStop(); 98714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog != null) { 98814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog.dismiss(); 98914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = null; 99014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 99114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 99214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 99314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 994a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void onDestroyView() { 995a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn super.onDestroyView(); 996a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 997a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // We are going to keep the tab data structures around, but they 998a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // are no longer attached to their view hierarchy. 999a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1000a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTabs.get(i).detachView(); 1001f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su mTabs.get(i).release(); 1002a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 1003a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 1004a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 1005a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn @Override 1006f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 1007728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) { 1008e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsState.requestSize(mCurrentPkgName); 1009ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 1010afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 10117a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 101218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn private void updateNumTabs() { 101318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn int newNum = mApplicationsState.haveDisabledApps() ? mTabs.size() : (mTabs.size()-1); 101418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn if (newNum != mNumTabs) { 101518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn mNumTabs = newNum; 101618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn if (mViewPager != null) { 101718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn mViewPager.getAdapter().notifyDataSetChanged(); 101818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn } 101918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn } 102018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn } 102118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn 1022309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tabForType(int type) { 1023309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i = 0; i < mTabs.size(); i++) { 1024309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(i); 1025309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (tab.mListType == type) { 1026309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return tab; 1027309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 10287a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 1029309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return null; 10307a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 10317a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 1032afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // utility method used to start sub activity 1033afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void startApplicationDetailsActivity() { 1034f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // start new fragment to display extended information 1035f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Bundle args = new Bundle(); 1036f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mCurrentPkgName); 1037f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 1038263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio SettingsActivity sa = (SettingsActivity) getActivity(); 1039263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio sa.startPreferencePanel(InstalledAppDetails.class.getName(), args, 1040ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn R.string.application_info_label, null, this, INSTALLED_APP_DETAILS); 1041afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1042afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1043afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1044f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1045ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu = menu; 10460385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn // note: icons removed for now because the cause the new action 10470385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn // bar UI to be very confusing. 1048afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha) 10490385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn //.setIcon(android.R.drawable.ic_menu_sort_alphabetically) 1050348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1051afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size) 10520385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn //.setIcon(android.R.drawable.ic_menu_sort_by_size) 1053348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1054ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services) 1055ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 1056ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes) 1057ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 105814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn menu.add(0, RESET_APP_PREFERENCES, 4, R.string.reset_app_preferences) 105914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1060ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1061afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1062afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1063afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1064f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 1065ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1066ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 1067ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 1068ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn @Override 1069ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onDestroyOptionsMenu() { 1070ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu = null; 1071ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 107244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 107344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 107444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onDestroy() { 107544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey getActivity().unbindService(mContainerConnection); 107644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey super.onDestroy(); 107744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 107844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 1079ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn void updateOptionsMenu() { 1080ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (mOptionsMenu == null) { 1081ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return; 1082ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 1083ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 1084673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root /* 1085673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root * The running processes screen doesn't use the mApplicationsAdapter 1086673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root * so bringing up this menu in that case doesn't make any sense. 1087673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root */ 1088309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mListType == LIST_TYPE_RUNNING) { 1089309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = tabForType(LIST_TYPE_RUNNING); 1090309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn boolean showingBackground = tab != null && tab.mRunningProcessesView != null 1091309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ? tab.mRunningProcessesView.mAdapter.getShowBackground() : false; 1092ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false); 1093ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false); 1094ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground); 1095ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground); 109614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false); 1097eca1fc2cadb9c1f15ab042e2080a8b8eb40ab6faThiago VinÃcius Freire de Araújo Ribeiro mShowBackground = showingBackground; 10981337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else { 1099ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA); 1100ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE); 1101ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false); 1102ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false); 110314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(true); 110414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 110514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 110614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 110714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn void buildResetDialog() { 110814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == null) { 110914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 111014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setTitle(R.string.reset_app_preferences_title); 111114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setMessage(R.string.reset_app_preferences_desc); 111214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setPositiveButton(R.string.reset_app_preferences_button, this); 111314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setNegativeButton(R.string.cancel, null); 111414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = builder.show(); 111514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog.setOnDismissListener(this); 111614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 111714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 111814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 111914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 112014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onDismiss(DialogInterface dialog) { 112114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == dialog) { 112214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = null; 112314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 112414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 112514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 112614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 112714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 112814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onClick(DialogInterface dialog, int which) { 112914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == dialog) { 113014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final PackageManager pm = getActivity().getPackageManager(); 1131596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn final IPackageManager mIPm = IPackageManager.Stub.asInterface( 1132a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn ServiceManager.getService("package")); 113314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final INotificationManager nm = INotificationManager.Stub.asInterface( 113414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 113514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final NetworkPolicyManager npm = NetworkPolicyManager.from(getActivity()); 1136a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn final AppOpsManager aom = (AppOpsManager)getActivity().getSystemService( 1137a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn Context.APP_OPS_SERVICE); 113814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final Handler handler = new Handler(getActivity().getMainLooper()); 113914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn (new AsyncTask<Void, Void, Void>() { 114014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override protected Void doInBackground(Void... params) { 114114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn List<ApplicationInfo> apps = pm.getInstalledApplications( 114214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.GET_DISABLED_COMPONENTS); 114314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn for (int i=0; i<apps.size(); i++) { 114414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ApplicationInfo app = apps.get(i); 114514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn try { 114614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName); 1147df3f6d6c4722a7acc8189e47d0499aaf618969f9Daniel Sandler nm.setNotificationsEnabledForPackage(app.packageName, app.uid, true); 114814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } catch (android.os.RemoteException ex) { 114914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 115014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (!app.enabled) { 115114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName); 115214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (pm.getApplicationEnabledSetting(app.packageName) 115314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) { 115414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn pm.setApplicationEnabledSetting(app.packageName, 115514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 115614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.DONT_KILL_APP); 115714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 115814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 115914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 1160596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn try { 1161596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn mIPm.resetPreferredActivities(UserHandle.myUserId()); 1162596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn } catch (RemoteException e) { 116314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 1164a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn aom.resetAllModes(); 116538305fb1777147cbcb86774c466e88434daff141Jeff Sharkey final int[] restrictedUids = npm.getUidsWithPolicy( 116614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn POLICY_REJECT_METERED_BACKGROUND); 116738305fb1777147cbcb86774c466e88434daff141Jeff Sharkey final int currentUserId = ActivityManager.getCurrentUser(); 116838305fb1777147cbcb86774c466e88434daff141Jeff Sharkey for (int uid : restrictedUids) { 116938305fb1777147cbcb86774c466e88434daff141Jeff Sharkey // Only reset for current user 117038305fb1777147cbcb86774c466e88434daff141Jeff Sharkey if (UserHandle.getUserId(uid) == currentUserId) { 117138305fb1777147cbcb86774c466e88434daff141Jeff Sharkey if (DEBUG) Log.v(TAG, "Clearing data policy: " + uid); 117238305fb1777147cbcb86774c466e88434daff141Jeff Sharkey npm.setUidPolicy(uid, POLICY_NONE); 117338305fb1777147cbcb86774c466e88434daff141Jeff Sharkey } 117414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 117514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn handler.post(new Runnable() { 117614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override public void run() { 117714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Done clearing"); 117814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (getActivity() != null && mActivityResumed) { 117914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Updating UI!"); 1180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1181309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(i); 1182309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (tab.mApplications != null) { 1183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn tab.mApplications.pause(); 1184309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 1185309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 1186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null) { 1187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.resume(mSortOrder); 1188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 118914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 119014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 119114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn }); 119214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn return null; 119314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 119414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn }).execute(); 1195673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root } 1196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 1200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int menuId = item.getItemId(); 1201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) { 1202e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mSortOrder = menuId; 1203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mApplications != null) { 1204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mApplications.rebuild(mSortOrder); 12051337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 12061337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (menuId == SHOW_RUNNING_SERVICES) { 12070385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mShowBackground = false; 1208309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mRunningProcessesView != null) { 1209309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mRunningProcessesView.mAdapter.setShowBackground(false); 1210309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 12111337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (menuId == SHOW_BACKGROUND_PROCESSES) { 12120385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mShowBackground = true; 1213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mRunningProcessesView != null) { 1214309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mRunningProcessesView.mAdapter.setShowBackground(true); 1215309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 121614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } else if (menuId == RESET_APP_PREFERENCES) { 121714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn buildResetDialog(); 1218f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani } else { 1219f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani // Handle the home button 1220f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani return false; 1221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1222ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 1224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1225d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn 1226a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void onItemClick(TabInfo tab, AdapterView<?> parent, View view, int position, 1227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long id) { 1228a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (tab.mApplications != null && tab.mApplications.getCount() > position) { 1229a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ApplicationsState.AppEntry entry = tab.mApplications.getAppEntry(position); 1230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurrentPkgName = entry.info.packageName; 1231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn startApplicationDetailsActivity(); 12321337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 1233309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 12341337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 1235309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void updateCurrentTab(int position) { 1236309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(position); 1237309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab = tab; 123844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 1239309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Put things in the correct paused/resumed state. 1240309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mActivityResumed) { 1241309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.build(mInflater, mContentContainer, mRootView); 1242309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.resume(mSortOrder); 12431337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else { 1244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.pause(); 12451337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 1246309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1247309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo t = mTabs.get(i); 1248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (t != mCurTab) { 1249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn t.pause(); 12501337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 12511337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 12521337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 1253309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.updateStorageUsage(); 1254309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateOptionsMenu(); 1255a31be80ef056add00e0d239414f80f932978277fAdam Powell final Activity host = getActivity(); 1256a31be80ef056add00e0d239414f80f932978277fAdam Powell if (host != null) { 1257a31be80ef056add00e0d239414f80f932978277fAdam Powell host.invalidateOptionsMenu(); 1258a31be80ef056add00e0d239414f80f932978277fAdam Powell } 1259e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 1260e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 126144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey private volatile IMediaContainerService mContainerService; 126244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 126344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey private final ServiceConnection mContainerConnection = new ServiceConnection() { 126444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 126544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onServiceConnected(ComponentName name, IBinder service) { 126644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey mContainerService = IMediaContainerService.Stub.asInterface(service); 1267a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1268a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTabs.get(i).setContainerService(mContainerService); 1269309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 127044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 127144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 127244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 127344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onServiceDisconnected(ComponentName name) { 127444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey mContainerService = null; 127544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 127644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey }; 1277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 1278