ManageApplications.java revision 80e1f1bfdb814a08fb8b07b2e279285d495042e9
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License.
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport static android.net.NetworkPolicyManager.POLICY_NONE;
2014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
2138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu
22a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.app.Activity;
2338305fb1777147cbcb86774c466e88434daff141Jeff Sharkeyimport android.app.ActivityManager;
2414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.AlertDialog;
25a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackbornimport android.app.AppOpsManager;
26f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment;
2714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.INotificationManager;
2844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ComponentName;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
3014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.DialogInterface;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
3244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ServiceConnection;
3319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport android.content.pm.ApplicationInfo;
346dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.IPackageManager;
356dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.PackageInfo;
3614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.pm.PackageManager;
3714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.net.NetworkPolicyManager;
3814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.AsyncTask;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
401337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.os.Environment;
4114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.Handler;
4244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.os.IBinder;
436dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.RemoteException;
446dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.ServiceManager;
4538305fb1777147cbcb86774c466e88434daff141Jeff Sharkeyimport android.os.UserHandle;
46c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport android.os.UserManager;
47a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackbornimport android.preference.PreferenceFrameLayout;
48c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport android.provider.Settings;
49309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerAdapter;
50309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerTabStrip;
51309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.ViewPager;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu;
55f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.MenuInflater;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup;
59ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackbornimport android.view.animation.AnimationUtils;
60e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView;
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView;
62a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.widget.AdapterView.OnItemClickListener;
63c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport android.widget.AdapterView.OnItemSelectedListener;
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter;
65c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filter;
66c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filterable;
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView;
68c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport android.widget.Spinner;
69b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
7044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.internal.app.IMediaContainerService;
71b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.internal.content.PackageHelper;
72b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.R;
73263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglioimport com.android.settings.SettingsActivity;
74c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport com.android.settings.UserSpinnerAdapter;
75b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.RunningServicesActivity;
76b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.StorageUseActivity;
77c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport com.android.settings.UserSpinnerAdapter.UserDetails;
78b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.applications.ApplicationsState.AppEntry;
7944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.settings.deviceinfo.StorageMeasurement;
80309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport com.android.settings.Utils;
81b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Comparator;
8414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport java.util.List;
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
866dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornfinal class CanBeOnSdCardChecker {
876dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    final IPackageManager mPm;
886dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    int mInstallLocation;
896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
906dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    CanBeOnSdCardChecker() {
916dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mPm = IPackageManager.Stub.asInterface(
926dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                ServiceManager.getService("package"));
936dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
946dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
956dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    void init() {
966dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        try {
976dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            mInstallLocation = mPm.getInstallLocation();
986dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        } catch (RemoteException e) {
996dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            Log.e("CanBeOnSdCardChecker", "Is Package Manager running?");
1006dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            return;
1016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        }
1026dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
1036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
1046dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    boolean check(ApplicationInfo info) {
1056dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        boolean canBe = false;
1066dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
1076dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            canBe = true;
1086dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        } else {
1093c24cfed8d5116ff21986acb60a918cb079a0efdKenny Root            if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
1106dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                if (info.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL ||
1116dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        info.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
1126dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    canBe = true;
1136dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                } else if (info.installLocation
1146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) {
1156dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    if (mInstallLocation == PackageHelper.APP_INSTALL_EXTERNAL) {
1166dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        // For apps with no preference and the default value set
1176dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        // to install on sdcard.
1186dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        canBe = true;
1196dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    }
1206dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                }
1216dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            }
1226dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        }
1236dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        return canBe;
1246dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
1256dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn}
1266dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
127a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborninterface AppClickListener {
128a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    void onItemClick(ManageApplications.TabInfo tab, AdapterView<?> parent,
129a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            View view, int position, long id);
130a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn}
131a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to pick an application that will be used to display installation information and
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * options to uninstall/delete user data for system applications. This activity
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * intent.
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
138f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class ManageApplications extends Fragment implements
139a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        AppClickListener, DialogInterface.OnClickListener,
140c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        DialogInterface.OnDismissListener, OnItemSelectedListener  {
14102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
142e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final String TAG = "ManageApplications";
143e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final boolean DEBUG = false;
14402c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
14502c22131e93e1a506141b1890c7134909ded876fAmith Yamasani    private static final String EXTRA_SORT_ORDER = "sortOrder";
14602c22131e93e1a506141b1890c7134909ded876fAmith Yamasani    private static final String EXTRA_SHOW_BACKGROUND = "showBackground";
1477a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    private static final String EXTRA_DEFAULT_LIST_TYPE = "defaultListType";
14814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    private static final String EXTRA_RESET_DIALOG = "resetDialog";
14902c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // attributes used as keys when passing values to InstalledAppDetails activity
15138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu    public static final String APP_CHG = "chg";
15202c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // constant value that can be used to check return code from sub activity.
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int INSTALLED_APP_DETAILS = 1;
155d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn
156bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_TOTAL = 0;
157bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_INTERNAL = 1;
158bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_EXTERNAL = 2;
159bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order that can be changed through the menu can be sorted alphabetically
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // or size(descending)
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int MENU_OPTIONS_BASE = 0;
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Filter options used for displayed list of applications
1646cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0;
165728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1;
166728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2;
16718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    public static final int FILTER_APPS_DISABLED = MENU_OPTIONS_BASE + 3;
168747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu
1696cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4;
1706cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5;
1711337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6;
1721337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7;
17314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 8;
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private int mSortOrder = SORT_ORDER_ALPHA;
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
177e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    private ApplicationsState mApplicationsState;
178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
179309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public static class TabInfo implements OnItemClickListener {
180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final ManageApplications mOwner;
181309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final ApplicationsState mApplicationsState;
182309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mLabel;
183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final int mListType;
184309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final int mFilter;
185a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public final AppClickListener mClickListener;
186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mInvalidSizeStr;
187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mComputingSizeStr;
188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final Bundle mSavedInstanceState;
189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
190309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public ApplicationsAdapter mApplications;
191309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public LayoutInflater mInflater;
192309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public View mRootView;
193309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
194a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        private IMediaContainerService mContainerService;
195a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private View mLoadingContainer;
197309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private View mListContainer;
199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
200c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        private ViewGroup mPinnedHeader;
201c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina
202309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // ListView used to display list
203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private ListView mListView;
204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // Custom view used to display running processes
205309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private RunningProcessesView mRunningProcessesView;
206309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
207fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn        //private LinearColorBar mColorBar;
208fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn        //private TextView mStorageChartLabel;
209fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn        //private TextView mUsedStorageText;
210fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn        //private TextView mFreeStorageText;
211a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        private long mFreeStorage = 0, mAppStorage = 0, mTotalStorage = 0;
212309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage;
213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
214309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        final Runnable mRunningProcessesAvail = new Runnable() {
215309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            public void run() {
216309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                handleRunningProcessesAvail();
217309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
218309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        };
219309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
220309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public TabInfo(ManageApplications owner, ApplicationsState apps,
221a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                CharSequence label, int listType, AppClickListener clickListener,
222309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                Bundle savedInstanceState) {
223309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mOwner = owner;
224309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mApplicationsState = apps;
225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLabel = label;
226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mListType = listType;
227309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            switch (listType) {
228309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                case LIST_TYPE_DOWNLOADED: mFilter = FILTER_APPS_THIRD_PARTY; break;
229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                case LIST_TYPE_SDCARD: mFilter = FILTER_APPS_SDCARD; break;
23018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                case LIST_TYPE_DISABLED: mFilter = FILTER_APPS_DISABLED; break;
231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                default: mFilter = FILTER_APPS_ALL; break;
232309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
233309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mClickListener = clickListener;
234309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mInvalidSizeStr = owner.getActivity().getText(R.string.invalid_size_value);
235309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mComputingSizeStr = owner.getActivity().getText(R.string.computing_size);
236309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mSavedInstanceState = savedInstanceState;
237309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
238309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
239a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public void setContainerService(IMediaContainerService containerService) {
240a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mContainerService = containerService;
241a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            updateStorageUsage();
242a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
243a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public View build(LayoutInflater inflater, ViewGroup contentParent, View contentChild) {
245309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRootView != null) {
246309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                return mRootView;
247309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mInflater = inflater;
250309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRootView = inflater.inflate(mListType == LIST_TYPE_RUNNING
251309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    ? R.layout.manage_applications_running
252309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    : R.layout.manage_applications_apps, null);
253c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina            mPinnedHeader = (ViewGroup) mRootView.findViewById(R.id.pinned_header);
254c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina            if (mOwner.mProfileSpinnerAdapter != null) {
255c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina                Spinner spinner = (Spinner) inflater.inflate(R.layout.spinner_view, null);
256c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina                spinner.setAdapter(mOwner.mProfileSpinnerAdapter);
257c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina                spinner.setOnItemSelectedListener(mOwner);
258c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina                mPinnedHeader.addView(spinner);
259c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina                mPinnedHeader.setVisibility(View.VISIBLE);
260c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina            }
261309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer = mRootView.findViewById(R.id.loading_container);
262309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.setVisibility(View.VISIBLE);
263309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mListContainer = mRootView.findViewById(R.id.list_container);
264309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mListContainer != null) {
265309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                // Create adapter and list view here
266309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty);
267309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                ListView lv = (ListView) mListContainer.findViewById(android.R.id.list);
268309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (emptyView != null) {
269309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    lv.setEmptyView(emptyView);
270309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
271309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setOnItemClickListener(this);
272309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setSaveEnabled(true);
273309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setItemsCanFocus(true);
274309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setTextFilterEnabled(true);
275309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView = lv;
276309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications = new ApplicationsAdapter(mApplicationsState, this, mFilter);
277309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView.setAdapter(mApplications);
278309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView.setRecyclerListener(mApplications);
279fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                //mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar);
280fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                //mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel);
281fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                //mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText);
282fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                //mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText);
283309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false);
284a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (mFilter == FILTER_APPS_SDCARD) {
285fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                    //mStorageChartLabel.setText(mOwner.getActivity().getText(
286fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                    //        R.string.sd_card_storage));
287a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                } else {
288fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                    //mStorageChartLabel.setText(mOwner.getActivity().getText(
289fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                    //        R.string.internal_storage));
290a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                }
291a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                applyCurrentStorage();
292309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
293309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView = (RunningProcessesView)mRootView.findViewById(
294309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    R.id.running_processes);
295309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
296309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mRunningProcessesView.doCreate(mSavedInstanceState);
297309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
298309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
299309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mRootView;
300309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
301309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
302a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public void detachView() {
303a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mRootView != null) {
304a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                ViewGroup group = (ViewGroup)mRootView.getParent();
305a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (group != null) {
306a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    group.removeView(mRootView);
307a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                }
308a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            }
309a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
310a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
311309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void resume(int sortOrder) {
312309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications != null) {
313309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications.resume(sortOrder);
314309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
315309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
316309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                boolean haveData = mRunningProcessesView.doResume(mOwner, mRunningProcessesAvail);
317309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (haveData) {
318309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mRunningProcessesView.setVisibility(View.VISIBLE);
319309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLoadingContainer.setVisibility(View.INVISIBLE);
320309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                } else {
321309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLoadingContainer.setVisibility(View.VISIBLE);
322309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
323309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
324309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
325309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
326309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void pause() {
327309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications != null) {
328309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications.pause();
329309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
330309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
331309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mRunningProcessesView.doPause();
332309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
333309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
334309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
335f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su        public void release() {
336f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su            if (mApplications != null) {
337f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su                mApplications.release();
338f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su            }
339f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su        }
340f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su
341309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        void updateStorageUsage() {
342309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            // Make sure a callback didn't come at an inopportune time.
343309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mOwner.getActivity() == null) return;
344309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            // Doesn't make sense for stuff that is not an app list.
345309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications == null) return;
346309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
347a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mFreeStorage = 0;
348a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mAppStorage = 0;
349a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTotalStorage = 0;
350309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
351309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mFilter == FILTER_APPS_SDCARD) {
352309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mContainerService != null) {
353309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    try {
354309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        final long[] stats = mContainerService.getFileSystemStats(
355309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                Environment.getExternalStorageDirectory().getPath());
356a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mTotalStorage = stats[0];
357a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mFreeStorage = stats[1];
358309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    } catch (RemoteException e) {
359309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        Log.w(TAG, "Problem in container service", e);
360309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
361309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
362309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
363309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mApplications != null) {
364309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    final int N = mApplications.getCount();
365309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    for (int i=0; i<N; i++) {
366309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
3671f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                        mAppStorage += ae.externalCodeSize + ae.externalDataSize
3681f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                                + ae.externalCacheSize;
369309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
370309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
371309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            } else {
372309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mContainerService != null) {
373309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    try {
374309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        final long[] stats = mContainerService.getFileSystemStats(
375309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                Environment.getDataDirectory().getPath());
376a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mTotalStorage = stats[0];
377a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mFreeStorage = stats[1];
378309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    } catch (RemoteException e) {
379309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        Log.w(TAG, "Problem in container service", e);
380309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
381309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
382309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
383309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                final boolean emulatedStorage = Environment.isExternalStorageEmulated();
384309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mApplications != null) {
385309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    final int N = mApplications.getCount();
386309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    for (int i=0; i<N; i++) {
387309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
388a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mAppStorage += ae.codeSize + ae.dataSize;
389309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        if (emulatedStorage) {
390a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            mAppStorage += ae.externalCodeSize + ae.externalDataSize;
391309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        }
392309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
393309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
394a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mFreeStorage += mApplicationsState.sumCacheSizes();
395309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
396a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
397a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            applyCurrentStorage();
398a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
399a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
400a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        void applyCurrentStorage() {
401a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            // If view hierarchy is not yet created, no views to update.
402a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mRootView == null) {
403a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                return;
404309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
405fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn            /*
406a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mTotalStorage > 0) {
40737f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                BidiFormatter bidiFormatter = BidiFormatter.getInstance();
408a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mColorBar.setRatios((mTotalStorage-mFreeStorage-mAppStorage)/(float)mTotalStorage,
409a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mAppStorage/(float)mTotalStorage, mFreeStorage/(float)mTotalStorage);
410a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                long usedStorage = mTotalStorage - mFreeStorage;
411309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastUsedStorage != usedStorage) {
412309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastUsedStorage = usedStorage;
41337f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                    String sizeStr = bidiFormatter.unicodeWrap(
41437f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                            Formatter.formatShortFileSize(mOwner.getActivity(), usedStorage));
415309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mUsedStorageText.setText(mOwner.getActivity().getResources().getString(
416309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            R.string.service_foreground_processes, sizeStr));
417309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
418a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (mLastFreeStorage != mFreeStorage) {
419a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mLastFreeStorage = mFreeStorage;
42037f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                    String sizeStr = bidiFormatter.unicodeWrap(
42137f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                            Formatter.formatShortFileSize(mOwner.getActivity(), mFreeStorage));
422309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mFreeStorageText.setText(mOwner.getActivity().getResources().getString(
423309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            R.string.service_background_processes, sizeStr));
424309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
425309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            } else {
426309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mColorBar.setRatios(0, 0, 0);
427309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastUsedStorage != -1) {
428309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastUsedStorage = -1;
429309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mUsedStorageText.setText("");
430309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
431309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastFreeStorage != -1) {
432309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastFreeStorage = -1;
433309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mFreeStorageText.setText("");
434309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
435309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
436fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn            */
437309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
438309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
439309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
440309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
441a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mClickListener.onItemClick(this, parent, view, position, id);
442309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
443309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
444309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        void handleRunningProcessesAvail() {
445309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
446309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mOwner.getActivity(), android.R.anim.fade_out));
447309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation(
448309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mOwner.getActivity(), android.R.anim.fade_in));
449309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView.setVisibility(View.VISIBLE);
450309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.setVisibility(View.GONE);
451309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
452309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
453309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
45418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    private int mNumTabs;
455309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    TabInfo mCurTab = null;
456309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
457afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Size resource used for packages whose size computation failed for some reason
4589244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    CharSequence mInvalidSizeStr;
459afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingSizeStr;
460afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
461afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // layout inflater object used to inflate views
462afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LayoutInflater mInflater;
463afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
464de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private String mCurrentPkgName;
465afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
466ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    private Menu mOptionsMenu;
4677a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
4687a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    // These are for keeping track of activity and spinner switch state.
469728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    private boolean mActivityResumed;
470728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
4717a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_DOWNLOADED = 0;
4727a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_RUNNING = 1;
4737a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_SDCARD = 2;
4747a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_ALL = 3;
47518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    static final int LIST_TYPE_DISABLED = 4;
476f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
4770385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn    private boolean mShowBackground = false;
4780385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn
4797a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    private int mDefaultListType = -1;
480f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
481309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ViewGroup mContentContainer;
482309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private View mRootView;
483309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ViewPager mViewPager;
484c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    private UserSpinnerAdapter mProfileSpinnerAdapter;
485c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    private Context mContext;
486f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
48714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    AlertDialog mResetDialog;
48814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
489309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    class MyPagerAdapter extends PagerAdapter
490309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            implements ViewPager.OnPageChangeListener {
491309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        int mCurPos = 0;
492309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
493309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
494309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public int getCount() {
49518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            return mNumTabs;
496309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
497309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
498309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
499309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public Object instantiateItem(ViewGroup container, int position) {
500309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = mTabs.get(position);
501309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            View root = tab.build(mInflater, mContentContainer, mRootView);
502309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            container.addView(root);
50318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            root.setTag(R.id.name, tab);
504309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return root;
505309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
506309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
507309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
508309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void destroyItem(ViewGroup container, int position, Object object) {
509309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            container.removeView((View)object);
510ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn        }
511ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn
512309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
513309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public boolean isViewFromObject(View view, Object object) {
514309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return view == object;
515309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
5167a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
517309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
51818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        public int getItemPosition(Object object) {
51918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            return super.getItemPosition(object);
52018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            //return ((TabInfo)((View)object).getTag(R.id.name)).mListType;
52118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        }
52218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
52318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        @Override
524309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public CharSequence getPageTitle(int position) {
525309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mTabs.get(position).mLabel;
526309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
527309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
528309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
529309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
530309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
531309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
532309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
533309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageSelected(int position) {
534309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurPos = position;
535309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
536309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
537309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
538309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageScrollStateChanged(int state) {
539309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (state == ViewPager.SCROLL_STATE_IDLE) {
540309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                updateCurrentTab(mCurPos);
541309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
5427a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        }
5437a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    }
5447a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
545e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project    /*
546e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * Custom adapter implementation for the ListView
547e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * This adapter maintains a map for each displayed application and its properties
548e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * An index value on each AppInfo object indicates the correct position or index
549e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * in the list. If the list gets updated dynamically when the user is viewing the list of
550e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * applications, we need to return the correct index of position. This is done by mapping
551e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * the getId methods via the package name into the internal maps and indices.
552e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * The order of applications in the list is mirrored in mAppLocalList
553e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project     */
554309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    static class ApplicationsAdapter extends BaseAdapter implements Filterable,
555e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.Callbacks, AbsListView.RecyclerListener {
556e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ApplicationsState mState;
557309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final ApplicationsState.Session mSession;
558309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final TabInfo mTab;
559309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final Context mContext;
560e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ArrayList<View> mActive = new ArrayList<View>();
561309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final int mFilterMode;
562e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mBaseEntries;
563e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mEntries;
564e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private boolean mResumed;
565309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private int mLastSortMode=-1;
56619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        private boolean mWaitingForData;
567bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        private int mWhichSize = SIZE_TOTAL;
568e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        CharSequence mCurFilterPrefix;
569e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
570e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private Filter mFilter = new Filter() {
571e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
572e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected FilterResults performFiltering(CharSequence constraint) {
573e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> entries
574e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = applyPrefixFilter(constraint, mBaseEntries);
575e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                FilterResults fr = new FilterResults();
576e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.values = entries;
577e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.count = entries.size();
578e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return fr;
579e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            }
580355b32faa924a0b39067dd759ba03e5af97065caSuchi Amalapurapu
581e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
582e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected void publishResults(CharSequence constraint, FilterResults results) {
583e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mCurFilterPrefix = constraint;
584e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values;
585e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                notifyDataSetChanged();
586309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.updateStorageUsage();
587afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
588e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        };
589c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
590309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public ApplicationsAdapter(ApplicationsState state, TabInfo tab, int filterMode) {
591e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mState = state;
592309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mSession = state.newSession(this);
593309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab = tab;
594309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mContext = tab.mOwner.getActivity();
595309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mFilterMode = filterMode;
596c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
597e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
598309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void resume(int sort) {
599e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Resume!  mResumed=" + mResumed);
600e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (!mResumed) {
601e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = true;
602309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mSession.resume();
603e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mLastSortMode = sort;
60419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                rebuild(true);
605e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            } else {
606309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                rebuild(sort);
607c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
608e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project        }
609c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
610e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void pause() {
611e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mResumed) {
612e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = false;
613309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mSession.pause();
614e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
615afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
616b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
617f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su        public void release() {
618f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su            mSession.release();
619f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su        }
620f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su
621309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void rebuild(int sort) {
622309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (sort == mLastSortMode) {
623e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return;
624e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
625e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mLastSortMode = sort;
62619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            rebuild(true);
627afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
628afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
62919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        public void rebuild(boolean eraseold) {
630e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Rebuilding app list...");
631e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppFilter filterObj;
632e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            Comparator<AppEntry> comparatorObj;
633bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            boolean emulated = Environment.isExternalStorageEmulated();
634bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            if (emulated) {
635bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mWhichSize = SIZE_TOTAL;
636bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            } else {
637bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mWhichSize = SIZE_INTERNAL;
638bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            }
639309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            switch (mFilterMode) {
640e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_THIRD_PARTY:
641e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.THIRD_PARTY_FILTER;
642e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
643e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_SDCARD:
644e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.ON_SD_CARD_FILTER;
645bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                    if (!emulated) {
646bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                        mWhichSize = SIZE_EXTERNAL;
647bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                    }
648e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
64918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                case FILTER_APPS_DISABLED:
65018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                    filterObj = ApplicationsState.DISABLED_FILTER;
65118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                    break;
652e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
65318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                    filterObj = ApplicationsState.ALL_ENABLED_FILTER;
654e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
655e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
656e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            switch (mLastSortMode) {
657e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case SORT_ORDER_SIZE:
658430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                    switch (mWhichSize) {
659430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        case SIZE_INTERNAL:
660430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR;
661430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
662430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        case SIZE_EXTERNAL:
663430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.EXTERNAL_SIZE_COMPARATOR;
664430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
665430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        default:
666430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.SIZE_COMPARATOR;
667430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
668430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                    }
669e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
670e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
671e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    comparatorObj = ApplicationsState.ALPHA_COMPARATOR;
672e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
673e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
67419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            ArrayList<ApplicationsState.AppEntry> entries
675309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    = mSession.rebuild(filterObj, comparatorObj);
67619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (entries == null && !eraseold) {
67719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                // Don't have new list yet, but can continue using the old one.
67819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                return;
67919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
68019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mBaseEntries = entries;
68119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (mBaseEntries != null) {
68219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
68319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            } else {
68419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mEntries = null;
68519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
686e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            notifyDataSetChanged();
687309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.updateStorageUsage();
68819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
68919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (entries == null) {
69019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mWaitingForData = true;
691309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.setVisibility(View.INVISIBLE);
692309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.setVisibility(View.VISIBLE);
69319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            } else {
694309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.setVisibility(View.VISIBLE);
695309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.setVisibility(View.GONE);
69619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
697afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
698afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
699e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix,
700e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> origEntries) {
701e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (prefix == null || prefix.length() == 0) {
702e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return origEntries;
703afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
704e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                String prefixStr = ApplicationsState.normalize(prefix.toString());
705e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                final String spacePrefixStr = " " + prefixStr;
706e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> newEntries
707e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = new ArrayList<ApplicationsState.AppEntry>();
708e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                for (int i=0; i<origEntries.size(); i++) {
709e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    ApplicationsState.AppEntry entry = origEntries.get(i);
710e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    String nlabel = entry.getNormalizedLabel();
711e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) {
712e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        newEntries.add(entry);
713ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                    }
714ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                }
715e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return newEntries;
716afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
717afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
718ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu
719e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
720e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onRunningStateChanged(boolean running) {
721309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mOwner.getActivity().setProgressBarIndeterminateVisibility(running);
722afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
723b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
724e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
72519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        public void onRebuildComplete(ArrayList<AppEntry> apps) {
726309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mTab.mLoadingContainer.getVisibility() == View.VISIBLE) {
727309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
728309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        mContext, android.R.anim.fade_out));
729309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.startAnimation(AnimationUtils.loadAnimation(
730309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        mContext, android.R.anim.fade_in));
7314e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn            }
732309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mListContainer.setVisibility(View.VISIBLE);
733309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mLoadingContainer.setVisibility(View.GONE);
73419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mWaitingForData = false;
73519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mBaseEntries = apps;
73619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
73719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            notifyDataSetChanged();
738309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.updateStorageUsage();
73919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        }
74019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
74119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        @Override
742e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageListChanged() {
74319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            rebuild(false);
744afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
745b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
746e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
747e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageIconChanged() {
748e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // We ensure icons are loaded when their item is displayed, so
749e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // don't care about icons loaded in the background.
750afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
751b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
752e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
753e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageSizeChanged(String packageName) {
754e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            for (int i=0; i<mActive.size(); i++) {
755e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag();
756e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (holder.entry.info.packageName.equals(packageName)) {
757e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    synchronized (holder.entry) {
758309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
759c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
760309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    if (holder.entry.info.packageName.equals(mTab.mOwner.mCurrentPkgName)
761e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                            && mLastSortMode == SORT_ORDER_SIZE) {
762e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // We got the size information for the last app the
763e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // user viewed, and are sorting by size...  they may
764e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // have cleared data, so we immediately want to resort
765e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // the list with the new size to reflect it to the user.
76619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                        rebuild(false);
767c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
768309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mTab.updateStorageUsage();
769e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    return;
770c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                }
771c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
772c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
773c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
774e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
775e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onAllSizesComputed() {
776e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mLastSortMode == SORT_ORDER_SIZE) {
77719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                rebuild(false);
778afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
779a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTab.updateStorageUsage();
780afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
781afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
782afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int getCount() {
783e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries != null ? mEntries.size() : 0;
784afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
785afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
786afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public Object getItem(int position) {
787e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
788afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
789afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
790e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public ApplicationsState.AppEntry getAppEntry(int position) {
791e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
792afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
793afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
794afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public long getItemId(int position) {
795e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position).id;
796afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
797afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
798afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
799347c9a0544328e65120582834ce330fb0d473f28Jeff Brown            // A ViewHolder keeps references to children views to avoid unnecessary calls
800afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to findViewById() on each row.
801309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            AppViewHolder holder = AppViewHolder.createOrRecycle(mTab.mInflater, convertView);
8029244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            convertView = holder.rootView;
803afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
804afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Bind the data efficiently with the holder
805e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppEntry entry = mEntries.get(position);
806e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            synchronized (entry) {
807e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                holder.entry = entry;
808e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.label != null) {
809e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appName.setText(entry.label);
810afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
811e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mState.ensureIcon(entry);
812e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.icon != null) {
813e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appIcon.setImageDrawable(entry.icon);
814afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
815309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
8163db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                if ((entry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {
8173db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setVisibility(View.VISIBLE);
8183db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setText(R.string.not_installed);
8193db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                } else if (!entry.info.enabled) {
8203db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setVisibility(View.VISIBLE);
8213db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setText(R.string.disabled);
82244178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                } else {
82344178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    holder.disabled.setVisibility(View.GONE);
82444178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                }
825309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mFilterMode == FILTER_APPS_SDCARD) {
8266dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setVisibility(View.VISIBLE);
8276dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setChecked((entry.info.flags
8286dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                            & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
8296dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                } else {
8306dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setVisibility(View.GONE);
8316dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                }
832afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
833e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(convertView);
834e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.add(convertView);
835afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return convertView;
836afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
837c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
838e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
839c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        public Filter getFilter() {
840e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mFilter;
841c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
842c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
843e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
844e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onMovedToScrapHeap(View view) {
845e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(view);
846728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
847728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
848c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina
849afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
850f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle savedInstanceState) {
851afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
852f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
853f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        setHasOptionsMenu(true);
854f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
855c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        mContext = getActivity();
856f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
857f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        Intent intent = getActivity().getIntent();
858ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        String action = intent.getAction();
8597a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        int defaultListType = LIST_TYPE_DOWNLOADED;
860ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        String className = getArguments() != null
861ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                ? getArguments().getString("classname") : null;
862ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (className == null) {
863ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            className = intent.getComponent().getClassName();
864ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
865af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani        if (className.equals(RunningServicesActivity.class.getName())
866af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || className.endsWith(".RunningServices")) {
8677a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_RUNNING;
8685203bdffe6ce2b829d0fab8c7691fa92aca6e972Amith Yamasani        } else if (className.equals(StorageUseActivity.class.getName())
869af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || Intent.ACTION_MANAGE_PACKAGE_STORAGE.equals(action)
870af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || className.endsWith(".StorageUse")) {
871afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSortOrder = SORT_ORDER_SIZE;
8727a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_ALL;
873263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio        } else if (android.provider.Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)) {
8747a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            // Select the all-apps list, with the default sorting
8757a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_ALL;
876afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
8777a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
878728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (savedInstanceState != null) {
87902c22131e93e1a506141b1890c7134909ded876fAmith Yamasani            mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder);
8807a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            int tmp = savedInstanceState.getInt(EXTRA_DEFAULT_LIST_TYPE, -1);
8817a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            if (tmp != -1) defaultListType = tmp;
88202c22131e93e1a506141b1890c7134909ded876fAmith Yamasani            mShowBackground = savedInstanceState.getBoolean(EXTRA_SHOW_BACKGROUND, false);
883728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
8847a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
8857a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        mDefaultListType = defaultListType;
8863b7dbcecf70788df4950340cbf750dbe524dca96Amith Yamasani
88744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        final Intent containerIntent = new Intent().setComponent(
88844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey                StorageMeasurement.DEFAULT_CONTAINER_COMPONENT);
88944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE);
8901337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
891f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
892f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingSizeStr = getActivity().getText(R.string.computing_size);
893f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
894a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        TabInfo tab = new TabInfo(this, mApplicationsState,
895309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_third_party),
896309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_DOWNLOADED, this, savedInstanceState);
897309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
898f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
899309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (!Environment.isExternalStorageEmulated()) {
900a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            tab = new TabInfo(this, mApplicationsState,
901309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    getActivity().getString(R.string.filter_apps_onsdcard),
902309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    LIST_TYPE_SDCARD, this, savedInstanceState);
903309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTabs.add(tab);
904508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
9057a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
906a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        tab = new TabInfo(this, mApplicationsState,
907309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_running),
908309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_RUNNING, this, savedInstanceState);
909309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
9107a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
911a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        tab = new TabInfo(this, mApplicationsState,
912309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_all),
913309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_ALL, this, savedInstanceState);
914309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
91518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
91618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        tab = new TabInfo(this, mApplicationsState,
91718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                getActivity().getString(R.string.filter_apps_disabled),
91818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                LIST_TYPE_DISABLED, this, savedInstanceState);
91918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        mTabs.add(tab);
92018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
92118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        mNumTabs = mTabs.size();
922c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina
923c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
92480e1f1bfdb814a08fb8b07b2e279285d495042e9Alexandra Gherghina        mProfileSpinnerAdapter = Utils.createUserSpinnerAdapter(um, mContext);
925309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
9267a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
9277a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
928309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    @Override
929309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
930309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // initialize the inflater
931309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mInflater = inflater;
9327a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
933309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        View rootView = mInflater.inflate(R.layout.manage_applications_content,
934309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                container, false);
935309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mContentContainer = container;
936309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mRootView = rootView;
9377a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
938309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
939309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        MyPagerAdapter adapter = new MyPagerAdapter();
940309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager.setAdapter(adapter);
941309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager.setOnPageChangeListener(adapter);
942309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs);
943cc22af08117a2f90d879cc360f76de48fd234e0dFabrice Di Meglio        tabs.setTabIndicatorColorResource(R.color.theme_accent);
9447a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
945a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // We have to do this now because PreferenceFrameLayout looks at it
946a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // only when the view is added.
947a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        if (container instanceof PreferenceFrameLayout) {
948a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true;
949a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
950a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
95114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
95214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            buildResetDialog();
95314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
95414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
95513ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn        if (savedInstanceState == null) {
95613ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            // First time init: make sure view pager is showing the correct tab.
95713ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            for (int i = 0; i < mTabs.size(); i++) {
95813ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                TabInfo tab = mTabs.get(i);
95913ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                if (tab.mListType == mDefaultListType) {
96013ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                    mViewPager.setCurrentItem(i);
96113ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                    break;
96213ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                }
96313ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            }
96413ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn        }
96513ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn
966309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        return rootView;
967afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
968f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
969f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    @Override
970728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public void onStart() {
971728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onStart();
972b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu    }
973b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
974afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
975f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onResume() {
976728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onResume();
977728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = true;
978309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        updateCurrentTab(mViewPager.getCurrentItem());
979f5f08628cc0129e92277d6ddfcf6ae680887573dDianne Hackborn        updateNumTabs();
980ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
981afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
982b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
983728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
984f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onSaveInstanceState(Bundle outState) {
985728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onSaveInstanceState(outState);
98602c22131e93e1a506141b1890c7134909ded876fAmith Yamasani        outState.putInt(EXTRA_SORT_ORDER, mSortOrder);
9877a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        if (mDefaultListType != -1) {
9887a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            outState.putInt(EXTRA_DEFAULT_LIST_TYPE, mDefaultListType);
989f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
99002c22131e93e1a506141b1890c7134909ded876fAmith Yamasani        outState.putBoolean(EXTRA_SHOW_BACKGROUND, mShowBackground);
99114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog != null) {
99214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            outState.putBoolean(EXTRA_RESET_DIALOG, true);
99314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
994728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
995728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
996728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
997f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onPause() {
998728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onPause();
999728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = false;
1000309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
1001309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTabs.get(i).pause();
1002728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
1003728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
1004728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
1005728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
100614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onStop() {
100714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        super.onStop();
100814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog != null) {
100914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog.dismiss();
101014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = null;
101114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
101214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
101314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
101414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
1015a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    public void onDestroyView() {
1016a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        super.onDestroyView();
1017a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
1018a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // We are going to keep the tab data structures around, but they
1019a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // are no longer attached to their view hierarchy.
1020a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
1021a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTabs.get(i).detachView();
1022f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su            mTabs.get(i).release();
1023a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
1024a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    }
1025a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
1026a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    @Override
1027f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onActivityResult(int requestCode, int resultCode, Intent data) {
1028728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
1029e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mApplicationsState.requestSize(mCurrentPkgName);
1030ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        }
1031afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
10327a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
1033c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    @Override
1034c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
1035c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        UserHandle selectedUser = mProfileSpinnerAdapter.getUserHandle(position);
1036c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        if (selectedUser.getIdentifier() != UserHandle.myUserId()) {
1037c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina            Intent intent = new Intent(Settings.ACTION_APPLICATION_SETTINGS);
1038c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1039c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina            mContext.startActivityAsUser(intent, selectedUser);
1040c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina            getActivity().finish();
1041c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        }
1042c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    }
1043c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina
1044c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    @Override
1045c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    public void onNothingSelected(AdapterView<?> parent) {
1046c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        // Nothing to do
1047c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    }
1048c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina
104918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    private void updateNumTabs() {
105018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        int newNum = mApplicationsState.haveDisabledApps() ? mTabs.size() : (mTabs.size()-1);
105118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        if (newNum != mNumTabs) {
105218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            mNumTabs = newNum;
105318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            if (mViewPager != null) {
105418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                mViewPager.getAdapter().notifyDataSetChanged();
105518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            }
105618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        }
105718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    }
105818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
1059309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    TabInfo tabForType(int type) {
1060309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i = 0; i < mTabs.size(); i++) {
1061309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = mTabs.get(i);
1062309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (tab.mListType == type) {
1063309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                return tab;
1064309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
10657a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        }
1066309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        return null;
10677a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    }
10687a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
1069afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // utility method used to start sub activity
1070afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void startApplicationDetailsActivity() {
1071f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        // start new fragment to display extended information
1072f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        Bundle args = new Bundle();
1073f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mCurrentPkgName);
1074f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
1075263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio        SettingsActivity sa = (SettingsActivity) getActivity();
1076263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio        sa.startPreferencePanel(InstalledAppDetails.class.getName(), args,
1077ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                R.string.application_info_label, null, this, INSTALLED_APP_DETAILS);
1078afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1079afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1080afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1081f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
1082ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mOptionsMenu = menu;
10830385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn        // note: icons removed for now because the cause the new action
10840385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn        // bar UI to be very confusing.
1085afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
10860385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn                //.setIcon(android.R.drawable.ic_menu_sort_alphabetically)
1087348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1088afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
10890385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn                //.setIcon(android.R.drawable.ic_menu_sort_by_size)
1090348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1091ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services)
1092ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
1093ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes)
1094ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
109514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        menu.add(0, RESET_APP_PREFERENCES, 4, R.string.reset_app_preferences)
109614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1097ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1098afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1099afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1101f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onPrepareOptionsMenu(Menu menu) {
1102ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1103ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
1104ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
1105ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    @Override
1106ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onDestroyOptionsMenu() {
1107ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mOptionsMenu = null;
1108ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
110944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
111044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    @Override
111144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    public void onDestroy() {
111244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        getActivity().unbindService(mContainerConnection);
111344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        super.onDestroy();
111444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    }
111544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
1116ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    void updateOptionsMenu() {
1117ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (mOptionsMenu == null) {
1118ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return;
1119ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
1120ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
1121673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root        /*
1122673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         * The running processes screen doesn't use the mApplicationsAdapter
1123673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         * so bringing up this menu in that case doesn't make any sense.
1124673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         */
1125309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (mCurTab != null && mCurTab.mListType == LIST_TYPE_RUNNING) {
1126309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = tabForType(LIST_TYPE_RUNNING);
1127309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            boolean showingBackground = tab != null && tab.mRunningProcessesView != null
1128309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    ? tab.mRunningProcessesView.mAdapter.getShowBackground() : false;
1129ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false);
1130ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false);
1131ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground);
1132ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground);
113314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false);
1134eca1fc2cadb9c1f15ab042e2080a8b8eb40ab6faThiago Vinícius Freire de Araújo Ribeiro            mShowBackground = showingBackground;
11351337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else {
1136ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
1137ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
1138ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false);
1139ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false);
114014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(true);
114114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
114214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
114314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
114414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    void buildResetDialog() {
114514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == null) {
114614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
114714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setTitle(R.string.reset_app_preferences_title);
114814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setMessage(R.string.reset_app_preferences_desc);
114914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setPositiveButton(R.string.reset_app_preferences_button, this);
115014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setNegativeButton(R.string.cancel, null);
115114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = builder.show();
115214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog.setOnDismissListener(this);
115314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
115414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
115514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
115614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
115714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onDismiss(DialogInterface dialog) {
115814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == dialog) {
115914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = null;
116014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
116114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
116214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
116314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
116414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
116514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onClick(DialogInterface dialog, int which) {
116614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == dialog) {
116714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final PackageManager pm = getActivity().getPackageManager();
1168596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn            final IPackageManager mIPm = IPackageManager.Stub.asInterface(
1169a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn                    ServiceManager.getService("package"));
117014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final INotificationManager nm = INotificationManager.Stub.asInterface(
117114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    ServiceManager.getService(Context.NOTIFICATION_SERVICE));
117214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final NetworkPolicyManager npm = NetworkPolicyManager.from(getActivity());
1173a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn            final AppOpsManager aom = (AppOpsManager)getActivity().getSystemService(
1174a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn                    Context.APP_OPS_SERVICE);
117514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final Handler handler = new Handler(getActivity().getMainLooper());
117614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            (new AsyncTask<Void, Void, Void>() {
117714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                @Override protected Void doInBackground(Void... params) {
117814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    List<ApplicationInfo> apps = pm.getInstalledApplications(
117914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            PackageManager.GET_DISABLED_COMPONENTS);
118014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    for (int i=0; i<apps.size(); i++) {
118114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        ApplicationInfo app = apps.get(i);
118214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        try {
118314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName);
1184df3f6d6c4722a7acc8189e47d0499aaf618969f9Daniel Sandler                            nm.setNotificationsEnabledForPackage(app.packageName, app.uid, true);
118514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        } catch (android.os.RemoteException ex) {
118614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
118714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        if (!app.enabled) {
118814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName);
118914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (pm.getApplicationEnabledSetting(app.packageName)
119014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                    == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
119114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                pm.setApplicationEnabledSetting(app.packageName,
119214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                        PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
119314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                        PackageManager.DONT_KILL_APP);
119414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            }
119514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
119614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
1197596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn                    try {
1198596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn                        mIPm.resetPreferredActivities(UserHandle.myUserId());
1199596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn                    } catch (RemoteException e) {
120014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
1201a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn                    aom.resetAllModes();
120238305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    final int[] restrictedUids = npm.getUidsWithPolicy(
120314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            POLICY_REJECT_METERED_BACKGROUND);
120438305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    final int currentUserId = ActivityManager.getCurrentUser();
120538305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    for (int uid : restrictedUids) {
120638305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        // Only reset for current user
120738305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        if (UserHandle.getUserId(uid) == currentUserId) {
120838305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                            if (DEBUG) Log.v(TAG, "Clearing data policy: " + uid);
120938305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                            npm.setUidPolicy(uid, POLICY_NONE);
121038305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        }
121114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
121214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    handler.post(new Runnable() {
121314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        @Override public void run() {
121414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Done clearing");
121514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (getActivity() != null && mActivityResumed) {
121614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                if (DEBUG) Log.v(TAG, "Updating UI!");
1217309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                for (int i=0; i<mTabs.size(); i++) {
1218309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    TabInfo tab = mTabs.get(i);
1219309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    if (tab.mApplications != null) {
1220309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                        tab.mApplications.pause();
1221309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    }
1222309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                }
1223309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                if (mCurTab != null) {
1224309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    mCurTab.resume(mSortOrder);
1225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                }
122614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            }
122714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
122814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    });
122914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    return null;
123014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                }
123114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            }).execute();
1232673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root        }
1233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
1237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int menuId = item.getItemId();
1238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) {
1239e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mSortOrder = menuId;
1240309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mApplications != null) {
1241309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mApplications.rebuild(mSortOrder);
12421337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            }
12431337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else if (menuId == SHOW_RUNNING_SERVICES) {
12440385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn            mShowBackground = false;
1245309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
1246309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(false);
1247309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
12481337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else if (menuId == SHOW_BACKGROUND_PROCESSES) {
12490385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn            mShowBackground = true;
1250309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
1251309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(true);
1252309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
125314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        } else if (menuId == RESET_APP_PREFERENCES) {
125414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            buildResetDialog();
1255f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani        } else {
1256f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani            // Handle the home button
1257f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani            return false;
1258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1259ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return true;
1261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1262d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn
1263a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    public void onItemClick(TabInfo tab, AdapterView<?> parent, View view, int position,
1264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long id) {
1265a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        if (tab.mApplications != null && tab.mApplications.getCount() > position) {
1266a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            ApplicationsState.AppEntry entry = tab.mApplications.getAppEntry(position);
1267309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurrentPkgName = entry.info.packageName;
1268309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            startApplicationDetailsActivity();
12691337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
1270309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
12711337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
1272309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public void updateCurrentTab(int position) {
1273309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        TabInfo tab = mTabs.get(position);
1274309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mCurTab = tab;
127544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
1276309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // Put things in the correct paused/resumed state.
1277309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (mActivityResumed) {
1278309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.build(mInflater, mContentContainer, mRootView);
1279309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.resume(mSortOrder);
12801337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else {
1281309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.pause();
12821337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
1283309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
1284309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo t = mTabs.get(i);
1285309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (t != mCurTab) {
1286309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                t.pause();
12871337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            }
12881337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
12891337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
1290309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mCurTab.updateStorageUsage();
1291309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        updateOptionsMenu();
1292a31be80ef056add00e0d239414f80f932978277fAdam Powell        final Activity host = getActivity();
1293a31be80ef056add00e0d239414f80f932978277fAdam Powell        if (host != null) {
1294a31be80ef056add00e0d239414f80f932978277fAdam Powell            host.invalidateOptionsMenu();
1295a31be80ef056add00e0d239414f80f932978277fAdam Powell        }
1296e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    }
1297e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
129844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    private volatile IMediaContainerService mContainerService;
129944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
130044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    private final ServiceConnection mContainerConnection = new ServiceConnection() {
130144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        @Override
130244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        public void onServiceConnected(ComponentName name, IBinder service) {
130344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey            mContainerService = IMediaContainerService.Stub.asInterface(service);
1304a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            for (int i=0; i<mTabs.size(); i++) {
1305a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mTabs.get(i).setContainerService(mContainerService);
1306309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
130744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        }
130844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
130944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        @Override
131044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        public void onServiceDisconnected(ComponentName name) {
131144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey            mContainerService = null;
131244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        }
131344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    };
1314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1315