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