ManageApplications.java revision 37f3c8f574b984e4980ebf598358726b3f852156
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; 3214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.IntentFilter; 3344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ServiceConnection; 3419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport android.content.pm.ApplicationInfo; 356dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.IPackageManager; 366dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.PackageInfo; 3714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.pm.PackageManager; 3814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.net.NetworkPolicyManager; 3914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.AsyncTask; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 411337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.os.Environment; 4214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.Handler; 4344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.os.IBinder; 446dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.RemoteException; 456dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.ServiceManager; 4638305fb1777147cbcb86774c466e88434daff141Jeff Sharkeyimport android.os.UserHandle; 47f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.preference.PreferenceActivity; 48a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackbornimport android.preference.PreferenceFrameLayout; 49728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.provider.Settings; 50309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerAdapter; 51309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerTabStrip; 52309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.ViewPager; 5337f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglioimport android.text.BidiFormatter; 541337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.text.format.Formatter; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater; 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu; 58f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.MenuInflater; 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem; 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup; 62ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackbornimport android.view.animation.AnimationUtils; 63e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView; 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView; 65a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.widget.AdapterView.OnItemClickListener; 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter; 67c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filter; 68c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filterable; 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView; 70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 71b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 7244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.internal.app.IMediaContainerService; 73b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.internal.content.PackageHelper; 74b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.R; 75b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.RunningServicesActivity; 76b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.StorageUseActivity; 77b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.applications.ApplicationsState.AppEntry; 7844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.settings.deviceinfo.StorageMeasurement; 79309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport com.android.settings.Utils; 80b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey 81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Comparator; 8314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport java.util.List; 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 856dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornfinal class CanBeOnSdCardChecker { 866dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn final IPackageManager mPm; 876dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn int mInstallLocation; 886dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn CanBeOnSdCardChecker() { 906dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mPm = IPackageManager.Stub.asInterface( 916dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn ServiceManager.getService("package")); 926dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 936dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 946dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn void init() { 956dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn try { 966dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mInstallLocation = mPm.getInstallLocation(); 976dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } catch (RemoteException e) { 986dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn Log.e("CanBeOnSdCardChecker", "Is Package Manager running?"); 996dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn return; 1006dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1026dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 1036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn boolean check(ApplicationInfo info) { 1046dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn boolean canBe = false; 1056dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { 1066dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn canBe = true; 1076dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } else { 1083c24cfed8d5116ff21986acb60a918cb079a0efdKenny Root if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { 1096dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if (info.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL || 1106dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn info.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) { 1116dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn canBe = true; 1126dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } else if (info.installLocation 1136dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) { 1146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if (mInstallLocation == PackageHelper.APP_INSTALL_EXTERNAL) { 1156dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn // For apps with no preference and the default value set 1166dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn // to install on sdcard. 1176dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn canBe = true; 1186dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1196dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1206dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1216dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1226dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn return canBe; 1236dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1246dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn} 1256dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 126a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborninterface AppClickListener { 127a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn void onItemClick(ManageApplications.TabInfo tab, AdapterView<?> parent, 128a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn View view, int position, long id); 129a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn} 130a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to pick an application that will be used to display installation information and 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * options to uninstall/delete user data for system applications. This activity 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * intent. 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 137f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class ManageApplications extends Fragment implements 138a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn AppClickListener, DialogInterface.OnClickListener, 13914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn DialogInterface.OnDismissListener { 14002c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 141e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final String TAG = "ManageApplications"; 142e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final boolean DEBUG = false; 14302c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 14402c22131e93e1a506141b1890c7134909ded876fAmith Yamasani private static final String EXTRA_SORT_ORDER = "sortOrder"; 14502c22131e93e1a506141b1890c7134909ded876fAmith Yamasani private static final String EXTRA_SHOW_BACKGROUND = "showBackground"; 1467a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani private static final String EXTRA_DEFAULT_LIST_TYPE = "defaultListType"; 14714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn private static final String EXTRA_RESET_DIALOG = "resetDialog"; 14802c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // attributes used as keys when passing values to InstalledAppDetails activity 15038b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu public static final String APP_CHG = "chg"; 15102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // constant value that can be used to check return code from sub activity. 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int INSTALLED_APP_DETAILS = 1; 154d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn 155bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_TOTAL = 0; 156bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_INTERNAL = 1; 157bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_EXTERNAL = 2; 158bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // sort order that can be changed through the menu can be sorted alphabetically 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // or size(descending) 161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int MENU_OPTIONS_BASE = 0; 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Filter options used for displayed list of applications 1636cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0; 164728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1; 165728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2; 16618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn public static final int FILTER_APPS_DISABLED = MENU_OPTIONS_BASE + 3; 167747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu 1686cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4; 1696cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5; 1701337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6; 1711337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7; 17214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 8; 173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // sort order 174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private int mSortOrder = SORT_ORDER_ALPHA; 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 176e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ApplicationsState mApplicationsState; 177309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public static class TabInfo implements OnItemClickListener { 179309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final ManageApplications mOwner; 180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final ApplicationsState mApplicationsState; 181309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mLabel; 182309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final int mListType; 183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final int mFilter; 184a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public final AppClickListener mClickListener; 185309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mInvalidSizeStr; 186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mComputingSizeStr; 187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final Bundle mSavedInstanceState; 188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public ApplicationsAdapter mApplications; 190309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public LayoutInflater mInflater; 191309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View mRootView; 192309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 193a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn private IMediaContainerService mContainerService; 194a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 195309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mLoadingContainer; 196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 197309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mListContainer; 198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // ListView used to display list 200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ListView mListView; 201309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Custom view used to display running processes 202309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private RunningProcessesView mRunningProcessesView; 203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private LinearColorBar mColorBar; 205309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private TextView mStorageChartLabel; 206309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private TextView mUsedStorageText; 207309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private TextView mFreeStorageText; 208a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn private long mFreeStorage = 0, mAppStorage = 0, mTotalStorage = 0; 209309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage; 210309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 211309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final Runnable mRunningProcessesAvail = new Runnable() { 212309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void run() { 213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn handleRunningProcessesAvail(); 214309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 215309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn }; 216309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 217309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public TabInfo(ManageApplications owner, ApplicationsState apps, 218a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn CharSequence label, int listType, AppClickListener clickListener, 219309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Bundle savedInstanceState) { 220309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner = owner; 221309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplicationsState = apps; 222309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLabel = label; 223309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListType = listType; 224309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn switch (listType) { 225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn case LIST_TYPE_DOWNLOADED: mFilter = FILTER_APPS_THIRD_PARTY; break; 226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn case LIST_TYPE_SDCARD: mFilter = FILTER_APPS_SDCARD; break; 22718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn case LIST_TYPE_DISABLED: mFilter = FILTER_APPS_DISABLED; break; 228309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn default: mFilter = FILTER_APPS_ALL; break; 229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mClickListener = clickListener; 231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInvalidSizeStr = owner.getActivity().getText(R.string.invalid_size_value); 232309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mComputingSizeStr = owner.getActivity().getText(R.string.computing_size); 233309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSavedInstanceState = savedInstanceState; 234309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 235309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 236a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void setContainerService(IMediaContainerService containerService) { 237a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mContainerService = containerService; 238a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn updateStorageUsage(); 239a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 240a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 241309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View build(LayoutInflater inflater, ViewGroup contentParent, View contentChild) { 242309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRootView != null) { 243309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mRootView; 244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 245309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 246309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInflater = inflater; 247309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRootView = inflater.inflate(mListType == LIST_TYPE_RUNNING 248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ? R.layout.manage_applications_running 249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn : R.layout.manage_applications_apps, null); 250309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer = mRootView.findViewById(R.id.loading_container); 251309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.VISIBLE); 252309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListContainer = mRootView.findViewById(R.id.list_container); 253309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mListContainer != null) { 254309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Create adapter and list view here 255309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty); 256309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ListView lv = (ListView) mListContainer.findViewById(android.R.id.list); 257309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (emptyView != null) { 258309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setEmptyView(emptyView); 259309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 260309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setOnItemClickListener(this); 261309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setSaveEnabled(true); 262309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setItemsCanFocus(true); 263309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn lv.setTextFilterEnabled(true); 264309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListView = lv; 265309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplications = new ApplicationsAdapter(mApplicationsState, this, mFilter); 266309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListView.setAdapter(mApplications); 267309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListView.setRecyclerListener(mApplications); 268309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar); 269309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel); 270309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText); 271309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText); 272309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false); 273a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mFilter == FILTER_APPS_SDCARD) { 274a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mStorageChartLabel.setText(mOwner.getActivity().getText( 275a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn R.string.sd_card_storage)); 276a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } else { 277a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mStorageChartLabel.setText(mOwner.getActivity().getText( 278a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn R.string.internal_storage)); 279a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 280a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn applyCurrentStorage(); 281309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 282309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView = (RunningProcessesView)mRootView.findViewById( 283309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn R.id.running_processes); 284309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRunningProcessesView != null) { 285309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.doCreate(mSavedInstanceState); 286309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 287309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 288309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mRootView; 289309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 290309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 291a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void detachView() { 292a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mRootView != null) { 293a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ViewGroup group = (ViewGroup)mRootView.getParent(); 294a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (group != null) { 295a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn group.removeView(mRootView); 296a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 297a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 298a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 299a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 300309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void resume(int sortOrder) { 301309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 302309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplications.resume(sortOrder); 303309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 304309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRunningProcessesView != null) { 305309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn boolean haveData = mRunningProcessesView.doResume(mOwner, mRunningProcessesAvail); 306309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (haveData) { 307309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.setVisibility(View.VISIBLE); 308309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.INVISIBLE); 309309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } else { 310309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.VISIBLE); 311309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 312309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 313309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 314309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 315309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void pause() { 316309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 317309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplications.pause(); 318309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 319309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRunningProcessesView != null) { 320309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.doPause(); 321309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 322309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 323309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 324309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn void updateStorageUsage() { 325309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Make sure a callback didn't come at an inopportune time. 326309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mOwner.getActivity() == null) return; 327309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Doesn't make sense for stuff that is not an app list. 328309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications == null) return; 329309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 330a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = 0; 331a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage = 0; 332a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = 0; 333309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 334309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mFilter == FILTER_APPS_SDCARD) { 335309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mContainerService != null) { 336309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn try { 337309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final long[] stats = mContainerService.getFileSystemStats( 338309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Environment.getExternalStorageDirectory().getPath()); 339a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = stats[0]; 340a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = stats[1]; 341309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } catch (RemoteException e) { 342309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Log.w(TAG, "Problem in container service", e); 343309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 344309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 345309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 346309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 347309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final int N = mApplications.getCount(); 348309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<N; i++) { 349309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ApplicationsState.AppEntry ae = mApplications.getAppEntry(i); 3501f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mAppStorage += ae.externalCodeSize + ae.externalDataSize 3511f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn + ae.externalCacheSize; 352309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 353309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 354309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } else { 355309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mContainerService != null) { 356309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn try { 357309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final long[] stats = mContainerService.getFileSystemStats( 358309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Environment.getDataDirectory().getPath()); 359a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = stats[0]; 360a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = stats[1]; 361309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } catch (RemoteException e) { 362309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Log.w(TAG, "Problem in container service", e); 363309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 364309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 365309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 366309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final boolean emulatedStorage = Environment.isExternalStorageEmulated(); 367309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 368309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final int N = mApplications.getCount(); 369309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<N; i++) { 370309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ApplicationsState.AppEntry ae = mApplications.getAppEntry(i); 371a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage += ae.codeSize + ae.dataSize; 372309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (emulatedStorage) { 373a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage += ae.externalCodeSize + ae.externalDataSize; 374309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 375309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 376309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 377a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage += mApplicationsState.sumCacheSizes(); 378309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 379a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 380a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn applyCurrentStorage(); 381a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 382a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 383a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn void applyCurrentStorage() { 384a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // If view hierarchy is not yet created, no views to update. 385a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mRootView == null) { 386a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn return; 387309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 388a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mTotalStorage > 0) { 38937f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio BidiFormatter bidiFormatter = BidiFormatter.getInstance(); 390a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mColorBar.setRatios((mTotalStorage-mFreeStorage-mAppStorage)/(float)mTotalStorage, 391a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage/(float)mTotalStorage, mFreeStorage/(float)mTotalStorage); 392a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn long usedStorage = mTotalStorage - mFreeStorage; 393309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mLastUsedStorage != usedStorage) { 394309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLastUsedStorage = usedStorage; 39537f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio String sizeStr = bidiFormatter.unicodeWrap( 39637f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio Formatter.formatShortFileSize(mOwner.getActivity(), usedStorage)); 397309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mUsedStorageText.setText(mOwner.getActivity().getResources().getString( 398309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn R.string.service_foreground_processes, sizeStr)); 399309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 400a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mLastFreeStorage != mFreeStorage) { 401a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mLastFreeStorage = mFreeStorage; 40237f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio String sizeStr = bidiFormatter.unicodeWrap( 40337f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio Formatter.formatShortFileSize(mOwner.getActivity(), mFreeStorage)); 404309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFreeStorageText.setText(mOwner.getActivity().getResources().getString( 405309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn R.string.service_background_processes, sizeStr)); 406309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 407309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } else { 408309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mColorBar.setRatios(0, 0, 0); 409309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mLastUsedStorage != -1) { 410309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLastUsedStorage = -1; 411309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mUsedStorageText.setText(""); 412309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 413309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mLastFreeStorage != -1) { 414309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLastFreeStorage = -1; 415309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFreeStorageText.setText(""); 416309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 417309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 418309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 419309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 420309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 421309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 422a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mClickListener.onItemClick(this, parent, view, position, id); 423309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 424309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 425309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn void handleRunningProcessesAvail() { 426309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.startAnimation(AnimationUtils.loadAnimation( 427309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner.getActivity(), android.R.anim.fade_out)); 428309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation( 429309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner.getActivity(), android.R.anim.fade_in)); 430309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.setVisibility(View.VISIBLE); 431309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.GONE); 432309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 433309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 434309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 43518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn private int mNumTabs; 436309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo mCurTab = null; 437309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Size resource used for packages whose size computation failed for some reason 4399244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn CharSequence mInvalidSizeStr; 440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingSizeStr; 441afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // layout inflater object used to inflate views 443afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private LayoutInflater mInflater; 444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 445de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private String mCurrentPkgName; 446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 447ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn private Menu mOptionsMenu; 4487a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 4497a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani // These are for keeping track of activity and spinner switch state. 450728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private boolean mActivityResumed; 451728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 4527a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_DOWNLOADED = 0; 4537a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_RUNNING = 1; 4547a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_SDCARD = 2; 4557a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_ALL = 3; 45618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn static final int LIST_TYPE_DISABLED = 4; 457f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 4580385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn private boolean mShowBackground = false; 4590385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn 4607a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani private int mDefaultListType = -1; 461f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 462309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ViewGroup mContentContainer; 463309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mRootView; 464309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ViewPager mViewPager; 465f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 46614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn AlertDialog mResetDialog; 46714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 468309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn class MyPagerAdapter extends PagerAdapter 469309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn implements ViewPager.OnPageChangeListener { 470309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn int mCurPos = 0; 471309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 472309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 473309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public int getCount() { 47418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn return mNumTabs; 475309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 476309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 477309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 478309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public Object instantiateItem(ViewGroup container, int position) { 479309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(position); 480309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn View root = tab.build(mInflater, mContentContainer, mRootView); 481309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn container.addView(root); 48218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn root.setTag(R.id.name, tab); 483309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return root; 484309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 485309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 486309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 487309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void destroyItem(ViewGroup container, int position, Object object) { 488309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn container.removeView((View)object); 489ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn } 490ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn 491309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 492309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public boolean isViewFromObject(View view, Object object) { 493309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return view == object; 494309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 4957a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 496309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 49718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn public int getItemPosition(Object object) { 49818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn return super.getItemPosition(object); 49918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn //return ((TabInfo)((View)object).getTag(R.id.name)).mListType; 50018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn } 50118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn 50218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn @Override 503309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public CharSequence getPageTitle(int position) { 504309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mTabs.get(position).mLabel; 505309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 506309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 507309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 508309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 509309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 510309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 511309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 512309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onPageSelected(int position) { 513309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurPos = position; 514309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 515309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 516309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 517309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onPageScrollStateChanged(int state) { 518309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (state == ViewPager.SCROLL_STATE_IDLE) { 519309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateCurrentTab(mCurPos); 520309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 5217a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 5227a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 5237a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 524e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project /* 525e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * Custom adapter implementation for the ListView 526e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * This adapter maintains a map for each displayed application and its properties 527e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * An index value on each AppInfo object indicates the correct position or index 528e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * in the list. If the list gets updated dynamically when the user is viewing the list of 529e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * applications, we need to return the correct index of position. This is done by mapping 530e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * the getId methods via the package name into the internal maps and indices. 531e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * The order of applications in the list is mirrored in mAppLocalList 532e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project */ 533309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn static class ApplicationsAdapter extends BaseAdapter implements Filterable, 534e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.Callbacks, AbsListView.RecyclerListener { 535e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private final ApplicationsState mState; 536309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final ApplicationsState.Session mSession; 537309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final TabInfo mTab; 538309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final Context mContext; 539e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private final ArrayList<View> mActive = new ArrayList<View>(); 540309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final int mFilterMode; 541e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ArrayList<ApplicationsState.AppEntry> mBaseEntries; 542e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ArrayList<ApplicationsState.AppEntry> mEntries; 543e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private boolean mResumed; 544309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private int mLastSortMode=-1; 54519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn private boolean mWaitingForData; 546bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn private int mWhichSize = SIZE_TOTAL; 547e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn CharSequence mCurFilterPrefix; 548e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 549e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private Filter mFilter = new Filter() { 550e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 551e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn protected FilterResults performFiltering(CharSequence constraint) { 552e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> entries 553e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn = applyPrefixFilter(constraint, mBaseEntries); 554e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn FilterResults fr = new FilterResults(); 555e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn fr.values = entries; 556e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn fr.count = entries.size(); 557e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return fr; 558e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 559355b32faa924a0b39067dd759ba03e5af97065caSuchi Amalapurapu 560e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 561e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn protected void publishResults(CharSequence constraint, FilterResults results) { 562e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mCurFilterPrefix = constraint; 563e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values; 564e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn notifyDataSetChanged(); 565309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 566afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 567e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn }; 568c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 569309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public ApplicationsAdapter(ApplicationsState state, TabInfo tab, int filterMode) { 570e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState = state; 571309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession = state.newSession(this); 572309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab = tab; 573309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContext = tab.mOwner.getActivity(); 574309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFilterMode = filterMode; 575c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 576e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 577309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void resume(int sort) { 578e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "Resume! mResumed=" + mResumed); 579e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (!mResumed) { 580e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumed = true; 581309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.resume(); 582e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastSortMode = sort; 58319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(true); 584e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } else { 585309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn rebuild(sort); 586c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 587e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 588c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 589e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void pause() { 590e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mResumed) { 591e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumed = false; 592309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.pause(); 593e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 594afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 595b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 596309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void rebuild(int sort) { 597309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (sort == mLastSortMode) { 598e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return; 599e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 600e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastSortMode = sort; 60119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(true); 602afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 603afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 60419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void rebuild(boolean eraseold) { 605e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "Rebuilding app list..."); 606e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppFilter filterObj; 607e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn Comparator<AppEntry> comparatorObj; 608bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn boolean emulated = Environment.isExternalStorageEmulated(); 609bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn if (emulated) { 610bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_TOTAL; 611bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } else { 612bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_INTERNAL; 613bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 614309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn switch (mFilterMode) { 615e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case FILTER_APPS_THIRD_PARTY: 616e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = ApplicationsState.THIRD_PARTY_FILTER; 617e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 618e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case FILTER_APPS_SDCARD: 619e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = ApplicationsState.ON_SD_CARD_FILTER; 620bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn if (!emulated) { 621bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_EXTERNAL; 622bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 623e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 62418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn case FILTER_APPS_DISABLED: 62518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn filterObj = ApplicationsState.DISABLED_FILTER; 62618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn break; 627e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn default: 62818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn filterObj = ApplicationsState.ALL_ENABLED_FILTER; 629e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 630e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 631e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn switch (mLastSortMode) { 632e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case SORT_ORDER_SIZE: 633430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn switch (mWhichSize) { 634430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn case SIZE_INTERNAL: 635430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR; 636430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 637430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn case SIZE_EXTERNAL: 638430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.EXTERNAL_SIZE_COMPARATOR; 639430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 640430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn default: 641430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.SIZE_COMPARATOR; 642430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 643430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn } 644e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 645e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn default: 646e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn comparatorObj = ApplicationsState.ALPHA_COMPARATOR; 647e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 648e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 64919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn ArrayList<ApplicationsState.AppEntry> entries 650309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn = mSession.rebuild(filterObj, comparatorObj); 65119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (entries == null && !eraseold) { 65219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn // Don't have new list yet, but can continue using the old one. 65319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn return; 65419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 65519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mBaseEntries = entries; 65619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (mBaseEntries != null) { 65719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries); 65819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } else { 65919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = null; 66019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 661e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn notifyDataSetChanged(); 662309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 66319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 66419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (entries == null) { 66519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mWaitingForData = true; 666309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.setVisibility(View.INVISIBLE); 667309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.setVisibility(View.VISIBLE); 66819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } else { 669309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.setVisibility(View.VISIBLE); 670309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.setVisibility(View.GONE); 67119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 672afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 673afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 674e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix, 675e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> origEntries) { 676e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (prefix == null || prefix.length() == 0) { 677e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return origEntries; 678afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 679e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn String prefixStr = ApplicationsState.normalize(prefix.toString()); 680e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn final String spacePrefixStr = " " + prefixStr; 681e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> newEntries 682e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn = new ArrayList<ApplicationsState.AppEntry>(); 683e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn for (int i=0; i<origEntries.size(); i++) { 684e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = origEntries.get(i); 685e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn String nlabel = entry.getNormalizedLabel(); 686e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) { 687e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn newEntries.add(entry); 688ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 689ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 690e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return newEntries; 691afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 692afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 693ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu 694e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 695e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onRunningStateChanged(boolean running) { 696309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mOwner.getActivity().setProgressBarIndeterminateVisibility(running); 697afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 698b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 699e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 70019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void onRebuildComplete(ArrayList<AppEntry> apps) { 701309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mTab.mLoadingContainer.getVisibility() == View.VISIBLE) { 702309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.startAnimation(AnimationUtils.loadAnimation( 703309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContext, android.R.anim.fade_out)); 704309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.startAnimation(AnimationUtils.loadAnimation( 705309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContext, android.R.anim.fade_in)); 7064e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn } 707309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.setVisibility(View.VISIBLE); 708309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.setVisibility(View.GONE); 70919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mWaitingForData = false; 71019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mBaseEntries = apps; 71119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries); 71219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn notifyDataSetChanged(); 713309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 71419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 71519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 71619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn @Override 717e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageListChanged() { 71819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 719afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 720b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 721e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 722e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageIconChanged() { 723e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // We ensure icons are loaded when their item is displayed, so 724e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // don't care about icons loaded in the background. 725afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 726b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 727e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 728e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageSizeChanged(String packageName) { 729e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 730e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag(); 731e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (holder.entry.info.packageName.equals(packageName)) { 732e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn synchronized (holder.entry) { 733309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize); 734c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 735309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (holder.entry.info.packageName.equals(mTab.mOwner.mCurrentPkgName) 736e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn && mLastSortMode == SORT_ORDER_SIZE) { 737e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // We got the size information for the last app the 738e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // user viewed, and are sorting by size... they may 739e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // have cleared data, so we immediately want to resort 740e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // the list with the new size to reflect it to the user. 74119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 742c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 743309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 744e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return; 745c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 746c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 747c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 748c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 749e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 750e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onAllSizesComputed() { 751e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mLastSortMode == SORT_ORDER_SIZE) { 75219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 753afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 754a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTab.updateStorageUsage(); 755afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 756afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 757afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getCount() { 758e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries != null ? mEntries.size() : 0; 759afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 760afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 761afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public Object getItem(int position) { 762e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position); 763afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 764afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 765e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public ApplicationsState.AppEntry getAppEntry(int position) { 766e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position); 767afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 768afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 769afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public long getItemId(int position) { 770e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position).id; 771afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 772afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 773afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 774347c9a0544328e65120582834ce330fb0d473f28Jeff Brown // A ViewHolder keeps references to children views to avoid unnecessary calls 775afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // to findViewById() on each row. 776309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn AppViewHolder holder = AppViewHolder.createOrRecycle(mTab.mInflater, convertView); 7779244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn convertView = holder.rootView; 778afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 779afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Bind the data efficiently with the holder 780e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = mEntries.get(position); 781e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn synchronized (entry) { 782e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.entry = entry; 783e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.label != null) { 784e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.appName.setText(entry.label); 785afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 786e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState.ensureIcon(entry); 787e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.icon != null) { 788e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.appIcon.setImageDrawable(entry.icon); 789afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 790309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize); 7913db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if ((entry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0) { 7923db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn holder.disabled.setVisibility(View.VISIBLE); 7933db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn holder.disabled.setText(R.string.not_installed); 7943db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (!entry.info.enabled) { 7953db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn holder.disabled.setVisibility(View.VISIBLE); 7963db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn holder.disabled.setText(R.string.disabled); 79744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn } else { 79844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn holder.disabled.setVisibility(View.GONE); 79944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn } 800309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mFilterMode == FILTER_APPS_SDCARD) { 8016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setVisibility(View.VISIBLE); 8026dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setChecked((entry.info.flags 8036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0); 8046dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } else { 8056dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setVisibility(View.GONE); 8066dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 807afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 808e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.remove(convertView); 809e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.add(convertView); 810afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return convertView; 811afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 812c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 813e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 814c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu public Filter getFilter() { 815e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mFilter; 816c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 817c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 818e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 819e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onMovedToScrapHeap(View view) { 820e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.remove(view); 821728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 822728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 823728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 824afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 825f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreate(Bundle savedInstanceState) { 826afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 827f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 828f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn setHasOptionsMenu(true); 829f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 830f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication()); 831f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Intent intent = getActivity().getIntent(); 832ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu String action = intent.getAction(); 8337a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani int defaultListType = LIST_TYPE_DOWNLOADED; 834ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn String className = getArguments() != null 835ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ? getArguments().getString("classname") : null; 836ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (className == null) { 837ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn className = intent.getComponent().getClassName(); 838ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 839af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani if (className.equals(RunningServicesActivity.class.getName()) 840af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || className.endsWith(".RunningServices")) { 8417a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_RUNNING; 8425203bdffe6ce2b829d0fab8c7691fa92aca6e972Amith Yamasani } else if (className.equals(StorageUseActivity.class.getName()) 843af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || Intent.ACTION_MANAGE_PACKAGE_STORAGE.equals(action) 844af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || className.endsWith(".StorageUse")) { 845afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSortOrder = SORT_ORDER_SIZE; 8467a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_ALL; 847762eaa77e3e12d5337ddc9cb87b473c47af5524aKenny Root } else if (Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)) { 8487a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani // Select the all-apps list, with the default sorting 8497a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_ALL; 850afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8517a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 852728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (savedInstanceState != null) { 85302c22131e93e1a506141b1890c7134909ded876fAmith Yamasani mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder); 8547a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani int tmp = savedInstanceState.getInt(EXTRA_DEFAULT_LIST_TYPE, -1); 8557a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani if (tmp != -1) defaultListType = tmp; 85602c22131e93e1a506141b1890c7134909ded876fAmith Yamasani mShowBackground = savedInstanceState.getBoolean(EXTRA_SHOW_BACKGROUND, false); 857728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 8587a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 8597a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani mDefaultListType = defaultListType; 8603b7dbcecf70788df4950340cbf750dbe524dca96Amith Yamasani 86144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey final Intent containerIntent = new Intent().setComponent( 86244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey StorageMeasurement.DEFAULT_CONTAINER_COMPONENT); 86344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE); 8641337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 865f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value); 866f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mComputingSizeStr = getActivity().getText(R.string.computing_size); 867f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 868a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn TabInfo tab = new TabInfo(this, mApplicationsState, 869309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_third_party), 870309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_DOWNLOADED, this, savedInstanceState); 871309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 872f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 873309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (!Environment.isExternalStorageEmulated()) { 874a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 875309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_onsdcard), 876309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_SDCARD, this, savedInstanceState); 877309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 878508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 8797a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 880a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 881309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_running), 882309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_RUNNING, this, savedInstanceState); 883309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 8847a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 885a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 886309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_all), 887309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_ALL, this, savedInstanceState); 888309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 88918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn 89018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn tab = new TabInfo(this, mApplicationsState, 89118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn getActivity().getString(R.string.filter_apps_disabled), 89218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn LIST_TYPE_DISABLED, this, savedInstanceState); 89318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn mTabs.add(tab); 89418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn 89518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn mNumTabs = mTabs.size(); 896309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 8977a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 8987a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 899309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 900309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 901309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // initialize the inflater 902309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInflater = inflater; 9037a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 904309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn View rootView = mInflater.inflate(R.layout.manage_applications_content, 905309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn container, false); 906309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContentContainer = container; 907309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRootView = rootView; 9087a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 909309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager = (ViewPager) rootView.findViewById(R.id.pager); 910309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn MyPagerAdapter adapter = new MyPagerAdapter(); 911309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager.setAdapter(adapter); 912309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager.setOnPageChangeListener(adapter); 913309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs); 914309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn tabs.setTabIndicatorColorResource(android.R.color.holo_blue_light); 9157a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 916a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // We have to do this now because PreferenceFrameLayout looks at it 917a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // only when the view is added. 918a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (container instanceof PreferenceFrameLayout) { 919a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true; 920a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 921a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 92214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) { 92314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn buildResetDialog(); 92414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 92514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 92613ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn if (savedInstanceState == null) { 92713ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn // First time init: make sure view pager is showing the correct tab. 92813ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn for (int i = 0; i < mTabs.size(); i++) { 92913ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn TabInfo tab = mTabs.get(i); 93013ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn if (tab.mListType == mDefaultListType) { 93113ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn mViewPager.setCurrentItem(i); 93213ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn break; 93313ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn } 93413ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn } 93513ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn } 93613ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn 937309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return rootView; 938afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 939f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 940f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu @Override 941728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public void onStart() { 942728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onStart(); 943b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu } 944b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 945afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 946f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onResume() { 947728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onResume(); 948728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = true; 949309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateCurrentTab(mViewPager.getCurrentItem()); 950f5f08628cc0129e92277d6ddfcf6ae680887573dDianne Hackborn updateNumTabs(); 951ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 952afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 953b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 954728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 955f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onSaveInstanceState(Bundle outState) { 956728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onSaveInstanceState(outState); 95702c22131e93e1a506141b1890c7134909ded876fAmith Yamasani outState.putInt(EXTRA_SORT_ORDER, mSortOrder); 9587a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani if (mDefaultListType != -1) { 9597a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani outState.putInt(EXTRA_DEFAULT_LIST_TYPE, mDefaultListType); 960f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 96102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani outState.putBoolean(EXTRA_SHOW_BACKGROUND, mShowBackground); 96214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog != null) { 96314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn outState.putBoolean(EXTRA_RESET_DIALOG, true); 96414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 965728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 966728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 967728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 968f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onPause() { 969728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onPause(); 970728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = false; 971309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 972309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.get(i).pause(); 973728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 974728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 975728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 976728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 97714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onStop() { 97814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn super.onStop(); 97914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog != null) { 98014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog.dismiss(); 98114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = null; 98214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 98314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 98414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 98514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 986a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void onDestroyView() { 987a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn super.onDestroyView(); 988a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 989a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // We are going to keep the tab data structures around, but they 990a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // are no longer attached to their view hierarchy. 991a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 992a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTabs.get(i).detachView(); 993a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 994a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 995a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 996a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn @Override 997f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 998728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) { 999e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsState.requestSize(mCurrentPkgName); 1000ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 1001afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 10027a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 100318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn private void updateNumTabs() { 100418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn int newNum = mApplicationsState.haveDisabledApps() ? mTabs.size() : (mTabs.size()-1); 100518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn if (newNum != mNumTabs) { 100618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn mNumTabs = newNum; 100718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn if (mViewPager != null) { 100818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn mViewPager.getAdapter().notifyDataSetChanged(); 100918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn } 101018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn } 101118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn } 101218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn 1013309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tabForType(int type) { 1014309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i = 0; i < mTabs.size(); i++) { 1015309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(i); 1016309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (tab.mListType == type) { 1017309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return tab; 1018309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 10197a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 1020309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return null; 10217a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 10227a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 1023afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // utility method used to start sub activity 1024afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void startApplicationDetailsActivity() { 1025f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // start new fragment to display extended information 1026f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Bundle args = new Bundle(); 1027f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mCurrentPkgName); 1028f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 1029f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn PreferenceActivity pa = (PreferenceActivity)getActivity(); 1030ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn pa.startPreferencePanel(InstalledAppDetails.class.getName(), args, 1031ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn R.string.application_info_label, null, this, INSTALLED_APP_DETAILS); 1032afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1033afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1034afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1035f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1036ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu = menu; 10370385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn // note: icons removed for now because the cause the new action 10380385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn // bar UI to be very confusing. 1039afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha) 10400385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn //.setIcon(android.R.drawable.ic_menu_sort_alphabetically) 1041348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1042afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size) 10430385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn //.setIcon(android.R.drawable.ic_menu_sort_by_size) 1044348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1045ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services) 1046ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 1047ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes) 1048ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 104914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn menu.add(0, RESET_APP_PREFERENCES, 4, R.string.reset_app_preferences) 105014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1051ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1052afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1053afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1054afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1055f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 1056ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1057ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 1058ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 1059ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn @Override 1060ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onDestroyOptionsMenu() { 1061ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu = null; 1062ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 106344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 106444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 106544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onDestroy() { 106644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey getActivity().unbindService(mContainerConnection); 106744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey super.onDestroy(); 106844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 106944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 1070ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn void updateOptionsMenu() { 1071ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (mOptionsMenu == null) { 1072ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return; 1073ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 1074ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 1075673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root /* 1076673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root * The running processes screen doesn't use the mApplicationsAdapter 1077673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root * so bringing up this menu in that case doesn't make any sense. 1078673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root */ 1079309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mListType == LIST_TYPE_RUNNING) { 1080309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = tabForType(LIST_TYPE_RUNNING); 1081309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn boolean showingBackground = tab != null && tab.mRunningProcessesView != null 1082309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ? tab.mRunningProcessesView.mAdapter.getShowBackground() : false; 1083ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false); 1084ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false); 1085ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground); 1086ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground); 108714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false); 10881337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else { 1089ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA); 1090ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE); 1091ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false); 1092ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false); 109314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(true); 109414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 109514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 109614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 109714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn void buildResetDialog() { 109814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == null) { 109914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 110014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setTitle(R.string.reset_app_preferences_title); 110114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setMessage(R.string.reset_app_preferences_desc); 110214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setPositiveButton(R.string.reset_app_preferences_button, this); 110314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setNegativeButton(R.string.cancel, null); 110414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = builder.show(); 110514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog.setOnDismissListener(this); 110614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 110714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 110814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 110914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 111014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onDismiss(DialogInterface dialog) { 111114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == dialog) { 111214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = null; 111314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 111414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 111514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 111614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 111714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 111814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onClick(DialogInterface dialog, int which) { 111914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == dialog) { 112014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final PackageManager pm = getActivity().getPackageManager(); 1121596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn final IPackageManager mIPm = IPackageManager.Stub.asInterface( 1122a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn ServiceManager.getService("package")); 112314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final INotificationManager nm = INotificationManager.Stub.asInterface( 112414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 112514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final NetworkPolicyManager npm = NetworkPolicyManager.from(getActivity()); 1126a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn final AppOpsManager aom = (AppOpsManager)getActivity().getSystemService( 1127a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn Context.APP_OPS_SERVICE); 112814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final Handler handler = new Handler(getActivity().getMainLooper()); 112914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn (new AsyncTask<Void, Void, Void>() { 113014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override protected Void doInBackground(Void... params) { 113114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn List<ApplicationInfo> apps = pm.getInstalledApplications( 113214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.GET_DISABLED_COMPONENTS); 113314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn for (int i=0; i<apps.size(); i++) { 113414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ApplicationInfo app = apps.get(i); 113514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn try { 113614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName); 1137df3f6d6c4722a7acc8189e47d0499aaf618969f9Daniel Sandler nm.setNotificationsEnabledForPackage(app.packageName, app.uid, true); 113814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } catch (android.os.RemoteException ex) { 113914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 114014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (!app.enabled) { 114114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName); 114214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (pm.getApplicationEnabledSetting(app.packageName) 114314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) { 114414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn pm.setApplicationEnabledSetting(app.packageName, 114514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 114614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.DONT_KILL_APP); 114714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 114814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 114914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 1150596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn try { 1151596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn mIPm.resetPreferredActivities(UserHandle.myUserId()); 1152596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn } catch (RemoteException e) { 115314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 1154a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn aom.resetAllModes(); 115538305fb1777147cbcb86774c466e88434daff141Jeff Sharkey final int[] restrictedUids = npm.getUidsWithPolicy( 115614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn POLICY_REJECT_METERED_BACKGROUND); 115738305fb1777147cbcb86774c466e88434daff141Jeff Sharkey final int currentUserId = ActivityManager.getCurrentUser(); 115838305fb1777147cbcb86774c466e88434daff141Jeff Sharkey for (int uid : restrictedUids) { 115938305fb1777147cbcb86774c466e88434daff141Jeff Sharkey // Only reset for current user 116038305fb1777147cbcb86774c466e88434daff141Jeff Sharkey if (UserHandle.getUserId(uid) == currentUserId) { 116138305fb1777147cbcb86774c466e88434daff141Jeff Sharkey if (DEBUG) Log.v(TAG, "Clearing data policy: " + uid); 116238305fb1777147cbcb86774c466e88434daff141Jeff Sharkey npm.setUidPolicy(uid, POLICY_NONE); 116338305fb1777147cbcb86774c466e88434daff141Jeff Sharkey } 116414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 116514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn handler.post(new Runnable() { 116614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override public void run() { 116714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Done clearing"); 116814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (getActivity() != null && mActivityResumed) { 116914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Updating UI!"); 1170309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1171309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(i); 1172309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (tab.mApplications != null) { 1173309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn tab.mApplications.pause(); 1174309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 1175309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 1176309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null) { 1177309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.resume(mSortOrder); 1178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 117914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 118014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 118114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn }); 118214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn return null; 118314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 118414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn }).execute(); 1185673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root } 1186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 1190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int menuId = item.getItemId(); 1191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) { 1192e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mSortOrder = menuId; 1193309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mApplications != null) { 1194309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mApplications.rebuild(mSortOrder); 11951337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 11961337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (menuId == SHOW_RUNNING_SERVICES) { 11970385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mShowBackground = false; 1198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mRunningProcessesView != null) { 1199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mRunningProcessesView.mAdapter.setShowBackground(false); 1200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 12011337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (menuId == SHOW_BACKGROUND_PROCESSES) { 12020385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mShowBackground = true; 1203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mRunningProcessesView != null) { 1204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mRunningProcessesView.mAdapter.setShowBackground(true); 1205309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 120614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } else if (menuId == RESET_APP_PREFERENCES) { 120714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn buildResetDialog(); 1208f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani } else { 1209f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani // Handle the home button 1210f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani return false; 1211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1212ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 1214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1215d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn 1216a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void onItemClick(TabInfo tab, AdapterView<?> parent, View view, int position, 1217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long id) { 1218a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (tab.mApplications != null && tab.mApplications.getCount() > position) { 1219a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ApplicationsState.AppEntry entry = tab.mApplications.getAppEntry(position); 1220309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurrentPkgName = entry.info.packageName; 1221309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn startApplicationDetailsActivity(); 12221337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 1223309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 12241337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 1225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void updateCurrentTab(int position) { 1226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(position); 1227309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab = tab; 122844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 1229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Put things in the correct paused/resumed state. 1230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mActivityResumed) { 1231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.build(mInflater, mContentContainer, mRootView); 1232309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.resume(mSortOrder); 12331337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else { 1234309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.pause(); 12351337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 1236309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1237309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo t = mTabs.get(i); 1238309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (t != mCurTab) { 1239309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn t.pause(); 12401337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 12411337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 12421337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 1243309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.updateStorageUsage(); 1244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateOptionsMenu(); 1245a31be80ef056add00e0d239414f80f932978277fAdam Powell final Activity host = getActivity(); 1246a31be80ef056add00e0d239414f80f932978277fAdam Powell if (host != null) { 1247a31be80ef056add00e0d239414f80f932978277fAdam Powell host.invalidateOptionsMenu(); 1248a31be80ef056add00e0d239414f80f932978277fAdam Powell } 1249e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 1250e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 125144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey private volatile IMediaContainerService mContainerService; 125244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 125344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey private final ServiceConnection mContainerConnection = new ServiceConnection() { 125444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 125544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onServiceConnected(ComponentName name, IBinder service) { 125644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey mContainerService = IMediaContainerService.Stub.asInterface(service); 1257a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1258a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTabs.get(i).setContainerService(mContainerService); 1259309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 126044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 126144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 126244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 126344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onServiceDisconnected(ComponentName name) { 126444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey mContainerService = null; 126544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 126644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey }; 1267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 1268