ManageApplications.java revision e7623f775cb37a8de049dae8c03b5b396526fdd1
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 19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R; 20e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport com.android.settings.applications.ApplicationsState.AppEntry; 2138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu 2238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapuimport android.app.TabActivity; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface; 25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 28728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.provider.Settings; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu; 32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Window; 36e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter; 39c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filter; 40c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filterable; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView; 4338b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapuimport android.widget.TabHost; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView.OnItemClickListener; 46b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Comparator; 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to pick an application that will be used to display installation information and 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * options to uninstall/delete user data for system applications. This activity 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * intent. 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 5638b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapupublic class ManageApplications extends TabActivity implements 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project OnItemClickListener, DialogInterface.OnCancelListener, 58e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn TabHost.TabContentFactory, TabHost.OnTabChangeListener { 59e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final String TAG = "ManageApplications"; 60e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final boolean DEBUG = false; 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // attributes used as keys when passing values to InstalledAppDetails activity 6338b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu public static final String APP_CHG = "chg"; 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // constant value that can be used to check return code from sub activity. 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int INSTALLED_APP_DETAILS = 1; 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // sort order that can be changed through the menu can be sorted alphabetically 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // or size(descending) 70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int MENU_OPTIONS_BASE = 0; 71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Filter options used for displayed list of applications 726cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0; 73728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1; 74728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2; 75747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu 766cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4; 776cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5; 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // sort order 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private int mSortOrder = SORT_ORDER_ALPHA; 80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Filter value 81fe4a2bc43f45b14db62c67d7c2531a3d7f1b8590Suchi Amalapurapu private int mFilterApps = FILTER_APPS_THIRD_PARTY; 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 83e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ApplicationsState mApplicationsState; 84e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ApplicationsAdapter mApplicationsAdapter; 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Size resource used for packages whose size computation failed for some reason 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mInvalidSizeStr; 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingSizeStr; 89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // layout inflater object used to inflate views 91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private LayoutInflater mInflater; 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 93de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private String mCurrentPkgName; 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // ListView used to display list 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ListView mListView; 97728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Custom view used to display running processes 98728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private RunningProcessesView mRunningProcessesView; 99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 100728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // These are for keeping track of activity and tab switch state. 101728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private int mCurView; 102728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private boolean mCreatedRunning; 103728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 104728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private boolean mResumedRunning; 105728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private boolean mActivityResumed; 106728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn private Object mNonConfigInstance; 107728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 108e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // View Holder used when displaying views 109e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static class AppViewHolder { 110e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry; 111e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn TextView appName; 112e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ImageView appIcon; 113e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn TextView appSize; 114e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn TextView disabled; 115ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu 116e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn void updateSizeText(ManageApplications ma) { 117e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "updateSizeText of " + entry.label + " " + entry 118e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn + ": " + entry.sizeStr); 119e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.sizeStr != null) { 120e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn appSize.setText(entry.sizeStr); 121e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } else if (entry.size == ApplicationsState.SIZE_INVALID) { 122e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn appSize.setText(ma.mInvalidSizeStr); 123ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 124ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 125ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 126ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu 127e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project /* 128e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * Custom adapter implementation for the ListView 129e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * This adapter maintains a map for each displayed application and its properties 130e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * An index value on each AppInfo object indicates the correct position or index 131e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * in the list. If the list gets updated dynamically when the user is viewing the list of 132e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * applications, we need to return the correct index of position. This is done by mapping 133e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * the getId methods via the package name into the internal maps and indices. 134e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn * The order of applications in the list is mirrored in mAppLocalList 135e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project */ 136e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn class ApplicationsAdapter extends BaseAdapter implements Filterable, 137e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.Callbacks, AbsListView.RecyclerListener { 138e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private final ApplicationsState mState; 139e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private final ArrayList<View> mActive = new ArrayList<View>(); 140e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ArrayList<ApplicationsState.AppEntry> mBaseEntries; 141e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private ArrayList<ApplicationsState.AppEntry> mEntries; 142e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private boolean mResumed; 143e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private int mLastFilterMode=-1, mLastSortMode=-1; 144e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn CharSequence mCurFilterPrefix; 145e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 146e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private Filter mFilter = new Filter() { 147e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 148e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn protected FilterResults performFiltering(CharSequence constraint) { 149e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> entries 150e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn = applyPrefixFilter(constraint, mBaseEntries); 151e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn FilterResults fr = new FilterResults(); 152e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn fr.values = entries; 153e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn fr.count = entries.size(); 154e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return fr; 155e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 156355b32faa924a0b39067dd759ba03e5af97065caSuchi Amalapurapu 157e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 158e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn protected void publishResults(CharSequence constraint, FilterResults results) { 159e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mCurFilterPrefix = constraint; 160e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values; 161e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn notifyDataSetChanged(); 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 163e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn }; 164c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 165e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public ApplicationsAdapter(ApplicationsState state) { 166e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState = state; 167c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 168e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 169e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void resume(int filter, int sort) { 170e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "Resume! mResumed=" + mResumed); 171e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (!mResumed) { 172e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumed = true; 173e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState.resume(this); 174e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastFilterMode = filter; 175e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastSortMode = sort; 176e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn rebuild(); 177e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } else { 178e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn rebuild(filter, sort); 179c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 180e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 181c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 182e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void pause() { 183e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mResumed) { 184e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumed = false; 185e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState.pause(); 186e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 188b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 189e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void rebuild(int filter, int sort) { 190e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (filter == mLastFilterMode && sort == mLastSortMode) { 191e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return; 192e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 193e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastFilterMode = filter; 194e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mLastSortMode = sort; 195e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn rebuild(); 196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 198e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void rebuild() { 199e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (DEBUG) Log.i(TAG, "Rebuilding app list..."); 200e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppFilter filterObj; 201e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn Comparator<AppEntry> comparatorObj; 202e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn switch (mLastFilterMode) { 203e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case FILTER_APPS_THIRD_PARTY: 204e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = ApplicationsState.THIRD_PARTY_FILTER; 205e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 206e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case FILTER_APPS_SDCARD: 207e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = ApplicationsState.ON_SD_CARD_FILTER; 208e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 209e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn default: 210e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn filterObj = null; 211e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 212e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 213e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn switch (mLastSortMode) { 214e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn case SORT_ORDER_SIZE: 215e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn comparatorObj = ApplicationsState.SIZE_COMPARATOR; 216e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 217e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn default: 218e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn comparatorObj = ApplicationsState.ALPHA_COMPARATOR; 219e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn break; 220e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 221e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mBaseEntries = mState.rebuild(filterObj, comparatorObj); 222e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries); 223e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn notifyDataSetChanged(); 224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 226e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix, 227e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> origEntries) { 228e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (prefix == null || prefix.length() == 0) { 229e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return origEntries; 230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 231e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn String prefixStr = ApplicationsState.normalize(prefix.toString()); 232e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn final String spacePrefixStr = " " + prefixStr; 233e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ArrayList<ApplicationsState.AppEntry> newEntries 234e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn = new ArrayList<ApplicationsState.AppEntry>(); 235e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn for (int i=0; i<origEntries.size(); i++) { 236e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = origEntries.get(i); 237e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn String nlabel = entry.getNormalizedLabel(); 238e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) { 239e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn newEntries.add(entry); 240ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 241ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 242e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return newEntries; 243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 245ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu 246e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 247e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onRunningStateChanged(boolean running) { 248e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn setProgressBarIndeterminateVisibility(running); 249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 250b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 251e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 252e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageListChanged() { 253e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn rebuild(); 254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 255b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 256e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 257e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageIconChanged() { 258e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // We ensure icons are loaded when their item is displayed, so 259e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // don't care about icons loaded in the background. 260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 261b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 262e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 263e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onPackageSizeChanged(String packageName) { 264e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn for (int i=0; i<mActive.size(); i++) { 265e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag(); 266e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (holder.entry.info.packageName.equals(packageName)) { 267e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn synchronized (holder.entry) { 268e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.updateSizeText(ManageApplications.this); 269c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 270e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (holder.entry.info.packageName.equals(mCurrentPkgName) 271e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn && mLastSortMode == SORT_ORDER_SIZE) { 272e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // We got the size information for the last app the 273e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // user viewed, and are sorting by size... they may 274e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // have cleared data, so we immediately want to resort 275e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn // the list with the new size to reflect it to the user. 276e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn rebuild(); 277c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 278e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return; 279c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 280c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 281c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 282c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 283e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 284e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onAllSizesComputed() { 285e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mLastSortMode == SORT_ORDER_SIZE) { 286e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn rebuild(); 287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getCount() { 291e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries != null ? mEntries.size() : 0; 292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public Object getItem(int position) { 295e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position); 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 298e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public ApplicationsState.AppEntry getAppEntry(int position) { 299e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position); 300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public long getItemId(int position) { 303e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mEntries.get(position).id; 304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 307347c9a0544328e65120582834ce330fb0d473f28Jeff Brown // A ViewHolder keeps references to children views to avoid unnecessary calls 308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // to findViewById() on each row. 309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project AppViewHolder holder; 310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // When convertView is not null, we can reuse it directly, there is no need 312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // to reinflate it. We only inflate a new View when the convertView supplied 313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // by ListView is null. 314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (convertView == null) { 315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project convertView = mInflater.inflate(R.layout.manage_applications_item, null); 316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Creates a ViewHolder and store references to the two children views 318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // we want to bind data to. 319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project holder = new AppViewHolder(); 320afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project holder.appName = (TextView) convertView.findViewById(R.id.app_name); 321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project holder.appIcon = (ImageView) convertView.findViewById(R.id.app_icon); 322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project holder.appSize = (TextView) convertView.findViewById(R.id.app_size); 3239db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn holder.disabled = (TextView) convertView.findViewById(R.id.app_disabled); 324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project convertView.setTag(holder); 325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Get the ViewHolder back to get fast access to the TextView 327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // and the ImageView. 328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project holder = (AppViewHolder) convertView.getTag(); 329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 330afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Bind the data efficiently with the holder 332e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = mEntries.get(position); 333e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn synchronized (entry) { 334e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.entry = entry; 335e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.label != null) { 336e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.appName.setText(entry.label); 3379db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn holder.appName.setTextColor(getResources().getColorStateList( 338e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn entry.info.enabled ? android.R.color.primary_text_dark 3399db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn : android.R.color.secondary_text_dark)); 340afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 341e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mState.ensureIcon(entry); 342e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (entry.icon != null) { 343e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.appIcon.setImageDrawable(entry.icon); 344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 345e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.updateSizeText(ManageApplications.this); 346e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn holder.disabled.setVisibility(entry.info.enabled ? View.GONE : View.VISIBLE); 347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 348e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.remove(convertView); 349e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.add(convertView); 350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return convertView; 351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 352c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 353e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 354c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu public Filter getFilter() { 355e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return mFilter; 356c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu } 357c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu 358e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn @Override 359e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onMovedToScrapHeap(View view) { 360e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mActive.remove(view); 361728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 362728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 363728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 36438b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu static final String TAB_DOWNLOADED = "Downloaded"; 36538b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu static final String TAB_RUNNING = "Running"; 36638b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu static final String TAB_ALL = "All"; 367747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu static final String TAB_SDCARD = "OnSdCard"; 36838b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu private View mRootView; 369728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 373e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsState = ApplicationsState.getInstance(getApplication()); 374e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsAdapter = new ApplicationsAdapter(mApplicationsState); 375ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu Intent intent = getIntent(); 376ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu String action = intent.getAction(); 37738b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu String defaultTabTag = TAB_DOWNLOADED; 378728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (intent.getComponent().getClassName().equals( 379728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn "com.android.settings.RunningServices")) { 380728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn defaultTabTag = TAB_RUNNING; 381728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (action.equals(Intent.ACTION_MANAGE_PACKAGE_STORAGE)) { 383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSortOrder = SORT_ORDER_SIZE; 384fe4a2bc43f45b14db62c67d7c2531a3d7f1b8590Suchi Amalapurapu mFilterApps = FILTER_APPS_ALL; 38538b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu defaultTabTag = TAB_ALL; 386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 387728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 388728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (savedInstanceState != null) { 389728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSortOrder = savedInstanceState.getInt("sortOrder", mSortOrder); 390728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mFilterApps = savedInstanceState.getInt("filterApps", mFilterApps); 391728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String tmp = savedInstanceState.getString("defaultTabTag"); 392728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (tmp != null) defaultTabTag = tmp; 393728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 394728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 395728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mNonConfigInstance = getLastNonConfigurationInstance(); 396728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // initialize some window features 398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project requestWindowFeature(Window.FEATURE_RIGHT_ICON); 399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mInvalidSizeStr = getText(R.string.invalid_size_value); 401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mComputingSizeStr = getText(R.string.computing_size); 402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // initialize the inflater 403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 40438b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu mRootView = mInflater.inflate(R.layout.compute_sizes, null); 405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Create adapter and list view here 40638b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu ListView lv = (ListView) mRootView.findViewById(android.R.id.list); 407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project lv.setOnItemClickListener(this); 408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project lv.setSaveEnabled(true); 409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project lv.setItemsCanFocus(true); 410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project lv.setOnItemClickListener(this); 411c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu lv.setTextFilterEnabled(true); 412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mListView = lv; 413e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn lv.setRecyclerListener(mApplicationsAdapter); 414e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mListView.setAdapter(mApplicationsAdapter); 415728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mRunningProcessesView = (RunningProcessesView)mRootView.findViewById( 416728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn R.id.running_processes); 417f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 41838b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu final TabHost tabHost = getTabHost(); 41938b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu tabHost.addTab(tabHost.newTabSpec(TAB_DOWNLOADED) 420f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu .setIndicator(getString(R.string.filter_apps_third_party), 421f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu getResources().getDrawable(R.drawable.ic_tab_download)) 42238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu .setContent(this)); 42338b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu tabHost.addTab(tabHost.newTabSpec(TAB_ALL) 424f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu .setIndicator(getString(R.string.filter_apps_all), 425f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu getResources().getDrawable(R.drawable.ic_tab_all)) 42638b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu .setContent(this)); 427747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu tabHost.addTab(tabHost.newTabSpec(TAB_SDCARD) 428f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu .setIndicator(getString(R.string.filter_apps_onsdcard), 429f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu getResources().getDrawable(R.drawable.ic_tab_sdcard)) 430747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu .setContent(this)); 431728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn tabHost.addTab(tabHost.newTabSpec(TAB_RUNNING) 432728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn .setIndicator(getString(R.string.filter_apps_running), 433728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn getResources().getDrawable(R.drawable.ic_tab_running)) 434728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn .setContent(this)); 43538b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu tabHost.setCurrentTabByTag(defaultTabTag); 43638b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu tabHost.setOnTabChangedListener(this); 437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 439f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu @Override 440728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public void onStart() { 441728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onStart(); 442b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu } 443b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 445728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn protected void onResume() { 446728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onResume(); 447728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = true; 448e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn showCurrentTab(); 449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 450b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu 451728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 452728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn protected void onSaveInstanceState(Bundle outState) { 453728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onSaveInstanceState(outState); 454728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn outState.putInt("sortOrder", mSortOrder); 455728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn outState.putInt("filterApps", mFilterApps); 456728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn outState.putString("defautTabTag", getTabHost().getCurrentTabTag()); 457728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 458728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 459728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 460728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public Object onRetainNonConfigurationInstance() { 461728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return mRunningProcessesView.doRetainNonConfigurationInstance(); 462728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 463728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 464728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 465728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn protected void onPause() { 466728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onPause(); 467728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActivityResumed = false; 468e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsAdapter.pause(); 469728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mResumedRunning) { 470728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mRunningProcessesView.doPause(); 471728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mResumedRunning = false; 472728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 473728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 474728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 475728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 476728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn protected void onActivityResult(int requestCode, int resultCode, 477728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Intent data) { 478728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) { 479e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsState.requestSize(mCurrentPkgName); 480ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu } 481afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 482afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 483afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // utility method used to start sub activity 484afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void startApplicationDetailsActivity() { 485afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Create intent to start new activity 486728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, 487728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Uri.fromParts("package", mCurrentPkgName, null)); 488afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // start new activity to display extended information 489afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project startActivityForResult(intent, INSTALLED_APP_DETAILS); 490afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 491afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 492afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 493afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onCreateOptionsMenu(Menu menu) { 494afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha) 495afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setIcon(android.R.drawable.ic_menu_sort_alphabetically); 496afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size) 497afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setIcon(android.R.drawable.ic_menu_sort_by_size); 498afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 499afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 500afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 501afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 502afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onPrepareOptionsMenu(Menu menu) { 503e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn menu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA); 504e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn menu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE); 505e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn return true; 506afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 507afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 508afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 509afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 510afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int menuId = item.getItemId(); 511afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) { 512e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mSortOrder = menuId; 513e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsAdapter.rebuild(mFilterApps, mSortOrder); 514afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 515afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 516afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 517afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 518afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onItemClick(AdapterView<?> parent, View view, int position, 519afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long id) { 520e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn ApplicationsState.AppEntry entry = mApplicationsAdapter.getAppEntry(position); 521e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mCurrentPkgName = entry.info.packageName; 522afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project startApplicationDetailsActivity(); 523afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 524afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 525afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Finish the activity if the user presses the back button to cancel the activity 526afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onCancel(DialogInterface dialog) { 527afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project finish(); 528afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 529afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 53038b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu public View createTabContent(String tag) { 53138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu return mRootView; 53238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu } 53338b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu 534e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final int VIEW_NOTHING = 0; 535e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final int VIEW_LIST = 1; 536e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn static final int VIEW_RUNNING = 2; 537e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 538e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn private void selectView(int which) { 539e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (which == VIEW_LIST) { 540e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mResumedRunning) { 541e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mRunningProcessesView.doPause(); 542e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumedRunning = false; 543e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 544e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mCurView != which) { 545e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mRunningProcessesView.setVisibility(View.GONE); 546e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mListView.setVisibility(View.VISIBLE); 547e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 548e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mActivityResumed) { 549e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsAdapter.resume(mFilterApps, mSortOrder); 550e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 551e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } else if (which == VIEW_RUNNING) { 552e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (!mCreatedRunning) { 553e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mRunningProcessesView.doCreate(null, mNonConfigInstance); 554e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mCreatedRunning = true; 555e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 556e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mActivityResumed && !mResumedRunning) { 557e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mRunningProcessesView.doResume(); 558e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mResumedRunning = true; 559e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 560e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mApplicationsAdapter.pause(); 561e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn if (mCurView != which) { 562e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mRunningProcessesView.setVisibility(View.VISIBLE); 563e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mListView.setVisibility(View.GONE); 564e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 565e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 566e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mCurView = which; 567e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 568e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 569e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void showCurrentTab() { 570e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn String tabId = getTabHost().getCurrentTabTag(); 571afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int newOption; 57238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu if (TAB_DOWNLOADED.equalsIgnoreCase(tabId)) { 57338b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu newOption = FILTER_APPS_THIRD_PARTY; 57438b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu } else if (TAB_ALL.equalsIgnoreCase(tabId)) { 57538b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu newOption = FILTER_APPS_ALL; 576747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu } else if (TAB_SDCARD.equalsIgnoreCase(tabId)) { 577747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu newOption = FILTER_APPS_SDCARD; 578728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else if (TAB_RUNNING.equalsIgnoreCase(tabId)) { 579728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn selectView(VIEW_RUNNING); 580728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return; 58138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu } else { 58238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu // Invalid option. Do nothing 583afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 584afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 585728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 586e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn mFilterApps = newOption; 587728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn selectView(VIEW_LIST); 588e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn } 589e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn 590e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn public void onTabChanged(String tabId) { 591e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn showCurrentTab(); 592afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 593afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 594