1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport static android.net.NetworkPolicyManager.POLICY_NONE; 2014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; 2138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu 22a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.app.Activity; 2338305fb1777147cbcb86774c466e88434daff141Jeff Sharkeyimport android.app.ActivityManager; 2414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.AlertDialog; 25a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackbornimport android.app.AppOpsManager; 26f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment; 2714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.INotificationManager; 2844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ComponentName; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 3014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.DialogInterface; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 3244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ServiceConnection; 3319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport android.content.pm.ApplicationInfo; 346dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.IPackageManager; 356dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.PackageInfo; 3614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.pm.PackageManager; 3714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.net.NetworkPolicyManager; 3814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.AsyncTask; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 401337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.os.Environment; 4114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.Handler; 4244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.os.IBinder; 436dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.RemoteException; 446dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.ServiceManager; 4538305fb1777147cbcb86774c466e88434daff141Jeff Sharkeyimport android.os.UserHandle; 46c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport android.os.UserManager; 47a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackbornimport android.preference.PreferenceFrameLayout; 48c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport android.provider.Settings; 49309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerAdapter; 50309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerTabStrip; 51309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.ViewPager; 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater; 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu; 55f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.MenuInflater; 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem; 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup; 59ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackbornimport android.view.animation.AnimationUtils; 60e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView; 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView; 62a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.widget.AdapterView.OnItemClickListener; 63c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport android.widget.AdapterView.OnItemSelectedListener; 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter; 65c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filter; 66c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filterable; 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView; 68c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport android.widget.Spinner; 69b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 7044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.internal.app.IMediaContainerService; 71b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.internal.content.PackageHelper; 72b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.R; 73263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglioimport com.android.settings.SettingsActivity; 74c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport com.android.settings.UserSpinnerAdapter; 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, 139c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina DialogInterface.OnDismissListener, OnItemSelectedListener { 14002c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 141e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final String TAG = "ManageApplications"; 142e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final boolean DEBUG = false; 14302c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 144f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina private static final String EXTRA_LIST_TYPE = "currentListType"; 14502c22131e93e1a506141b1890c7134909ded876fAmith Yamasani private static final String EXTRA_SORT_ORDER = "sortOrder"; 14602c22131e93e1a506141b1890c7134909ded876fAmith Yamasani private static final String EXTRA_SHOW_BACKGROUND = "showBackground"; 1477a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani private static final String EXTRA_DEFAULT_LIST_TYPE = "defaultListType"; 14814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn private static final String EXTRA_RESET_DIALOG = "resetDialog"; 14902c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // attributes used as keys when passing values to InstalledAppDetails activity 15138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu public static final String APP_CHG = "chg"; 15202c22131e93e1a506141b1890c7134909ded876fAmith Yamasani 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // constant value that can be used to check return code from sub activity. 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int INSTALLED_APP_DETAILS = 1; 155d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn 156bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_TOTAL = 0; 157bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_INTERNAL = 1; 158bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_EXTERNAL = 2; 159bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // sort order that can be changed through the menu can be sorted alphabetically 161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // or size(descending) 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int MENU_OPTIONS_BASE = 0; 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Filter options used for displayed list of applications 1646cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0; 165728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1; 166728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2; 16718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn public static final int FILTER_APPS_DISABLED = MENU_OPTIONS_BASE + 3; 168747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu 1696cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4; 1706cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5; 1711337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6; 1721337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7; 17314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 8; 174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // sort order 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private int mSortOrder = SORT_ORDER_ALPHA; 176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 177e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ApplicationsState mApplicationsState; 178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 179309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public static class TabInfo implements OnItemClickListener { 180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final ManageApplications mOwner; 181309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final ApplicationsState mApplicationsState; 182309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mLabel; 183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final int mListType; 184309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final int mFilter; 185a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public final AppClickListener mClickListener; 186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mInvalidSizeStr; 187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public final CharSequence mComputingSizeStr; 188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final Bundle mSavedInstanceState; 189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 190309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public ApplicationsAdapter mApplications; 191309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public LayoutInflater mInflater; 192309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View mRootView; 193309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 194a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn private IMediaContainerService mContainerService; 195a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mLoadingContainer; 197309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mListContainer; 199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // ListView used to display list 201309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ListView mListView; 202309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Custom view used to display running processes 203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private RunningProcessesView mRunningProcessesView; 204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 205fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn //private LinearColorBar mColorBar; 206fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn //private TextView mStorageChartLabel; 207fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn //private TextView mUsedStorageText; 208fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn //private TextView mFreeStorageText; 209a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn private long mFreeStorage = 0, mAppStorage = 0, mTotalStorage = 0; 210309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage; 211309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 212309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final Runnable mRunningProcessesAvail = new Runnable() { 213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void run() { 214309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn handleRunningProcessesAvail(); 215309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 216309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn }; 217309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 218309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public TabInfo(ManageApplications owner, ApplicationsState apps, 219a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn CharSequence label, int listType, AppClickListener clickListener, 220309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Bundle savedInstanceState) { 221309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner = owner; 222309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mApplicationsState = apps; 223309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLabel = label; 224309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mListType = listType; 225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn switch (listType) { 226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn case LIST_TYPE_DOWNLOADED: mFilter = FILTER_APPS_THIRD_PARTY; break; 227309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn case LIST_TYPE_SDCARD: mFilter = FILTER_APPS_SDCARD; break; 22818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn case LIST_TYPE_DISABLED: mFilter = FILTER_APPS_DISABLED; break; 229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn default: mFilter = FILTER_APPS_ALL; break; 230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mClickListener = clickListener; 232309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInvalidSizeStr = owner.getActivity().getText(R.string.invalid_size_value); 233309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mComputingSizeStr = owner.getActivity().getText(R.string.computing_size); 234309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSavedInstanceState = savedInstanceState; 235309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 236309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 237a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void setContainerService(IMediaContainerService containerService) { 238a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mContainerService = containerService; 239a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn updateStorageUsage(); 240a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 241a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 242309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View build(LayoutInflater inflater, ViewGroup contentParent, View contentChild) { 243309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mRootView != null) { 244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mRootView; 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); 268fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn //mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar); 269fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn //mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel); 270fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn //mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText); 271fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn //mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText); 272309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false); 273a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mFilter == FILTER_APPS_SDCARD) { 274fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn //mStorageChartLabel.setText(mOwner.getActivity().getText( 275fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn // R.string.sd_card_storage)); 276a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } else { 277fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn //mStorageChartLabel.setText(mOwner.getActivity().getText( 278fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne 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 324f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su public void release() { 325f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su if (mApplications != null) { 326f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su mApplications.release(); 327f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su } 328f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su } 329f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su 330309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn void updateStorageUsage() { 331309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Make sure a callback didn't come at an inopportune time. 332309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mOwner.getActivity() == null) return; 333309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Doesn't make sense for stuff that is not an app list. 334309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications == null) return; 335309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 336a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = 0; 337a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage = 0; 338a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = 0; 339309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 340309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mFilter == FILTER_APPS_SDCARD) { 341309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mContainerService != null) { 342309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn try { 343309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final long[] stats = mContainerService.getFileSystemStats( 344309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Environment.getExternalStorageDirectory().getPath()); 345a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = stats[0]; 346a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = stats[1]; 347309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } catch (RemoteException e) { 348309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Log.w(TAG, "Problem in container service", e); 349309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 350309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 351309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 352309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 353309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final int N = mApplications.getCount(); 354309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<N; i++) { 355309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ApplicationsState.AppEntry ae = mApplications.getAppEntry(i); 3561f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mAppStorage += ae.externalCodeSize + ae.externalDataSize 3571f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn + ae.externalCacheSize; 358309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 359309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 360309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } else { 361309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mContainerService != null) { 362309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn try { 363309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final long[] stats = mContainerService.getFileSystemStats( 364309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Environment.getDataDirectory().getPath()); 365a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTotalStorage = stats[0]; 366a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage = stats[1]; 367309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } catch (RemoteException e) { 368309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn Log.w(TAG, "Problem in container service", e); 369309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 370309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 371309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 372309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final boolean emulatedStorage = Environment.isExternalStorageEmulated(); 373309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mApplications != null) { 374309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn final int N = mApplications.getCount(); 375309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<N; i++) { 376309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ApplicationsState.AppEntry ae = mApplications.getAppEntry(i); 377a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage += ae.codeSize + ae.dataSize; 378309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (emulatedStorage) { 379a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage += ae.externalCodeSize + ae.externalDataSize; 380309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 381309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 382309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 383a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mFreeStorage += mApplicationsState.sumCacheSizes(); 384309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 385a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 386a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn applyCurrentStorage(); 387a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 388a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 389a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn void applyCurrentStorage() { 390a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // If view hierarchy is not yet created, no views to update. 391a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mRootView == null) { 392a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn return; 393309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 394fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn /* 395a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mTotalStorage > 0) { 39637f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio BidiFormatter bidiFormatter = BidiFormatter.getInstance(); 397a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mColorBar.setRatios((mTotalStorage-mFreeStorage-mAppStorage)/(float)mTotalStorage, 398a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mAppStorage/(float)mTotalStorage, mFreeStorage/(float)mTotalStorage); 399a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn long usedStorage = mTotalStorage - mFreeStorage; 400309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mLastUsedStorage != usedStorage) { 401309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLastUsedStorage = usedStorage; 40237f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio String sizeStr = bidiFormatter.unicodeWrap( 40337f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio Formatter.formatShortFileSize(mOwner.getActivity(), usedStorage)); 404309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mUsedStorageText.setText(mOwner.getActivity().getResources().getString( 405309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn R.string.service_foreground_processes, sizeStr)); 406309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 407a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (mLastFreeStorage != mFreeStorage) { 408a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mLastFreeStorage = mFreeStorage; 40937f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio String sizeStr = bidiFormatter.unicodeWrap( 41037f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio Formatter.formatShortFileSize(mOwner.getActivity(), mFreeStorage)); 411309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFreeStorageText.setText(mOwner.getActivity().getResources().getString( 412309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn R.string.service_background_processes, sizeStr)); 413309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 414309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } else { 415309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mColorBar.setRatios(0, 0, 0); 416309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mLastUsedStorage != -1) { 417309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLastUsedStorage = -1; 418309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mUsedStorageText.setText(""); 419309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 420309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mLastFreeStorage != -1) { 421309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLastFreeStorage = -1; 422309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFreeStorageText.setText(""); 423309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 424309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 425fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn */ 426309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 427309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 428309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 429309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 430a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mClickListener.onItemClick(this, parent, view, position, id); 431309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 432309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 433309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn void handleRunningProcessesAvail() { 434309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.startAnimation(AnimationUtils.loadAnimation( 435309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner.getActivity(), android.R.anim.fade_out)); 436309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation( 437309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mOwner.getActivity(), android.R.anim.fade_in)); 438309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRunningProcessesView.setVisibility(View.VISIBLE); 439309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mLoadingContainer.setVisibility(View.GONE); 440309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 441309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 442309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 44318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn private int mNumTabs; 444309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo mCurTab = null; 445309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Size resource used for packages whose size computation failed for some reason 4479244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn CharSequence mInvalidSizeStr; 448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingSizeStr; 449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 450afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // layout inflater object used to inflate views 451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private LayoutInflater mInflater; 452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 453de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private String mCurrentPkgName; 454afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 455ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn private Menu mOptionsMenu; 4567a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 4577a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani // These are for keeping track of activity and spinner switch state. 458728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private boolean mActivityResumed; 459f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina 460f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina private static final int LIST_TYPE_MISSING = -1; 4617a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_DOWNLOADED = 0; 4627a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_RUNNING = 1; 4637a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_SDCARD = 2; 4647a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani static final int LIST_TYPE_ALL = 3; 46518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn static final int LIST_TYPE_DISABLED = 4; 466f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 4670385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn private boolean mShowBackground = false; 4680385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn 4697a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani private int mDefaultListType = -1; 470f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 471309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ViewGroup mContentContainer; 472309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private View mRootView; 473309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ViewPager mViewPager; 474aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina private ViewGroup mPinnedHeader; 475c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina private UserSpinnerAdapter mProfileSpinnerAdapter; 47606cd50177a4eddf6e8fc86a5b935f6985d8d82c9Alexandra Gherghina private Spinner mSpinner; 477c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina private Context mContext; 478f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 47914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn AlertDialog mResetDialog; 48014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 481309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn class MyPagerAdapter extends PagerAdapter 482309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn implements ViewPager.OnPageChangeListener { 483309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn int mCurPos = 0; 484309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 485309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 486309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public int getCount() { 48718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn return mNumTabs; 488309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 489309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 490309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 491309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public Object instantiateItem(ViewGroup container, int position) { 492309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(position); 493309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn View root = tab.build(mInflater, mContentContainer, mRootView); 494309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn container.addView(root); 49518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn root.setTag(R.id.name, tab); 496309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return root; 497309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 498309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 499309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 500309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void destroyItem(ViewGroup container, int position, Object object) { 501309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn container.removeView((View)object); 502ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn } 503ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn 504309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 505309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public boolean isViewFromObject(View view, Object object) { 506309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return view == object; 507309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 5087a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 509309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 51018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn public int getItemPosition(Object object) { 51118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn return super.getItemPosition(object); 51218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn //return ((TabInfo)((View)object).getTag(R.id.name)).mListType; 51318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn } 51418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn 51518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn @Override 516309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public CharSequence getPageTitle(int position) { 517309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return mTabs.get(position).mLabel; 518309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 519309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 520309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 521309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 522309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 523309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 524309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 525309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onPageSelected(int position) { 526309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurPos = position; 527309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 528309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn 529309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 530309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void onPageScrollStateChanged(int state) { 531309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (state == ViewPager.SCROLL_STATE_IDLE) { 532309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateCurrentTab(mCurPos); 533309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 5347a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 5357a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 5367a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 537e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project /* 538e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * Custom adapter implementation for the ListView 539e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * This adapter maintains a map for each displayed application and its properties 540e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * An index value on each AppInfo object indicates the correct position or index 541e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * in the list. If the list gets updated dynamically when the user is viewing the list of 542e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * applications, we need to return the correct index of position. This is done by mapping 543e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * the getId methods via the package name into the internal maps and indices. 544e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * The order of applications in the list is mirrored in mAppLocalList 545e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project */ 546309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn static class ApplicationsAdapter extends BaseAdapter implements Filterable, 547e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.Callbacks, AbsListView.RecyclerListener { 548e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private final ApplicationsState mState; 549309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final ApplicationsState.Session mSession; 550309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final TabInfo mTab; 551309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final Context mContext; 552e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private final ArrayList<View> mActive = new ArrayList<View>(); 553309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private final int mFilterMode; 554e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ArrayList<ApplicationsState.AppEntry> mBaseEntries; 555e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ArrayList<ApplicationsState.AppEntry> mEntries; 556e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private boolean mResumed; 557309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private int mLastSortMode=-1; 55819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn private boolean mWaitingForData; 559bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn private int mWhichSize = SIZE_TOTAL; 560e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn CharSequence mCurFilterPrefix; 561e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 562e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private Filter mFilter = new Filter() { 563e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 564e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn protected FilterResults performFiltering(CharSequence constraint) { 565e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> entries 566e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn = applyPrefixFilter(constraint, mBaseEntries); 567e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn FilterResults fr = new FilterResults(); 568e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn fr.values = entries; 569e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn fr.count = entries.size(); 570e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return fr; 571e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 572355b32faa924a0b39067dd759ba03e5af97065caSuchi Amalapurapu 573e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 574e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn protected void publishResults(CharSequence constraint, FilterResults results) { 575e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mCurFilterPrefix = constraint; 576e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values; 577e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn notifyDataSetChanged(); 578309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 579afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 580e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn }; 581c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 582309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public ApplicationsAdapter(ApplicationsState state, TabInfo tab, int filterMode) { 583e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState = state; 584309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession = state.newSession(this); 585309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab = tab; 586309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContext = tab.mOwner.getActivity(); 587309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mFilterMode = filterMode; 588c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 589e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 590309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void resume(int sort) { 591e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "Resume! mResumed=" + mResumed); 592e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (!mResumed) { 593e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumed = true; 594309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.resume(); 595e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastSortMode = sort; 59619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(true); 597e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } else { 598309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn rebuild(sort); 599c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 600e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 601c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 602e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void pause() { 603e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mResumed) { 604e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumed = false; 605309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.pause(); 606e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 607afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 608b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 609f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su public void release() { 610f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su mSession.release(); 611f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su } 612f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su 613309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void rebuild(int sort) { 614309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (sort == mLastSortMode) { 615e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return; 616e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 617e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastSortMode = sort; 61819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(true); 619afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 620afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 62119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void rebuild(boolean eraseold) { 622e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "Rebuilding app list..."); 623e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppFilter filterObj; 624e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn Comparator<AppEntry> comparatorObj; 625bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn boolean emulated = Environment.isExternalStorageEmulated(); 626bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn if (emulated) { 627bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_TOTAL; 628bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } else { 629bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_INTERNAL; 630bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 631309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn switch (mFilterMode) { 632e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case FILTER_APPS_THIRD_PARTY: 633e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = ApplicationsState.THIRD_PARTY_FILTER; 634e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 635e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case FILTER_APPS_SDCARD: 636e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = ApplicationsState.ON_SD_CARD_FILTER; 637bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn if (!emulated) { 638bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_EXTERNAL; 639bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 640e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 64118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn case FILTER_APPS_DISABLED: 64218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn filterObj = ApplicationsState.DISABLED_FILTER; 64318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn break; 644e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn default: 64518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn filterObj = ApplicationsState.ALL_ENABLED_FILTER; 646e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 647e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 648e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn switch (mLastSortMode) { 649e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case SORT_ORDER_SIZE: 650430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn switch (mWhichSize) { 651430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn case SIZE_INTERNAL: 652430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR; 653430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 654430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn case SIZE_EXTERNAL: 655430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.EXTERNAL_SIZE_COMPARATOR; 656430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 657430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn default: 658430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.SIZE_COMPARATOR; 659430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 660430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn } 661e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 662e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn default: 663e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn comparatorObj = ApplicationsState.ALPHA_COMPARATOR; 664e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 665e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 66619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn ArrayList<ApplicationsState.AppEntry> entries 667309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn = mSession.rebuild(filterObj, comparatorObj); 66819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (entries == null && !eraseold) { 66919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn // Don't have new list yet, but can continue using the old one. 67019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn return; 67119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 67219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mBaseEntries = entries; 67319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (mBaseEntries != null) { 67419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries); 67519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } else { 67619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = null; 67719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 678e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn notifyDataSetChanged(); 679309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 68019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 68119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (entries == null) { 68219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mWaitingForData = true; 683309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.setVisibility(View.INVISIBLE); 684309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.setVisibility(View.VISIBLE); 68519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } else { 686309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.setVisibility(View.VISIBLE); 687309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.setVisibility(View.GONE); 68819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 689afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 690afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 691e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix, 692e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> origEntries) { 693e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (prefix == null || prefix.length() == 0) { 694e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return origEntries; 695afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 696e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn String prefixStr = ApplicationsState.normalize(prefix.toString()); 697e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn final String spacePrefixStr = " " + prefixStr; 698e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> newEntries 699e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn = new ArrayList<ApplicationsState.AppEntry>(); 700e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn for (int i=0; i<origEntries.size(); i++) { 701e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = origEntries.get(i); 702e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn String nlabel = entry.getNormalizedLabel(); 703e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) { 704e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn newEntries.add(entry); 705ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 706ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 707e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return newEntries; 708afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 709afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 710ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu 711e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 712e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onRunningStateChanged(boolean running) { 713309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mOwner.getActivity().setProgressBarIndeterminateVisibility(running); 714afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 715b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 716e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 71719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void onRebuildComplete(ArrayList<AppEntry> apps) { 718309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mTab.mLoadingContainer.getVisibility() == View.VISIBLE) { 719309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.startAnimation(AnimationUtils.loadAnimation( 720309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContext, android.R.anim.fade_out)); 721309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.startAnimation(AnimationUtils.loadAnimation( 722309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContext, android.R.anim.fade_in)); 7234e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn } 724309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mListContainer.setVisibility(View.VISIBLE); 725309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.mLoadingContainer.setVisibility(View.GONE); 72619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mWaitingForData = false; 72719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mBaseEntries = apps; 72819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries); 72919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn notifyDataSetChanged(); 730309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 73119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 73219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 73319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn @Override 734e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageListChanged() { 73519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 736afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 737b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 738e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 739e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageIconChanged() { 740e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // We ensure icons are loaded when their item is displayed, so 741e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // don't care about icons loaded in the background. 742afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 743b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 744e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 745e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageSizeChanged(String packageName) { 746e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 747e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag(); 748e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (holder.entry.info.packageName.equals(packageName)) { 749e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn synchronized (holder.entry) { 750309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize); 751c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 752309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (holder.entry.info.packageName.equals(mTab.mOwner.mCurrentPkgName) 753e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn && mLastSortMode == SORT_ORDER_SIZE) { 754e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // We got the size information for the last app the 755e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // user viewed, and are sorting by size... they may 756e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // have cleared data, so we immediately want to resort 757e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // the list with the new size to reflect it to the user. 75819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 759c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 760309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTab.updateStorageUsage(); 761e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return; 762c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 763c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 764c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 765c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 766e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 767e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onAllSizesComputed() { 768e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mLastSortMode == SORT_ORDER_SIZE) { 76919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 770afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 771a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTab.updateStorageUsage(); 772afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 773afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 774afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getCount() { 775e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries != null ? mEntries.size() : 0; 776afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 777afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 778afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public Object getItem(int position) { 779e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position); 780afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 781afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 782e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public ApplicationsState.AppEntry getAppEntry(int position) { 783e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position); 784afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 785afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 786afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public long getItemId(int position) { 787e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position).id; 788afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 789afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 790afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 791347c9a0544328e65120582834ce330fb0d473f28Jeff Brown // A ViewHolder keeps references to children views to avoid unnecessary calls 792afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // to findViewById() on each row. 793309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn AppViewHolder holder = AppViewHolder.createOrRecycle(mTab.mInflater, convertView); 7949244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn convertView = holder.rootView; 795afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 796afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Bind the data efficiently with the holder 797e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = mEntries.get(position); 798e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn synchronized (entry) { 799e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.entry = entry; 800e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.label != null) { 801e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.appName.setText(entry.label); 802afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 803e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState.ensureIcon(entry); 804e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.icon != null) { 805e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.appIcon.setImageDrawable(entry.icon); 806afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 807309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize); 8083db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if ((entry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0) { 8093db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn holder.disabled.setVisibility(View.VISIBLE); 8103db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn holder.disabled.setText(R.string.not_installed); 8113db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (!entry.info.enabled) { 8123db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn holder.disabled.setVisibility(View.VISIBLE); 8133db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn holder.disabled.setText(R.string.disabled); 81444178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn } else { 81544178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn holder.disabled.setVisibility(View.GONE); 81644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn } 817309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mFilterMode == FILTER_APPS_SDCARD) { 8186dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setVisibility(View.VISIBLE); 8196dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setChecked((entry.info.flags 8206dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0); 8216dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } else { 8226dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setVisibility(View.GONE); 8236dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 824afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 825e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.remove(convertView); 826e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.add(convertView); 827afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return convertView; 828afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 829c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 830e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 831c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu public Filter getFilter() { 832e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mFilter; 833c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 834c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 835e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 836e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onMovedToScrapHeap(View view) { 837e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.remove(view); 838728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 839728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 840c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina 841afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 842f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreate(Bundle savedInstanceState) { 843afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 844f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 845f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn setHasOptionsMenu(true); 846f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 847c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina mContext = getActivity(); 848f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication()); 849f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Intent intent = getActivity().getIntent(); 850ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu String action = intent.getAction(); 8517a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani int defaultListType = LIST_TYPE_DOWNLOADED; 852ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn String className = getArguments() != null 853ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ? getArguments().getString("classname") : null; 854ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (className == null) { 855ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn className = intent.getComponent().getClassName(); 856ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 857af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani if (className.equals(RunningServicesActivity.class.getName()) 858af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || className.endsWith(".RunningServices")) { 8597a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_RUNNING; 8605203bdffe6ce2b829d0fab8c7691fa92aca6e972Amith Yamasani } else if (className.equals(StorageUseActivity.class.getName()) 861af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || Intent.ACTION_MANAGE_PACKAGE_STORAGE.equals(action) 862af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || className.endsWith(".StorageUse")) { 863afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSortOrder = SORT_ORDER_SIZE; 8647a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_ALL; 865263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio } else if (android.provider.Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)) { 8667a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani // Select the all-apps list, with the default sorting 8677a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani defaultListType = LIST_TYPE_ALL; 868afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8697a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 870728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (savedInstanceState != null) { 87102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder); 8727a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani int tmp = savedInstanceState.getInt(EXTRA_DEFAULT_LIST_TYPE, -1); 8737a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani if (tmp != -1) defaultListType = tmp; 87402c22131e93e1a506141b1890c7134909ded876fAmith Yamasani mShowBackground = savedInstanceState.getBoolean(EXTRA_SHOW_BACKGROUND, false); 875728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 8767a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 8777a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani mDefaultListType = defaultListType; 8783b7dbcecf70788df4950340cbf750dbe524dca96Amith Yamasani 87944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey final Intent containerIntent = new Intent().setComponent( 88044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey StorageMeasurement.DEFAULT_CONTAINER_COMPONENT); 88144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE); 8821337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 883f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value); 884f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mComputingSizeStr = getActivity().getText(R.string.computing_size); 885f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 886a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn TabInfo tab = new TabInfo(this, mApplicationsState, 887309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_third_party), 888309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_DOWNLOADED, this, savedInstanceState); 889309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 890f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 891309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (!Environment.isExternalStorageEmulated()) { 892a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 893309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_onsdcard), 894309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_SDCARD, this, savedInstanceState); 895309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 896508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 8977a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 898a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 899309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_running), 900309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_RUNNING, this, savedInstanceState); 901309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 9027a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 903a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn tab = new TabInfo(this, mApplicationsState, 904309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn getActivity().getString(R.string.filter_apps_all), 905309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn LIST_TYPE_ALL, this, savedInstanceState); 906309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.add(tab); 90718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn 90818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn tab = new TabInfo(this, mApplicationsState, 90918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn getActivity().getString(R.string.filter_apps_disabled), 91018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn LIST_TYPE_DISABLED, this, savedInstanceState); 91118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn mTabs.add(tab); 91218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn 91318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn mNumTabs = mTabs.size(); 914c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina 915c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 91680e1f1bfdb814a08fb8b07b2e279285d495042e9Alexandra Gherghina mProfileSpinnerAdapter = Utils.createUserSpinnerAdapter(um, mContext); 917309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 9187a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 9197a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 920309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn @Override 921309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 922309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // initialize the inflater 923309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mInflater = inflater; 9247a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 925309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn View rootView = mInflater.inflate(R.layout.manage_applications_content, 926309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn container, false); 927309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mContentContainer = container; 928309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mRootView = rootView; 929aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina mPinnedHeader = (ViewGroup) mRootView.findViewById(R.id.pinned_header); 930aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina if (mProfileSpinnerAdapter != null) { 931aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina mSpinner = (Spinner) inflater.inflate(R.layout.spinner_view, null); 932aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina mSpinner.setAdapter(mProfileSpinnerAdapter); 933aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina mSpinner.setOnItemSelectedListener(this); 934aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina mPinnedHeader.addView(mSpinner); 935aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina mPinnedHeader.setVisibility(View.VISIBLE); 936aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina } 937309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager = (ViewPager) rootView.findViewById(R.id.pager); 938309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn MyPagerAdapter adapter = new MyPagerAdapter(); 939309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager.setAdapter(adapter); 940309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mViewPager.setOnPageChangeListener(adapter); 941309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs); 942cc22af08117a2f90d879cc360f76de48fd234e0dFabrice Di Meglio tabs.setTabIndicatorColorResource(R.color.theme_accent); 9437a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 944a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // We have to do this now because PreferenceFrameLayout looks at it 945a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // only when the view is added. 946a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (container instanceof PreferenceFrameLayout) { 947a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true; 948a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 949a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 95014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) { 95114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn buildResetDialog(); 95214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 95314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 95413ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn if (savedInstanceState == null) { 95513ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn // First time init: make sure view pager is showing the correct tab. 956f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina int extraCurrentListType = getActivity().getIntent().getIntExtra(EXTRA_LIST_TYPE, 957f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina LIST_TYPE_MISSING); 958f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina int currentListType = (extraCurrentListType != LIST_TYPE_MISSING) 959f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina ? extraCurrentListType : mDefaultListType; 960f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina for (int i = 0; i < mNumTabs; i++) { 96113ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn TabInfo tab = mTabs.get(i); 962f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina if (tab.mListType == currentListType) { 96313ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn mViewPager.setCurrentItem(i); 96413ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn break; 96513ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn } 96613ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn } 96713ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn } 96813ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn 969309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return rootView; 970afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 971f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 972f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu @Override 973728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public void onStart() { 974728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onStart(); 975b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu } 976b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 977afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 978f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onResume() { 979728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onResume(); 980728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = true; 981309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateCurrentTab(mViewPager.getCurrentItem()); 982f5f08628cc0129e92277d6ddfcf6ae680887573dDianne Hackborn updateNumTabs(); 983ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 984afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 985b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 986728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 987f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onSaveInstanceState(Bundle outState) { 988728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onSaveInstanceState(outState); 98902c22131e93e1a506141b1890c7134909ded876fAmith Yamasani outState.putInt(EXTRA_SORT_ORDER, mSortOrder); 9907a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani if (mDefaultListType != -1) { 9917a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani outState.putInt(EXTRA_DEFAULT_LIST_TYPE, mDefaultListType); 992f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 99302c22131e93e1a506141b1890c7134909ded876fAmith Yamasani outState.putBoolean(EXTRA_SHOW_BACKGROUND, mShowBackground); 99414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog != null) { 99514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn outState.putBoolean(EXTRA_RESET_DIALOG, true); 99614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 997728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 998728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 999728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 1000f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onPause() { 1001728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onPause(); 1002728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = false; 1003309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1004309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mTabs.get(i).pause(); 1005728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 1006728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 1007728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 1008728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 100914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onStop() { 101014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn super.onStop(); 101114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog != null) { 101214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog.dismiss(); 101314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = null; 101414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 101514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 101614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 101714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 1018a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void onDestroyView() { 1019a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn super.onDestroyView(); 1020a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 1021a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // We are going to keep the tab data structures around, but they 1022a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn // are no longer attached to their view hierarchy. 1023a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1024a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTabs.get(i).detachView(); 1025f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su mTabs.get(i).release(); 1026a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 1027a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn } 1028a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn 1029a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn @Override 1030f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 1031728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) { 1032e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsState.requestSize(mCurrentPkgName); 1033ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 1034afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 10357a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 1036c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina @Override 1037c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 1038c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina UserHandle selectedUser = mProfileSpinnerAdapter.getUserHandle(position); 1039c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina if (selectedUser.getIdentifier() != UserHandle.myUserId()) { 1040c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina Intent intent = new Intent(Settings.ACTION_APPLICATION_SETTINGS); 1041c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 104256645002b2729c1f7696529e530164a031fb7978Alexandra Gherghina intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 1043f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina int currentTab = mViewPager.getCurrentItem(); 1044f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina intent.putExtra(EXTRA_LIST_TYPE, mTabs.get(currentTab).mListType); 1045c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina mContext.startActivityAsUser(intent, selectedUser); 104606cd50177a4eddf6e8fc86a5b935f6985d8d82c9Alexandra Gherghina // Go back to default selection, which is the first one; this makes sure that pressing 104706cd50177a4eddf6e8fc86a5b935f6985d8d82c9Alexandra Gherghina // the back button takes you into a consistent state 104806cd50177a4eddf6e8fc86a5b935f6985d8d82c9Alexandra Gherghina mSpinner.setSelection(0); 1049c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina } 1050c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina } 1051c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina 1052c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina @Override 1053c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina public void onNothingSelected(AdapterView<?> parent) { 1054c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina // Nothing to do 1055c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina } 1056c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina 105718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn private void updateNumTabs() { 105818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn int newNum = mApplicationsState.haveDisabledApps() ? mTabs.size() : (mTabs.size()-1); 105918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn if (newNum != mNumTabs) { 106018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn mNumTabs = newNum; 106118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn if (mViewPager != null) { 106218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn mViewPager.getAdapter().notifyDataSetChanged(); 106318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn } 106418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn } 106518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn } 106618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn 1067309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tabForType(int type) { 1068309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i = 0; i < mTabs.size(); i++) { 1069309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(i); 1070309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (tab.mListType == type) { 1071309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return tab; 1072309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 10737a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 1074309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn return null; 10757a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani } 10767a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani 1077afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // utility method used to start sub activity 1078afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void startApplicationDetailsActivity() { 1079f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // start new fragment to display extended information 1080f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Bundle args = new Bundle(); 1081f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mCurrentPkgName); 1082f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 1083263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio SettingsActivity sa = (SettingsActivity) getActivity(); 1084263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio sa.startPreferencePanel(InstalledAppDetails.class.getName(), args, 1085ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn R.string.application_info_label, null, this, INSTALLED_APP_DETAILS); 1086afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1087afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1088afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1089f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1090ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu = menu; 10910385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn // note: icons removed for now because the cause the new action 10920385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn // bar UI to be very confusing. 1093afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha) 10940385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn //.setIcon(android.R.drawable.ic_menu_sort_alphabetically) 1095348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1096afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size) 10970385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn //.setIcon(android.R.drawable.ic_menu_sort_by_size) 1098348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1099ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services) 1100ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 1101ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes) 1102ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 110314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn menu.add(0, RESET_APP_PREFERENCES, 4, R.string.reset_app_preferences) 110414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 1105ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1109f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 1110ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1111ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 1112ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 1113ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn @Override 1114ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onDestroyOptionsMenu() { 1115ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu = null; 1116ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 111744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 111844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 111944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onDestroy() { 112044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey getActivity().unbindService(mContainerConnection); 112144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey super.onDestroy(); 112244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 112344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 1124ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn void updateOptionsMenu() { 1125ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (mOptionsMenu == null) { 1126ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return; 1127ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 1128ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 1129673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root /* 1130673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root * The running processes screen doesn't use the mApplicationsAdapter 1131673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root * so bringing up this menu in that case doesn't make any sense. 1132673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root */ 1133309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mListType == LIST_TYPE_RUNNING) { 1134309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = tabForType(LIST_TYPE_RUNNING); 1135309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn boolean showingBackground = tab != null && tab.mRunningProcessesView != null 1136309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn ? tab.mRunningProcessesView.mAdapter.getShowBackground() : false; 1137ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false); 1138ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false); 1139ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground); 1140ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground); 114114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false); 1142eca1fc2cadb9c1f15ab042e2080a8b8eb40ab6faThiago VinÃcius Freire de Araújo Ribeiro mShowBackground = showingBackground; 11431337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else { 1144ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA); 1145ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE); 1146ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false); 1147ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false); 114814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(true); 114914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 115014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 115114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 115214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn void buildResetDialog() { 115314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == null) { 115414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 115514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setTitle(R.string.reset_app_preferences_title); 115614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setMessage(R.string.reset_app_preferences_desc); 115714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setPositiveButton(R.string.reset_app_preferences_button, this); 115814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn builder.setNegativeButton(R.string.cancel, null); 115914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = builder.show(); 116014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog.setOnDismissListener(this); 116114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 116214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 116314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 116414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 116514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onDismiss(DialogInterface dialog) { 116614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == dialog) { 116714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn mResetDialog = null; 116814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 116914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 117014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 117114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn 117214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override 117314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn public void onClick(DialogInterface dialog, int which) { 117414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (mResetDialog == dialog) { 117514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final PackageManager pm = getActivity().getPackageManager(); 1176596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn final IPackageManager mIPm = IPackageManager.Stub.asInterface( 1177a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn ServiceManager.getService("package")); 117814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final INotificationManager nm = INotificationManager.Stub.asInterface( 117914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 118014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final NetworkPolicyManager npm = NetworkPolicyManager.from(getActivity()); 1181a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn final AppOpsManager aom = (AppOpsManager)getActivity().getSystemService( 1182a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn Context.APP_OPS_SERVICE); 118314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn final Handler handler = new Handler(getActivity().getMainLooper()); 118414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn (new AsyncTask<Void, Void, Void>() { 118514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override protected Void doInBackground(Void... params) { 118614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn List<ApplicationInfo> apps = pm.getInstalledApplications( 118714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.GET_DISABLED_COMPONENTS); 118814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn for (int i=0; i<apps.size(); i++) { 118914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn ApplicationInfo app = apps.get(i); 119014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn try { 119114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName); 1192df3f6d6c4722a7acc8189e47d0499aaf618969f9Daniel Sandler nm.setNotificationsEnabledForPackage(app.packageName, app.uid, true); 119314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } catch (android.os.RemoteException ex) { 119414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 119514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (!app.enabled) { 119614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName); 119714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (pm.getApplicationEnabledSetting(app.packageName) 119814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) { 119914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn pm.setApplicationEnabledSetting(app.packageName, 120014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 120114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn PackageManager.DONT_KILL_APP); 120214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 120314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 120414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 1205596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn try { 1206596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn mIPm.resetPreferredActivities(UserHandle.myUserId()); 1207596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn } catch (RemoteException e) { 120814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 1209a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn aom.resetAllModes(); 121038305fb1777147cbcb86774c466e88434daff141Jeff Sharkey final int[] restrictedUids = npm.getUidsWithPolicy( 121114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn POLICY_REJECT_METERED_BACKGROUND); 121238305fb1777147cbcb86774c466e88434daff141Jeff Sharkey final int currentUserId = ActivityManager.getCurrentUser(); 121338305fb1777147cbcb86774c466e88434daff141Jeff Sharkey for (int uid : restrictedUids) { 121438305fb1777147cbcb86774c466e88434daff141Jeff Sharkey // Only reset for current user 121538305fb1777147cbcb86774c466e88434daff141Jeff Sharkey if (UserHandle.getUserId(uid) == currentUserId) { 121638305fb1777147cbcb86774c466e88434daff141Jeff Sharkey if (DEBUG) Log.v(TAG, "Clearing data policy: " + uid); 121738305fb1777147cbcb86774c466e88434daff141Jeff Sharkey npm.setUidPolicy(uid, POLICY_NONE); 121838305fb1777147cbcb86774c466e88434daff141Jeff Sharkey } 121914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 122014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn handler.post(new Runnable() { 122114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn @Override public void run() { 122214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Done clearing"); 122314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (getActivity() != null && mActivityResumed) { 122414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn if (DEBUG) Log.v(TAG, "Updating UI!"); 1225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(i); 1227309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (tab.mApplications != null) { 1228309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn tab.mApplications.pause(); 1229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 1230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 1231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null) { 1232309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.resume(mSortOrder); 1233309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 123414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 123514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 123614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn }); 123714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn return null; 123814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } 123914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn }).execute(); 1240673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root } 1241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 1245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int menuId = item.getItemId(); 1246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) { 1247e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mSortOrder = menuId; 1248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mApplications != null) { 1249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mApplications.rebuild(mSortOrder); 12501337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 12511337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (menuId == SHOW_RUNNING_SERVICES) { 12520385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mShowBackground = false; 1253309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mRunningProcessesView != null) { 1254309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mRunningProcessesView.mAdapter.setShowBackground(false); 1255309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 12561337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (menuId == SHOW_BACKGROUND_PROCESSES) { 12570385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mShowBackground = true; 1258309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mCurTab != null && mCurTab.mRunningProcessesView != null) { 1259309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.mRunningProcessesView.mAdapter.setShowBackground(true); 1260309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 126114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn } else if (menuId == RESET_APP_PREFERENCES) { 126214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn buildResetDialog(); 1263f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani } else { 1264f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani // Handle the home button 1265f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani return false; 1266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1267ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 1268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 1269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1270d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn 1271a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn public void onItemClick(TabInfo tab, AdapterView<?> parent, View view, int position, 1272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long id) { 1273a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn if (tab.mApplications != null && tab.mApplications.getCount() > position) { 1274a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn ApplicationsState.AppEntry entry = tab.mApplications.getAppEntry(position); 1275309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurrentPkgName = entry.info.packageName; 1276309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn startApplicationDetailsActivity(); 12771337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 1278309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 12791337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 1280309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn public void updateCurrentTab(int position) { 1281309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo tab = mTabs.get(position); 1282309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab = tab; 128344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 1284309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn // Put things in the correct paused/resumed state. 1285309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (mActivityResumed) { 1286309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.build(mInflater, mContentContainer, mRootView); 1287309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.resume(mSortOrder); 12881337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else { 1289309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.pause(); 12901337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 1291309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1292309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn TabInfo t = mTabs.get(i); 1293309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn if (t != mCurTab) { 1294309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn t.pause(); 12951337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 12961337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 12971337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 1298309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mCurTab.updateStorageUsage(); 1299309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn updateOptionsMenu(); 1300a31be80ef056add00e0d239414f80f932978277fAdam Powell final Activity host = getActivity(); 1301a31be80ef056add00e0d239414f80f932978277fAdam Powell if (host != null) { 1302a31be80ef056add00e0d239414f80f932978277fAdam Powell host.invalidateOptionsMenu(); 1303a31be80ef056add00e0d239414f80f932978277fAdam Powell } 1304e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 1305e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 130644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey private volatile IMediaContainerService mContainerService; 130744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 130844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey private final ServiceConnection mContainerConnection = new ServiceConnection() { 130944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 131044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onServiceConnected(ComponentName name, IBinder service) { 131144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey mContainerService = IMediaContainerService.Stub.asInterface(service); 1312a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn for (int i=0; i<mTabs.size(); i++) { 1313a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn mTabs.get(i).setContainerService(mContainerService); 1314309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn } 131544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 131644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey 131744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey @Override 131844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey public void onServiceDisconnected(ComponentName name) { 131944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey mContainerService = null; 132044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey } 132144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey }; 1322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 1323