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 19b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport static com.android.settings.Utils.prepareCustomPreferencesList; 2038b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu 21a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.app.Activity; 22f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 2519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport android.content.pm.ApplicationInfo; 266dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.IPackageManager; 276dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.PackageInfo; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 291337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.os.Environment; 306dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.RemoteException; 316dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.ServiceManager; 321337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.os.StatFs; 33f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.preference.PreferenceActivity; 34728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.provider.Settings; 351337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.text.format.Formatter; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu; 39f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.MenuInflater; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup; 43ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackbornimport android.view.animation.AnimationUtils; 44d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackbornimport android.view.inputmethod.InputMethodManager; 45e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView; 47a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.widget.AdapterView.OnItemClickListener; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter; 496dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.widget.CheckBox; 50c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filter; 51c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filterable; 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView; 5438b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapuimport android.widget.TabHost; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 56b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 57b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.internal.content.PackageHelper; 58b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.R; 59b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.RunningServicesActivity; 60b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.StorageUseActivity; 61b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.applications.ApplicationsState.AppEntry; 62b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Comparator; 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 666dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornfinal class CanBeOnSdCardChecker { 676dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn final IPackageManager mPm; 686dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn int mInstallLocation; 696dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 706dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn CanBeOnSdCardChecker() { 716dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mPm = IPackageManager.Stub.asInterface( 726dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn ServiceManager.getService("package")); 736dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 746dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 756dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn void init() { 766dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn try { 776dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mInstallLocation = mPm.getInstallLocation(); 786dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } catch (RemoteException e) { 796dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn Log.e("CanBeOnSdCardChecker", "Is Package Manager running?"); 806dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn return; 816dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 826dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 836dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 846dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn boolean check(ApplicationInfo info) { 856dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn boolean canBe = false; 866dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { 876dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn canBe = true; 886dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } else { 896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if ((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) == 0 && 906dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn (info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { 916dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if (info.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL || 926dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn info.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) { 936dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn canBe = true; 946dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } else if (info.installLocation 956dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) { 966dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if (mInstallLocation == PackageHelper.APP_INSTALL_EXTERNAL) { 976dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn // For apps with no preference and the default value set 986dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn // to install on sdcard. 996dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn canBe = true; 1006dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1026dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1046dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn return canBe; 1056dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 1066dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn} 1076dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to pick an application that will be used to display installation information and 110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * options to uninstall/delete user data for system applications. This activity 111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE 112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * intent. 113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 114f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class ManageApplications extends Fragment implements 115f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn OnItemClickListener, 116e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn TabHost.TabContentFactory, TabHost.OnTabChangeListener { 117e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final String TAG = "ManageApplications"; 118e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final boolean DEBUG = false; 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // attributes used as keys when passing values to InstalledAppDetails activity 12138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu public static final String APP_CHG = "chg"; 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // constant value that can be used to check return code from sub activity. 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int INSTALLED_APP_DETAILS = 1; 125d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn 126bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_TOTAL = 0; 127bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_INTERNAL = 1; 128bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn public static final int SIZE_EXTERNAL = 2; 129bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // sort order that can be changed through the menu can be sorted alphabetically 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // or size(descending) 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int MENU_OPTIONS_BASE = 0; 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Filter options used for displayed list of applications 1346cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0; 135728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1; 136728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2; 137747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu 1386cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4; 1396cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5; 1401337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6; 1411337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7; 142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // sort order 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private int mSortOrder = SORT_ORDER_ALPHA; 144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Filter value 145fe4a2bc43f45b14db62c67d7c2531a3d7f1b8590Suchi Amalapurapu private int mFilterApps = FILTER_APPS_THIRD_PARTY; 146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 147e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ApplicationsState mApplicationsState; 148e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ApplicationsAdapter mApplicationsAdapter; 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Size resource used for packages whose size computation failed for some reason 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mInvalidSizeStr; 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingSizeStr; 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // layout inflater object used to inflate views 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private LayoutInflater mInflater; 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 157de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private String mCurrentPkgName; 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 159ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn private View mLoadingContainer; 160ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn 161508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn private View mListContainer; 162508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // ListView used to display list 164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ListView mListView; 165728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Custom view used to display running processes 166728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private RunningProcessesView mRunningProcessesView; 167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1681337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn LinearColorBar mColorBar; 1691337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn TextView mStorageChartLabel; 1701337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn TextView mUsedStorageText; 1711337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn TextView mFreeStorageText; 1721337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 173ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn private Menu mOptionsMenu; 174ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 175728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // These are for keeping track of activity and tab switch state. 176728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private int mCurView; 177728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private boolean mCreatedRunning; 178728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 179728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private boolean mResumedRunning; 180728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private boolean mActivityResumed; 181728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 1821337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn private StatFs mDataFileStats; 1831337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn private StatFs mSDCardFileStats; 1841337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn private boolean mLastShowedInternalStorage = true; 1851337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage; 1861337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 187f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn static final String TAB_DOWNLOADED = "Downloaded"; 188f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn static final String TAB_RUNNING = "Running"; 189f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn static final String TAB_ALL = "All"; 190f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn static final String TAB_SDCARD = "OnSdCard"; 191f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn private View mRootView; 192f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 1930385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn private boolean mShowBackground = false; 1940385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn 195f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // -------------- Copied from TabActivity -------------- 196f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 197f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn private TabHost mTabHost; 198f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn private String mDefaultTab = null; 199f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 200f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // -------------- Copied from TabActivity -------------- 201f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 202ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn final Runnable mRunningProcessesAvail = new Runnable() { 203ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn public void run() { 204ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn handleRunningProcessesAvail(); 205ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn } 206ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn }; 207ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn 208e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // View Holder used when displaying views 209e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static class AppViewHolder { 210e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry; 211e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn TextView appName; 212e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ImageView appIcon; 213e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn TextView appSize; 214e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn TextView disabled; 2156dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn CheckBox checkBox; 216ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu 217bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn void updateSizeText(ManageApplications ma, int whichSize) { 218e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "updateSizeText of " + entry.label + " " + entry 219e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn + ": " + entry.sizeStr); 220e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.sizeStr != null) { 221bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn switch (whichSize) { 222bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn case SIZE_INTERNAL: 223bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn appSize.setText(entry.internalSizeStr); 224bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn break; 225bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn case SIZE_EXTERNAL: 226bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn appSize.setText(entry.externalSizeStr); 227bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn break; 228bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn default: 229bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn appSize.setText(entry.sizeStr); 230bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn break; 231bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 232e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } else if (entry.size == ApplicationsState.SIZE_INVALID) { 233e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn appSize.setText(ma.mInvalidSizeStr); 234ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 235ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 236ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 237ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu 238e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project /* 239e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * Custom adapter implementation for the ListView 240e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * This adapter maintains a map for each displayed application and its properties 241e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * An index value on each AppInfo object indicates the correct position or index 242e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * in the list. If the list gets updated dynamically when the user is viewing the list of 243e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * applications, we need to return the correct index of position. This is done by mapping 244e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * the getId methods via the package name into the internal maps and indices. 245e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * The order of applications in the list is mirrored in mAppLocalList 246e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project */ 247e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn class ApplicationsAdapter extends BaseAdapter implements Filterable, 248e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.Callbacks, AbsListView.RecyclerListener { 249e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private final ApplicationsState mState; 250e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private final ArrayList<View> mActive = new ArrayList<View>(); 251e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ArrayList<ApplicationsState.AppEntry> mBaseEntries; 252e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ArrayList<ApplicationsState.AppEntry> mEntries; 253e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private boolean mResumed; 254e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private int mLastFilterMode=-1, mLastSortMode=-1; 25519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn private boolean mWaitingForData; 256bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn private int mWhichSize = SIZE_TOTAL; 257e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn CharSequence mCurFilterPrefix; 258e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 259e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private Filter mFilter = new Filter() { 260e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 261e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn protected FilterResults performFiltering(CharSequence constraint) { 262e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> entries 263e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn = applyPrefixFilter(constraint, mBaseEntries); 264e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn FilterResults fr = new FilterResults(); 265e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn fr.values = entries; 266e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn fr.count = entries.size(); 267e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return fr; 268e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 269355b32faa924a0b39067dd759ba03e5af97065caSuchi Amalapurapu 270e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 271e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn protected void publishResults(CharSequence constraint, FilterResults results) { 272e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mCurFilterPrefix = constraint; 273e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values; 274e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn notifyDataSetChanged(); 2751337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn updateStorageUsage(); 276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 277e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn }; 278c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 279e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public ApplicationsAdapter(ApplicationsState state) { 280e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState = state; 281c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 282e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 283e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void resume(int filter, int sort) { 284e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "Resume! mResumed=" + mResumed); 285e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (!mResumed) { 286e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumed = true; 287e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState.resume(this); 288e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastFilterMode = filter; 289e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastSortMode = sort; 29019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(true); 291e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } else { 292e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn rebuild(filter, sort); 293c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 294e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 295c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 296e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void pause() { 297e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mResumed) { 298e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumed = false; 299e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState.pause(); 300e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 302b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 303e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void rebuild(int filter, int sort) { 304e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (filter == mLastFilterMode && sort == mLastSortMode) { 305e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return; 306e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 307e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastFilterMode = filter; 308e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastSortMode = sort; 30919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(true); 310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 31219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void rebuild(boolean eraseold) { 313e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "Rebuilding app list..."); 314e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppFilter filterObj; 315e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn Comparator<AppEntry> comparatorObj; 316bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn boolean emulated = Environment.isExternalStorageEmulated(); 317bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn if (emulated) { 318bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_TOTAL; 319bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } else { 320bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_INTERNAL; 321bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 322e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn switch (mLastFilterMode) { 323e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case FILTER_APPS_THIRD_PARTY: 324e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = ApplicationsState.THIRD_PARTY_FILTER; 325e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 326e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case FILTER_APPS_SDCARD: 327e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = ApplicationsState.ON_SD_CARD_FILTER; 328bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn if (!emulated) { 329bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mWhichSize = SIZE_EXTERNAL; 330bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 331e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 332e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn default: 333e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = null; 334e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 335e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 336e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn switch (mLastSortMode) { 337e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case SORT_ORDER_SIZE: 338430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn switch (mWhichSize) { 339430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn case SIZE_INTERNAL: 340430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR; 341430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 342430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn case SIZE_EXTERNAL: 343430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.EXTERNAL_SIZE_COMPARATOR; 344430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 345430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn default: 346430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn comparatorObj = ApplicationsState.SIZE_COMPARATOR; 347430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn break; 348430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn } 349e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 350e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn default: 351e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn comparatorObj = ApplicationsState.ALPHA_COMPARATOR; 352e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 353e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 35419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn ArrayList<ApplicationsState.AppEntry> entries 35519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn = mState.rebuild(filterObj, comparatorObj); 35619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (entries == null && !eraseold) { 35719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn // Don't have new list yet, but can continue using the old one. 35819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn return; 35919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 36019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mBaseEntries = entries; 36119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (mBaseEntries != null) { 36219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries); 36319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } else { 36419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = null; 36519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 366e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn notifyDataSetChanged(); 3671337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn updateStorageUsage(); 36819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 36919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn if (entries == null) { 37019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mWaitingForData = true; 37119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mListContainer.setVisibility(View.INVISIBLE); 37219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mLoadingContainer.setVisibility(View.VISIBLE); 37319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } else { 37419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mListContainer.setVisibility(View.VISIBLE); 37519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mLoadingContainer.setVisibility(View.GONE); 37619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 379e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix, 380e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> origEntries) { 381e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (prefix == null || prefix.length() == 0) { 382e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return origEntries; 383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 384e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn String prefixStr = ApplicationsState.normalize(prefix.toString()); 385e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn final String spacePrefixStr = " " + prefixStr; 386e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> newEntries 387e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn = new ArrayList<ApplicationsState.AppEntry>(); 388e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn for (int i=0; i<origEntries.size(); i++) { 389e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = origEntries.get(i); 390e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn String nlabel = entry.getNormalizedLabel(); 391e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) { 392e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn newEntries.add(entry); 393ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 394ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 395e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return newEntries; 396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 398ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu 399e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 400e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onRunningStateChanged(boolean running) { 401f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getActivity().setProgressBarIndeterminateVisibility(running); 402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 403b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 404e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 40519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void onRebuildComplete(ArrayList<AppEntry> apps) { 4064e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn if (mLoadingContainer.getVisibility() == View.VISIBLE) { 4074e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn mLoadingContainer.startAnimation(AnimationUtils.loadAnimation( 408f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getActivity(), android.R.anim.fade_out)); 4094e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn mListContainer.startAnimation(AnimationUtils.loadAnimation( 410f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getActivity(), android.R.anim.fade_in)); 4114e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn } 41219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mListContainer.setVisibility(View.VISIBLE); 41319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mLoadingContainer.setVisibility(View.GONE); 41419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mWaitingForData = false; 41519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mBaseEntries = apps; 41619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries); 41719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn notifyDataSetChanged(); 4181337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn updateStorageUsage(); 41919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 42019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 42119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn @Override 422e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageListChanged() { 42319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 425b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 426e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 427e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageIconChanged() { 428e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // We ensure icons are loaded when their item is displayed, so 429e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // don't care about icons loaded in the background. 430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 431b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 432e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 433e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageSizeChanged(String packageName) { 434e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 435e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag(); 436e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (holder.entry.info.packageName.equals(packageName)) { 437e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn synchronized (holder.entry) { 438bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn holder.updateSizeText(ManageApplications.this, mWhichSize); 439c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 440e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (holder.entry.info.packageName.equals(mCurrentPkgName) 441e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn && mLastSortMode == SORT_ORDER_SIZE) { 442e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // We got the size information for the last app the 443e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // user viewed, and are sorting by size... they may 444e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // have cleared data, so we immediately want to resort 445e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // the list with the new size to reflect it to the user. 44619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 447c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 4481337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn updateStorageUsage(); 449e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return; 450c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 451c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 452c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 453c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 454e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 455e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onAllSizesComputed() { 456e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mLastSortMode == SORT_ORDER_SIZE) { 45719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn rebuild(false); 458afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 459afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 460afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 461afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getCount() { 462e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries != null ? mEntries.size() : 0; 463afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 464afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 465afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public Object getItem(int position) { 466e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position); 467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 469e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public ApplicationsState.AppEntry getAppEntry(int position) { 470e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position); 471afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 472afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 473afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public long getItemId(int position) { 474e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position).id; 475afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 476afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 477afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 478347c9a0544328e65120582834ce330fb0d473f28Jeff Brown // A ViewHolder keeps references to children views to avoid unnecessary calls 479afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // to findViewById() on each row. 480afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project AppViewHolder holder; 481afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 482afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // When convertView is not null, we can reuse it directly, there is no need 483afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // to reinflate it. We only inflate a new View when the convertView supplied 484afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // by ListView is null. 485afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (convertView == null) { 486afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project convertView = mInflater.inflate(R.layout.manage_applications_item, null); 487afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 488afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Creates a ViewHolder and store references to the two children views 489afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // we want to bind data to. 490afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project holder = new AppViewHolder(); 491afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project holder.appName = (TextView) convertView.findViewById(R.id.app_name); 492afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project holder.appIcon = (ImageView) convertView.findViewById(R.id.app_icon); 493afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project holder.appSize = (TextView) convertView.findViewById(R.id.app_size); 4949db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn holder.disabled = (TextView) convertView.findViewById(R.id.app_disabled); 4956dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox = (CheckBox) convertView.findViewById(R.id.app_on_sdcard); 496afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project convertView.setTag(holder); 497afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 498afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Get the ViewHolder back to get fast access to the TextView 499afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // and the ImageView. 500afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project holder = (AppViewHolder) convertView.getTag(); 501afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 502afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 503afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Bind the data efficiently with the holder 504e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = mEntries.get(position); 505e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn synchronized (entry) { 506e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.entry = entry; 507e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.label != null) { 508e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.appName.setText(entry.label); 509f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn holder.appName.setTextColor(getActivity().getResources().getColorStateList( 510e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn entry.info.enabled ? android.R.color.primary_text_dark 5119db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn : android.R.color.secondary_text_dark)); 512afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 513e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState.ensureIcon(entry); 514e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.icon != null) { 515e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.appIcon.setImageDrawable(entry.icon); 516afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 517bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn holder.updateSizeText(ManageApplications.this, mWhichSize); 51844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn if (InstalledAppDetails.SUPPORT_DISABLE_APPS) { 51944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn holder.disabled.setVisibility(entry.info.enabled ? View.GONE : View.VISIBLE); 52044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn } else { 52144178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn holder.disabled.setVisibility(View.GONE); 52244178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn } 5236dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn if (mLastFilterMode == FILTER_APPS_SDCARD) { 5246dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setVisibility(View.VISIBLE); 5256dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setChecked((entry.info.flags 5266dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0); 5276dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } else { 5286dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn holder.checkBox.setVisibility(View.GONE); 5296dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn } 530afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 531e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.remove(convertView); 532e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.add(convertView); 533afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return convertView; 534afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 535c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 536e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 537c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu public Filter getFilter() { 538e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mFilter; 539c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 540c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 541e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 542e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onMovedToScrapHeap(View view) { 543e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.remove(view); 544728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 545728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 546728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 547afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 548f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreate(Bundle savedInstanceState) { 549afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 550f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 551f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn setHasOptionsMenu(true); 552f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 553f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication()); 554e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsAdapter = new ApplicationsAdapter(mApplicationsState); 555f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Intent intent = getActivity().getIntent(); 556ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu String action = intent.getAction(); 55738b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu String defaultTabTag = TAB_DOWNLOADED; 558ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn String className = getArguments() != null 559ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ? getArguments().getString("classname") : null; 560ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (className == null) { 561ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn className = intent.getComponent().getClassName(); 562ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 563af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani if (className.equals(RunningServicesActivity.class.getName()) 564af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || className.endsWith(".RunningServices")) { 565728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn defaultTabTag = TAB_RUNNING; 5665203bdffe6ce2b829d0fab8c7691fa92aca6e972Amith Yamasani } else if (className.equals(StorageUseActivity.class.getName()) 567af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || Intent.ACTION_MANAGE_PACKAGE_STORAGE.equals(action) 568af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani || className.endsWith(".StorageUse")) { 569afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSortOrder = SORT_ORDER_SIZE; 570fe4a2bc43f45b14db62c67d7c2531a3d7f1b8590Suchi Amalapurapu mFilterApps = FILTER_APPS_ALL; 57138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu defaultTabTag = TAB_ALL; 572762eaa77e3e12d5337ddc9cb87b473c47af5524aKenny Root } else if (Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)) { 5739a294912ada6b90e6dac882e79ee449964c2263fWinson Chung // Select the all-apps tab, with the default sorting 5749a294912ada6b90e6dac882e79ee449964c2263fWinson Chung defaultTabTag = TAB_ALL; 575afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 576728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 577728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (savedInstanceState != null) { 578728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSortOrder = savedInstanceState.getInt("sortOrder", mSortOrder); 579728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mFilterApps = savedInstanceState.getInt("filterApps", mFilterApps); 580728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String tmp = savedInstanceState.getString("defaultTabTag"); 581728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (tmp != null) defaultTabTag = tmp; 5820385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mShowBackground = savedInstanceState.getBoolean("showBackground", false); 583728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 584728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 585f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mDefaultTab = defaultTabTag; 586728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 5871337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mDataFileStats = new StatFs("/data"); 5881337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mSDCardFileStats = new StatFs(Environment.getExternalStorageDirectory().toString()); 5891337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 590f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value); 591f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mComputingSizeStr = getActivity().getText(R.string.computing_size); 592f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 593f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 594f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 595f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn @Override 596f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 597afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // initialize the inflater 598f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mInflater = inflater; 599f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mRootView = inflater.inflate(R.layout.manage_applications, null); 600ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn mLoadingContainer = mRootView.findViewById(R.id.loading_container); 601508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn mListContainer = mRootView.findViewById(R.id.list_container); 602afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Create adapter and list view here 603508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn ListView lv = (ListView) mListContainer.findViewById(android.R.id.list); 604508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty); 605508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn if (emptyView != null) { 606508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn lv.setEmptyView(emptyView); 607508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 608afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project lv.setOnItemClickListener(this); 609afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project lv.setSaveEnabled(true); 610afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project lv.setItemsCanFocus(true); 611afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project lv.setOnItemClickListener(this); 612c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu lv.setTextFilterEnabled(true); 613afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mListView = lv; 614e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn lv.setRecyclerListener(mApplicationsAdapter); 615e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mListView.setAdapter(mApplicationsAdapter); 6161337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar); 6171337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel); 6181337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText); 6191337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText); 620728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mRunningProcessesView = (RunningProcessesView)mRootView.findViewById( 621728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn R.id.running_processes); 622f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 623ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mCreatedRunning = mResumedRunning = false; 62414ffda6f248d5a9d64c94ec6947ea317f75d6006Dianne Hackborn mCurView = VIEW_NOTHING; 625b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey 626b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey mTabHost = (TabHost) mInflater.inflate(R.layout.manage_apps_tab_content, container, false); 627f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mTabHost.setup(); 628f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn final TabHost tabHost = mTabHost; 62938b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu tabHost.addTab(tabHost.newTabSpec(TAB_DOWNLOADED) 630f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setIndicator(getActivity().getString(R.string.filter_apps_third_party), 631f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getActivity().getResources().getDrawable(R.drawable.ic_tab_download)) 63238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu .setContent(this)); 633ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (!Environment.isExternalStorageEmulated()) { 634ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn tabHost.addTab(tabHost.newTabSpec(TAB_SDCARD) 635ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setIndicator(getActivity().getString(R.string.filter_apps_onsdcard), 636ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn getActivity().getResources().getDrawable(R.drawable.ic_tab_sdcard)) 637ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setContent(this)); 638ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 639728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn tabHost.addTab(tabHost.newTabSpec(TAB_RUNNING) 640f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setIndicator(getActivity().getString(R.string.filter_apps_running), 641f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getActivity().getResources().getDrawable(R.drawable.ic_tab_running)) 642728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn .setContent(this)); 643c883ee5eaae1666f8321cfcc3058fb3843e695dcDianne Hackborn tabHost.addTab(tabHost.newTabSpec(TAB_ALL) 644c883ee5eaae1666f8321cfcc3058fb3843e695dcDianne Hackborn .setIndicator(getActivity().getString(R.string.filter_apps_all), 645c883ee5eaae1666f8321cfcc3058fb3843e695dcDianne Hackborn getActivity().getResources().getDrawable(R.drawable.ic_tab_all)) 646c883ee5eaae1666f8321cfcc3058fb3843e695dcDianne Hackborn .setContent(this)); 647f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn tabHost.setCurrentTabByTag(mDefaultTab); 64838b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu tabHost.setOnTabChangedListener(this); 649f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 650b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey // adjust padding around tabwidget as needed 6515d70679c02a57416eac46581d7242e2382e4b973Jeff Sharkey prepareCustomPreferencesList(container, mTabHost, mListView, false); 652b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey 653b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey return mTabHost; 654afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 655f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 656f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu @Override 657728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public void onStart() { 658728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onStart(); 659b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu } 660b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 661afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 662f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onResume() { 663728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onResume(); 664728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = true; 665e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn showCurrentTab(); 666ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 66739dd54bee0d0d63284b49aeb3759dfafeaf13ab6Amith Yamasani mTabHost.getTabWidget().setEnabled(true); 668afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 669b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 670728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 671f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onSaveInstanceState(Bundle outState) { 672728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onSaveInstanceState(outState); 673728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn outState.putInt("sortOrder", mSortOrder); 674728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn outState.putInt("filterApps", mFilterApps); 675ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (mDefaultTab != null) { 676ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn outState.putString("defautTabTag", mDefaultTab); 677f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 6780385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn outState.putBoolean("showBackground", mShowBackground); 679728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 680728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 681728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 682f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onPause() { 683728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onPause(); 684728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = false; 685e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsAdapter.pause(); 686728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mResumedRunning) { 687728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mRunningProcessesView.doPause(); 688728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mResumedRunning = false; 689728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 69039dd54bee0d0d63284b49aeb3759dfafeaf13ab6Amith Yamasani mTabHost.getTabWidget().setEnabled(false); 691728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 692728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 693728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 694f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 695728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) { 696e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsState.requestSize(mCurrentPkgName); 697ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 698afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 699afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 700afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // utility method used to start sub activity 701afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void startApplicationDetailsActivity() { 702f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // start new fragment to display extended information 703f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Bundle args = new Bundle(); 704f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mCurrentPkgName); 705f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 706f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn PreferenceActivity pa = (PreferenceActivity)getActivity(); 707ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn pa.startPreferencePanel(InstalledAppDetails.class.getName(), args, 708ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn R.string.application_info_label, null, this, INSTALLED_APP_DETAILS); 709afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 710afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 711afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 712f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 713ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn Log.i(TAG, "onCreateOptionsMenu in " + this + ": " + menu); 714ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu = menu; 7150385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn // note: icons removed for now because the cause the new action 7160385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn // bar UI to be very confusing. 717afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha) 7180385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn //.setIcon(android.R.drawable.ic_menu_sort_alphabetically) 719348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 720afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size) 7210385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn //.setIcon(android.R.drawable.ic_menu_sort_by_size) 722348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 723ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services) 724ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 725ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes) 726ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 727ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 728afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 729afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 730afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 731f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 732ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 733ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 734ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 735ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn @Override 736ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onDestroyOptionsMenu() { 737ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu = null; 738ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 739ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 740ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn void updateOptionsMenu() { 741ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (mOptionsMenu == null) { 742ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return; 743ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 744ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 745673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root /* 746673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root * The running processes screen doesn't use the mApplicationsAdapter 747673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root * so bringing up this menu in that case doesn't make any sense. 748673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root */ 749673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root if (mCurView == VIEW_RUNNING) { 750ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn boolean showingBackground = mRunningProcessesView != null 751ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ? mRunningProcessesView.mAdapter.getShowBackground() : false; 752ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false); 753ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false); 754ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground); 755ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground); 7561337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else { 757ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA); 758ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE); 759ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false); 760ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false); 761673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root } 762afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 763afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 764afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 765afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 766afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int menuId = item.getItemId(); 767afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) { 768e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mSortOrder = menuId; 7691337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (mCurView != VIEW_RUNNING) { 7701337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mApplicationsAdapter.rebuild(mFilterApps, mSortOrder); 7711337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 7721337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (menuId == SHOW_RUNNING_SERVICES) { 7730385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mShowBackground = false; 7741337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mRunningProcessesView.mAdapter.setShowBackground(false); 7751337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (menuId == SHOW_BACKGROUND_PROCESSES) { 7760385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mShowBackground = true; 7771337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mRunningProcessesView.mAdapter.setShowBackground(true); 778afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 779ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 780afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 781afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 782d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn 783afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onItemClick(AdapterView<?> parent, View view, int position, 784afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long id) { 785e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = mApplicationsAdapter.getAppEntry(position); 786e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mCurrentPkgName = entry.info.packageName; 787afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project startApplicationDetailsActivity(); 788afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 789afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 79038b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu public View createTabContent(String tag) { 79138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu return mRootView; 79238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu } 79338b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu 794e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final int VIEW_NOTHING = 0; 795e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final int VIEW_LIST = 1; 796e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final int VIEW_RUNNING = 2; 797e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 7981337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn void updateStorageUsage() { 7991337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (mCurView == VIEW_RUNNING) { 8001337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn return; 8011337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 8021337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 8031337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn long freeStorage = 0; 8041337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn long appStorage = 0; 8051337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn long totalStorage = 0; 8061337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn CharSequence newLabel = null; 8071337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 8081337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (mFilterApps == FILTER_APPS_SDCARD) { 8091337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (mLastShowedInternalStorage) { 8101337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mLastShowedInternalStorage = false; 8111337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 812f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn newLabel = getActivity().getText(R.string.sd_card_storage); 8131337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mSDCardFileStats.restat(Environment.getExternalStorageDirectory().toString()); 8141337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn try { 8151337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn totalStorage = (long)mSDCardFileStats.getBlockCount() * 8161337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mSDCardFileStats.getBlockSize(); 8171337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn freeStorage = (long) mSDCardFileStats.getAvailableBlocks() * 8181337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mSDCardFileStats.getBlockSize(); 8191337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } catch (IllegalArgumentException e) { 8201337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn // use the old value of mFreeMem 8211337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 822bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn final int N = mApplicationsAdapter.getCount(); 823bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn for (int i=0; i<N; i++) { 824bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn ApplicationsState.AppEntry ae = mApplicationsAdapter.getAppEntry(i); 825bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn appStorage += ae.externalCodeSize + ae.externalDataSize; 826bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 8271337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else { 8281337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (!mLastShowedInternalStorage) { 8291337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mLastShowedInternalStorage = true; 8301337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 831f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn newLabel = getActivity().getText(R.string.internal_storage); 8321337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mDataFileStats.restat("/data"); 8331337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn try { 8341337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn totalStorage = (long)mDataFileStats.getBlockCount() * 8351337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mDataFileStats.getBlockSize(); 8361337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn freeStorage = (long) mDataFileStats.getAvailableBlocks() * 8371337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mDataFileStats.getBlockSize(); 8381337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } catch (IllegalArgumentException e) { 8391337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 840bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn final boolean emulatedStorage = Environment.isExternalStorageEmulated(); 8411337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn final int N = mApplicationsAdapter.getCount(); 8421337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn for (int i=0; i<N; i++) { 8431337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn ApplicationsState.AppEntry ae = mApplicationsAdapter.getAppEntry(i); 8441337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn appStorage += ae.codeSize + ae.dataSize; 845bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn if (emulatedStorage) { 846bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn appStorage += ae.externalCodeSize + ae.externalDataSize; 847bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 8481337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 849d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn freeStorage += mApplicationsState.sumCacheSizes(); 8501337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 8511337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (newLabel != null) { 8521337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mStorageChartLabel.setText(newLabel); 8531337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 8541337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (totalStorage > 0) { 8551337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mColorBar.setRatios((totalStorage-freeStorage-appStorage)/(float)totalStorage, 8561337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn appStorage/(float)totalStorage, freeStorage/(float)totalStorage); 8571337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn long usedStorage = totalStorage - freeStorage; 8581337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (mLastUsedStorage != usedStorage) { 8591337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mLastUsedStorage = usedStorage; 860f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn String sizeStr = Formatter.formatShortFileSize(getActivity(), usedStorage); 861f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mUsedStorageText.setText(getActivity().getResources().getString( 8621337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn R.string.service_foreground_processes, sizeStr)); 8631337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 8641337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (mLastFreeStorage != freeStorage) { 8651337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mLastFreeStorage = freeStorage; 866f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn String sizeStr = Formatter.formatShortFileSize(getActivity(), freeStorage); 867f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mFreeStorageText.setText(getActivity().getResources().getString( 8681337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn R.string.service_background_processes, sizeStr)); 8691337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 8701337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else { 8711337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mColorBar.setRatios(0, 0, 0); 8721337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (mLastUsedStorage != -1) { 8731337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mLastUsedStorage = -1; 8741337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mUsedStorageText.setText(""); 8751337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 8761337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (mLastFreeStorage != -1) { 8771337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mLastFreeStorage = -1; 8781337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mFreeStorageText.setText(""); 8791337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 8801337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 8811337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } 8821337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 883e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private void selectView(int which) { 884e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (which == VIEW_LIST) { 885e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mResumedRunning) { 886e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mRunningProcessesView.doPause(); 887e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumedRunning = false; 888e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 889e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mCurView != which) { 890e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mRunningProcessesView.setVisibility(View.GONE); 891508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn mListContainer.setVisibility(View.VISIBLE); 89219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn mLoadingContainer.setVisibility(View.GONE); 893e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 894e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mActivityResumed) { 895e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsAdapter.resume(mFilterApps, mSortOrder); 896e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 897e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } else if (which == VIEW_RUNNING) { 898e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (!mCreatedRunning) { 899f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mRunningProcessesView.doCreate(null); 9000385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn mRunningProcessesView.mAdapter.setShowBackground(mShowBackground); 901e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mCreatedRunning = true; 902e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 903ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn boolean haveData = true; 904e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mActivityResumed && !mResumedRunning) { 905ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn haveData = mRunningProcessesView.doResume(this, mRunningProcessesAvail); 906e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumedRunning = true; 907e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 908e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsAdapter.pause(); 909e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mCurView != which) { 910ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn if (haveData) { 911ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn mRunningProcessesView.setVisibility(View.VISIBLE); 912ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn } else { 913ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn mLoadingContainer.setVisibility(View.VISIBLE); 914ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn } 915508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn mListContainer.setVisibility(View.GONE); 916e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 917e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 918e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mCurView = which; 919a31be80ef056add00e0d239414f80f932978277fAdam Powell final Activity host = getActivity(); 920a31be80ef056add00e0d239414f80f932978277fAdam Powell if (host != null) { 921a31be80ef056add00e0d239414f80f932978277fAdam Powell host.invalidateOptionsMenu(); 922a31be80ef056add00e0d239414f80f932978277fAdam Powell } 923e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 924e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 925ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn void handleRunningProcessesAvail() { 926ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn if (mCurView == VIEW_RUNNING) { 927ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn mLoadingContainer.startAnimation(AnimationUtils.loadAnimation( 928f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getActivity(), android.R.anim.fade_out)); 929ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation( 930f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getActivity(), android.R.anim.fade_in)); 931ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn mRunningProcessesView.setVisibility(View.VISIBLE); 932ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn mLoadingContainer.setVisibility(View.GONE); 933ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn } 934ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn } 935ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn 936e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void showCurrentTab() { 937ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn String tabId = mDefaultTab = mTabHost.getCurrentTabTag(); 938afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int newOption; 93938b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu if (TAB_DOWNLOADED.equalsIgnoreCase(tabId)) { 94038b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu newOption = FILTER_APPS_THIRD_PARTY; 94138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu } else if (TAB_ALL.equalsIgnoreCase(tabId)) { 94238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu newOption = FILTER_APPS_ALL; 943747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu } else if (TAB_SDCARD.equalsIgnoreCase(tabId)) { 944747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu newOption = FILTER_APPS_SDCARD; 945728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else if (TAB_RUNNING.equalsIgnoreCase(tabId)) { 946f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn ((InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)) 947f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .hideSoftInputFromWindow( 948f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getActivity().getWindow().getDecorView().getWindowToken(), 0); 949728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn selectView(VIEW_RUNNING); 950728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return; 95138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu } else { 95238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu // Invalid option. Do nothing 953afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 954afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 955728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 956e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mFilterApps = newOption; 957728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn selectView(VIEW_LIST); 9581337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn updateStorageUsage(); 959ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn updateOptionsMenu(); 960e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 961e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 962e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onTabChanged(String tabId) { 963e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn showCurrentTab(); 964afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 965afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 966