ManageApplications.java revision 38305fb1777147cbcb86774c466e88434daff141
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;
25f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment;
2614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.INotificationManager;
2744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ComponentName;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
2914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.DialogInterface;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
3114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.IntentFilter;
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;
46f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.preference.PreferenceActivity;
47a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackbornimport android.preference.PreferenceFrameLayout;
48728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.provider.Settings;
49309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerAdapter;
50309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerTabStrip;
51309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.ViewPager;
521337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.text.format.Formatter;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu;
56f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.MenuInflater;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem;
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup;
60ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackbornimport android.view.animation.AnimationUtils;
61e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView;
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView;
63a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.widget.AdapterView.OnItemClickListener;
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;
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
69b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
7044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.internal.app.IMediaContainerService;
71b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.internal.content.PackageHelper;
72b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.R;
73b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.RunningServicesActivity;
74b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.StorageUseActivity;
75b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.applications.ApplicationsState.AppEntry;
7644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.settings.deviceinfo.StorageMeasurement;
77309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport com.android.settings.Utils;
78b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Comparator;
8114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport java.util.List;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
836dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornfinal class CanBeOnSdCardChecker {
846dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    final IPackageManager mPm;
856dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    int mInstallLocation;
866dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
876dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    CanBeOnSdCardChecker() {
886dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mPm = IPackageManager.Stub.asInterface(
896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                ServiceManager.getService("package"));
906dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
916dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
926dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    void init() {
936dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        try {
946dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            mInstallLocation = mPm.getInstallLocation();
956dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        } catch (RemoteException e) {
966dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            Log.e("CanBeOnSdCardChecker", "Is Package Manager running?");
976dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            return;
986dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        }
996dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
1006dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
1016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    boolean check(ApplicationInfo info) {
1026dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        boolean canBe = false;
1036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
1046dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            canBe = true;
1056dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        } else {
1063c24cfed8d5116ff21986acb60a918cb079a0efdKenny Root            if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
1076dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                if (info.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL ||
1086dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        info.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
1096dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    canBe = true;
1106dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                } else if (info.installLocation
1116dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) {
1126dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    if (mInstallLocation == PackageHelper.APP_INSTALL_EXTERNAL) {
1136dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        // For apps with no preference and the default value set
1146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        // to install on sdcard.
1156dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        canBe = true;
1166dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    }
1176dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                }
1186dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            }
1196dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        }
1206dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        return canBe;
1216dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
1226dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn}
1236dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
124a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborninterface AppClickListener {
125a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    void onItemClick(ManageApplications.TabInfo tab, AdapterView<?> parent,
126a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            View view, int position, long id);
127a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn}
128a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to pick an application that will be used to display installation information and
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * options to uninstall/delete user data for system applications. This activity
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * intent.
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
135f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class ManageApplications extends Fragment implements
136a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        AppClickListener, DialogInterface.OnClickListener,
13714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        DialogInterface.OnDismissListener {
13802c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
139e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final String TAG = "ManageApplications";
140e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final boolean DEBUG = false;
14102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
14202c22131e93e1a506141b1890c7134909ded876fAmith Yamasani    private static final String EXTRA_SORT_ORDER = "sortOrder";
14302c22131e93e1a506141b1890c7134909ded876fAmith Yamasani    private static final String EXTRA_SHOW_BACKGROUND = "showBackground";
1447a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    private static final String EXTRA_DEFAULT_LIST_TYPE = "defaultListType";
14514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    private static final String EXTRA_RESET_DIALOG = "resetDialog";
14602c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // attributes used as keys when passing values to InstalledAppDetails activity
14838b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu    public static final String APP_CHG = "chg";
14902c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // constant value that can be used to check return code from sub activity.
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int INSTALLED_APP_DETAILS = 1;
152d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn
153bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_TOTAL = 0;
154bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_INTERNAL = 1;
155bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_EXTERNAL = 2;
156bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order that can be changed through the menu can be sorted alphabetically
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // or size(descending)
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int MENU_OPTIONS_BASE = 0;
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Filter options used for displayed list of applications
1616cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0;
162728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1;
163728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2;
164747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu
1656cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4;
1666cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5;
1671337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6;
1681337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7;
16914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 8;
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private int mSortOrder = SORT_ORDER_ALPHA;
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
173e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    private ApplicationsState mApplicationsState;
174309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
175309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public static class TabInfo implements OnItemClickListener {
176309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final ManageApplications mOwner;
177309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final ApplicationsState mApplicationsState;
178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mLabel;
179309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final int mListType;
180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final int mFilter;
181a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public final AppClickListener mClickListener;
182309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mInvalidSizeStr;
183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mComputingSizeStr;
184309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final Bundle mSavedInstanceState;
185309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public ApplicationsAdapter mApplications;
187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public LayoutInflater mInflater;
188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public View mRootView;
189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
190a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        private IMediaContainerService mContainerService;
191a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
192309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private View mLoadingContainer;
193309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
194309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private View mListContainer;
195309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // ListView used to display list
197309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private ListView mListView;
198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // Custom view used to display running processes
199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private RunningProcessesView mRunningProcessesView;
200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
201309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private LinearColorBar mColorBar;
202309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private TextView mStorageChartLabel;
203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private TextView mUsedStorageText;
204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private TextView mFreeStorageText;
205a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        private long mFreeStorage = 0, mAppStorage = 0, mTotalStorage = 0;
206309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage;
207309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
208309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        final Runnable mRunningProcessesAvail = new Runnable() {
209309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            public void run() {
210309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                handleRunningProcessesAvail();
211309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
212309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        };
213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
214309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public TabInfo(ManageApplications owner, ApplicationsState apps,
215a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                CharSequence label, int listType, AppClickListener clickListener,
216309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                Bundle savedInstanceState) {
217309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mOwner = owner;
218309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mApplicationsState = apps;
219309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLabel = label;
220309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mListType = listType;
221309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            switch (listType) {
222309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                case LIST_TYPE_DOWNLOADED: mFilter = FILTER_APPS_THIRD_PARTY; break;
223309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                case LIST_TYPE_SDCARD: mFilter = FILTER_APPS_SDCARD; break;
224309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                default: mFilter = FILTER_APPS_ALL; break;
225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mClickListener = clickListener;
227309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mInvalidSizeStr = owner.getActivity().getText(R.string.invalid_size_value);
228309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mComputingSizeStr = owner.getActivity().getText(R.string.computing_size);
229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mSavedInstanceState = savedInstanceState;
230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
232a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public void setContainerService(IMediaContainerService containerService) {
233a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mContainerService = containerService;
234a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            updateStorageUsage();
235a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
236a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
237309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public View build(LayoutInflater inflater, ViewGroup contentParent, View contentChild) {
238309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRootView != null) {
239309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                return mRootView;
240309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
241309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
242309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mInflater = inflater;
243309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRootView = inflater.inflate(mListType == LIST_TYPE_RUNNING
244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    ? R.layout.manage_applications_running
245309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    : R.layout.manage_applications_apps, null);
246309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer = mRootView.findViewById(R.id.loading_container);
247309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.setVisibility(View.VISIBLE);
248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mListContainer = mRootView.findViewById(R.id.list_container);
249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mListContainer != null) {
250309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                // Create adapter and list view here
251309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty);
252309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                ListView lv = (ListView) mListContainer.findViewById(android.R.id.list);
253309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (emptyView != null) {
254309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    lv.setEmptyView(emptyView);
255309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
256309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setOnItemClickListener(this);
257309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setSaveEnabled(true);
258309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setItemsCanFocus(true);
259309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setTextFilterEnabled(true);
260309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView = lv;
261309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications = new ApplicationsAdapter(mApplicationsState, this, mFilter);
262309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView.setAdapter(mApplications);
263309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView.setRecyclerListener(mApplications);
264309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar);
265309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel);
266309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText);
267309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText);
268309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false);
269a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (mFilter == FILTER_APPS_SDCARD) {
270a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mStorageChartLabel.setText(mOwner.getActivity().getText(
271a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            R.string.sd_card_storage));
272a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                } else {
273a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mStorageChartLabel.setText(mOwner.getActivity().getText(
274a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            R.string.internal_storage));
275a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                }
276a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                applyCurrentStorage();
277309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
278309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView = (RunningProcessesView)mRootView.findViewById(
279309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    R.id.running_processes);
280309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
281309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mRunningProcessesView.doCreate(mSavedInstanceState);
282309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
283309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
284309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mRootView;
285309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
286309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
287a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public void detachView() {
288a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mRootView != null) {
289a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                ViewGroup group = (ViewGroup)mRootView.getParent();
290a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (group != null) {
291a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    group.removeView(mRootView);
292a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                }
293a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            }
294a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
295a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
296309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void resume(int sortOrder) {
297309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications != null) {
298309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications.resume(sortOrder);
299309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
300309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
301309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                boolean haveData = mRunningProcessesView.doResume(mOwner, mRunningProcessesAvail);
302309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (haveData) {
303309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mRunningProcessesView.setVisibility(View.VISIBLE);
304309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLoadingContainer.setVisibility(View.INVISIBLE);
305309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                } else {
306309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLoadingContainer.setVisibility(View.VISIBLE);
307309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
308309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
309309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
310309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
311309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void pause() {
312309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications != null) {
313309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications.pause();
314309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
315309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
316309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mRunningProcessesView.doPause();
317309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
318309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
319309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
320309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        void updateStorageUsage() {
321309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            // Make sure a callback didn't come at an inopportune time.
322309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mOwner.getActivity() == null) return;
323309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            // Doesn't make sense for stuff that is not an app list.
324309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications == null) return;
325309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
326a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mFreeStorage = 0;
327a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mAppStorage = 0;
328a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTotalStorage = 0;
329309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
330309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mFilter == FILTER_APPS_SDCARD) {
331309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mContainerService != null) {
332309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    try {
333309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        final long[] stats = mContainerService.getFileSystemStats(
334309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                Environment.getExternalStorageDirectory().getPath());
335a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mTotalStorage = stats[0];
336a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mFreeStorage = stats[1];
337309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    } catch (RemoteException e) {
338309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        Log.w(TAG, "Problem in container service", e);
339309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
340309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
341309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
342309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mApplications != null) {
343309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    final int N = mApplications.getCount();
344309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    for (int i=0; i<N; i++) {
345309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
3461f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                        mAppStorage += ae.externalCodeSize + ae.externalDataSize
3471f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                                + ae.externalCacheSize;
348309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
349309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
350309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            } else {
351309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mContainerService != null) {
352309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    try {
353309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        final long[] stats = mContainerService.getFileSystemStats(
354309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                Environment.getDataDirectory().getPath());
355a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mTotalStorage = stats[0];
356a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mFreeStorage = stats[1];
357309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    } catch (RemoteException e) {
358309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        Log.w(TAG, "Problem in container service", e);
359309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
360309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
361309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
362309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                final boolean emulatedStorage = Environment.isExternalStorageEmulated();
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);
367a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mAppStorage += ae.codeSize + ae.dataSize;
368309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        if (emulatedStorage) {
369a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            mAppStorage += ae.externalCodeSize + ae.externalDataSize;
370309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        }
371309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
372309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
373a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mFreeStorage += mApplicationsState.sumCacheSizes();
374309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
375a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
376a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            applyCurrentStorage();
377a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
378a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
379a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        void applyCurrentStorage() {
380a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            // If view hierarchy is not yet created, no views to update.
381a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mRootView == null) {
382a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                return;
383309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
384a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mTotalStorage > 0) {
385a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mColorBar.setRatios((mTotalStorage-mFreeStorage-mAppStorage)/(float)mTotalStorage,
386a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mAppStorage/(float)mTotalStorage, mFreeStorage/(float)mTotalStorage);
387a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                long usedStorage = mTotalStorage - mFreeStorage;
388309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastUsedStorage != usedStorage) {
389309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastUsedStorage = usedStorage;
390309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    String sizeStr = Formatter.formatShortFileSize(
391309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            mOwner.getActivity(), usedStorage);
392309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mUsedStorageText.setText(mOwner.getActivity().getResources().getString(
393309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            R.string.service_foreground_processes, sizeStr));
394309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
395a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (mLastFreeStorage != mFreeStorage) {
396a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mLastFreeStorage = mFreeStorage;
397309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    String sizeStr = Formatter.formatShortFileSize(
398a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            mOwner.getActivity(), mFreeStorage);
399309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mFreeStorageText.setText(mOwner.getActivity().getResources().getString(
400309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            R.string.service_background_processes, sizeStr));
401309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
402309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            } else {
403309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mColorBar.setRatios(0, 0, 0);
404309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastUsedStorage != -1) {
405309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastUsedStorage = -1;
406309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mUsedStorageText.setText("");
407309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
408309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastFreeStorage != -1) {
409309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastFreeStorage = -1;
410309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mFreeStorageText.setText("");
411309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
412309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
413309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
414309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
415309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
416309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
417a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mClickListener.onItemClick(this, parent, view, position, id);
418309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
419309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
420309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        void handleRunningProcessesAvail() {
421309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
422309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mOwner.getActivity(), android.R.anim.fade_out));
423309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation(
424309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mOwner.getActivity(), android.R.anim.fade_in));
425309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView.setVisibility(View.VISIBLE);
426309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.setVisibility(View.GONE);
427309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
428309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
429309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
430309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    TabInfo mCurTab = null;
431309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Size resource used for packages whose size computation failed for some reason
4339244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    CharSequence mInvalidSizeStr;
434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingSizeStr;
435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // layout inflater object used to inflate views
437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LayoutInflater mInflater;
438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
439de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private String mCurrentPkgName;
440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
441ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    private Menu mOptionsMenu;
4427a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
4437a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    // These are for keeping track of activity and spinner switch state.
444728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    private boolean mActivityResumed;
445728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
4467a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_DOWNLOADED = 0;
4477a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_RUNNING = 1;
4487a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_SDCARD = 2;
4497a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_ALL = 3;
450f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
4510385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn    private boolean mShowBackground = false;
4520385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn
4537a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    private int mDefaultListType = -1;
454f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
455309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ViewGroup mContentContainer;
456309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private View mRootView;
457309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ViewPager mViewPager;
458f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
45914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    AlertDialog mResetDialog;
46014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
461309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    class MyPagerAdapter extends PagerAdapter
462309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            implements ViewPager.OnPageChangeListener {
463309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        int mCurPos = 0;
464309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
465309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
466309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public int getCount() {
467309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mTabs.size();
468309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
469309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
470309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
471309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public Object instantiateItem(ViewGroup container, int position) {
472309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = mTabs.get(position);
473309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            View root = tab.build(mInflater, mContentContainer, mRootView);
474309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            container.addView(root);
475309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return root;
476309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
477309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
478309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
479309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void destroyItem(ViewGroup container, int position, Object object) {
480309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            container.removeView((View)object);
481ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn        }
482ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn
483309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
484309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public boolean isViewFromObject(View view, Object object) {
485309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return view == object;
486309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
4877a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
488309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
489309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public CharSequence getPageTitle(int position) {
490309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mTabs.get(position).mLabel;
491309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
492309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
493309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
494309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
495309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
496309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
497309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
498309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageSelected(int position) {
499309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurPos = position;
500309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
501309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
502309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
503309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageScrollStateChanged(int state) {
504309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (state == ViewPager.SCROLL_STATE_IDLE) {
505309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                updateCurrentTab(mCurPos);
506309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
5077a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        }
5087a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    }
5097a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
510e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project    /*
511e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * Custom adapter implementation for the ListView
512e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * This adapter maintains a map for each displayed application and its properties
513e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * An index value on each AppInfo object indicates the correct position or index
514e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * in the list. If the list gets updated dynamically when the user is viewing the list of
515e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * applications, we need to return the correct index of position. This is done by mapping
516e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * the getId methods via the package name into the internal maps and indices.
517e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * The order of applications in the list is mirrored in mAppLocalList
518e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project     */
519309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    static class ApplicationsAdapter extends BaseAdapter implements Filterable,
520e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.Callbacks, AbsListView.RecyclerListener {
521e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ApplicationsState mState;
522309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final ApplicationsState.Session mSession;
523309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final TabInfo mTab;
524309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final Context mContext;
525e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ArrayList<View> mActive = new ArrayList<View>();
526309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final int mFilterMode;
527e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mBaseEntries;
528e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mEntries;
529e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private boolean mResumed;
530309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private int mLastSortMode=-1;
53119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        private boolean mWaitingForData;
532bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        private int mWhichSize = SIZE_TOTAL;
533e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        CharSequence mCurFilterPrefix;
534e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
535e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private Filter mFilter = new Filter() {
536e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
537e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected FilterResults performFiltering(CharSequence constraint) {
538e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> entries
539e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = applyPrefixFilter(constraint, mBaseEntries);
540e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                FilterResults fr = new FilterResults();
541e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.values = entries;
542e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.count = entries.size();
543e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return fr;
544e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            }
545355b32faa924a0b39067dd759ba03e5af97065caSuchi Amalapurapu
546e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
547e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected void publishResults(CharSequence constraint, FilterResults results) {
548e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mCurFilterPrefix = constraint;
549e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values;
550e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                notifyDataSetChanged();
551309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.updateStorageUsage();
552afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
553e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        };
554c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
555309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public ApplicationsAdapter(ApplicationsState state, TabInfo tab, int filterMode) {
556e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mState = state;
557309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mSession = state.newSession(this);
558309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab = tab;
559309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mContext = tab.mOwner.getActivity();
560309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mFilterMode = filterMode;
561c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
562e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
563309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void resume(int sort) {
564e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Resume!  mResumed=" + mResumed);
565e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (!mResumed) {
566e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = true;
567309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mSession.resume();
568e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mLastSortMode = sort;
56919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                rebuild(true);
570e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            } else {
571309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                rebuild(sort);
572c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
573e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project        }
574c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
575e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void pause() {
576e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mResumed) {
577e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = false;
578309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mSession.pause();
579e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
580afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
581b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
582309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void rebuild(int sort) {
583309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (sort == mLastSortMode) {
584e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return;
585e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
586e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mLastSortMode = sort;
58719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            rebuild(true);
588afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
589afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
59019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        public void rebuild(boolean eraseold) {
591e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Rebuilding app list...");
592e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppFilter filterObj;
593e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            Comparator<AppEntry> comparatorObj;
594bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            boolean emulated = Environment.isExternalStorageEmulated();
595bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            if (emulated) {
596bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mWhichSize = SIZE_TOTAL;
597bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            } else {
598bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mWhichSize = SIZE_INTERNAL;
599bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            }
600309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            switch (mFilterMode) {
601e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_THIRD_PARTY:
602e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.THIRD_PARTY_FILTER;
603e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
604e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_SDCARD:
605e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.ON_SD_CARD_FILTER;
606bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                    if (!emulated) {
607bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                        mWhichSize = SIZE_EXTERNAL;
608bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                    }
609e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
610e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
611e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = null;
612e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
613e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
614e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            switch (mLastSortMode) {
615e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case SORT_ORDER_SIZE:
616430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                    switch (mWhichSize) {
617430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        case SIZE_INTERNAL:
618430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR;
619430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
620430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        case SIZE_EXTERNAL:
621430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.EXTERNAL_SIZE_COMPARATOR;
622430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
623430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        default:
624430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.SIZE_COMPARATOR;
625430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
626430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                    }
627e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
628e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
629e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    comparatorObj = ApplicationsState.ALPHA_COMPARATOR;
630e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
631e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
63219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            ArrayList<ApplicationsState.AppEntry> entries
633309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    = mSession.rebuild(filterObj, comparatorObj);
63419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (entries == null && !eraseold) {
63519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                // Don't have new list yet, but can continue using the old one.
63619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                return;
63719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
63819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mBaseEntries = entries;
63919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (mBaseEntries != null) {
64019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
64119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            } else {
64219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mEntries = null;
64319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
644e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            notifyDataSetChanged();
645309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.updateStorageUsage();
64619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
64719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (entries == null) {
64819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mWaitingForData = true;
649309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.setVisibility(View.INVISIBLE);
650309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.setVisibility(View.VISIBLE);
65119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            } else {
652309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.setVisibility(View.VISIBLE);
653309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.setVisibility(View.GONE);
65419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
655afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
656afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
657e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix,
658e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> origEntries) {
659e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (prefix == null || prefix.length() == 0) {
660e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return origEntries;
661afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
662e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                String prefixStr = ApplicationsState.normalize(prefix.toString());
663e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                final String spacePrefixStr = " " + prefixStr;
664e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> newEntries
665e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = new ArrayList<ApplicationsState.AppEntry>();
666e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                for (int i=0; i<origEntries.size(); i++) {
667e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    ApplicationsState.AppEntry entry = origEntries.get(i);
668e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    String nlabel = entry.getNormalizedLabel();
669e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) {
670e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        newEntries.add(entry);
671ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                    }
672ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                }
673e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return newEntries;
674afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
675afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
676ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu
677e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
678e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onRunningStateChanged(boolean running) {
679309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mOwner.getActivity().setProgressBarIndeterminateVisibility(running);
680afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
681b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
682e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
68319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        public void onRebuildComplete(ArrayList<AppEntry> apps) {
684309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mTab.mLoadingContainer.getVisibility() == View.VISIBLE) {
685309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
686309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        mContext, android.R.anim.fade_out));
687309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.startAnimation(AnimationUtils.loadAnimation(
688309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        mContext, android.R.anim.fade_in));
6894e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn            }
690309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mListContainer.setVisibility(View.VISIBLE);
691309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mLoadingContainer.setVisibility(View.GONE);
69219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mWaitingForData = false;
69319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mBaseEntries = apps;
69419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
69519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            notifyDataSetChanged();
696309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.updateStorageUsage();
69719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        }
69819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
69919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        @Override
700e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageListChanged() {
70119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            rebuild(false);
702afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
703b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
704e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
705e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageIconChanged() {
706e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // We ensure icons are loaded when their item is displayed, so
707e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // don't care about icons loaded in the background.
708afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
709b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
710e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
711e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageSizeChanged(String packageName) {
712e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            for (int i=0; i<mActive.size(); i++) {
713e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag();
714e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (holder.entry.info.packageName.equals(packageName)) {
715e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    synchronized (holder.entry) {
716309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
717c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
718309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    if (holder.entry.info.packageName.equals(mTab.mOwner.mCurrentPkgName)
719e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                            && mLastSortMode == SORT_ORDER_SIZE) {
720e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // We got the size information for the last app the
721e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // user viewed, and are sorting by size...  they may
722e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // have cleared data, so we immediately want to resort
723e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // the list with the new size to reflect it to the user.
72419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                        rebuild(false);
725c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
726309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mTab.updateStorageUsage();
727e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    return;
728c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                }
729c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
730c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
731c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
732e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
733e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onAllSizesComputed() {
734e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mLastSortMode == SORT_ORDER_SIZE) {
73519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                rebuild(false);
736afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
737a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTab.updateStorageUsage();
738afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
739afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
740afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int getCount() {
741e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries != null ? mEntries.size() : 0;
742afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
743afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
744afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public Object getItem(int position) {
745e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
746afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
747afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
748e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public ApplicationsState.AppEntry getAppEntry(int position) {
749e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
750afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
751afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
752afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public long getItemId(int position) {
753e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position).id;
754afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
755afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
756afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
757347c9a0544328e65120582834ce330fb0d473f28Jeff Brown            // A ViewHolder keeps references to children views to avoid unnecessary calls
758afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to findViewById() on each row.
759309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            AppViewHolder holder = AppViewHolder.createOrRecycle(mTab.mInflater, convertView);
7609244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            convertView = holder.rootView;
761afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
762afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Bind the data efficiently with the holder
763e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppEntry entry = mEntries.get(position);
764e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            synchronized (entry) {
765e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                holder.entry = entry;
766e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.label != null) {
767e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appName.setText(entry.label);
768309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    holder.appName.setTextColor(mContext.getResources().getColorStateList(
769e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                            entry.info.enabled ? android.R.color.primary_text_dark
7709db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                                    : android.R.color.secondary_text_dark));
771afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
772e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mState.ensureIcon(entry);
773e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.icon != null) {
774e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appIcon.setImageDrawable(entry.icon);
775afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
776309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
77744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                if (InstalledAppDetails.SUPPORT_DISABLE_APPS) {
77844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    holder.disabled.setVisibility(entry.info.enabled ? View.GONE : View.VISIBLE);
77944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                } else {
78044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    holder.disabled.setVisibility(View.GONE);
78144178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                }
782309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mFilterMode == FILTER_APPS_SDCARD) {
7836dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setVisibility(View.VISIBLE);
7846dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setChecked((entry.info.flags
7856dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                            & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
7866dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                } else {
7876dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setVisibility(View.GONE);
7886dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                }
789afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
790e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(convertView);
791e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.add(convertView);
792afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return convertView;
793afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
794c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
795e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
796c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        public Filter getFilter() {
797e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mFilter;
798c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
799c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
800e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
801e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onMovedToScrapHeap(View view) {
802e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(view);
803728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
804728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
805728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
806afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
807f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle savedInstanceState) {
808afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
809f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
810f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        setHasOptionsMenu(true);
811f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
812f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
813f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        Intent intent = getActivity().getIntent();
814ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        String action = intent.getAction();
8157a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        int defaultListType = LIST_TYPE_DOWNLOADED;
816ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        String className = getArguments() != null
817ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                ? getArguments().getString("classname") : null;
818ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (className == null) {
819ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            className = intent.getComponent().getClassName();
820ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
821af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani        if (className.equals(RunningServicesActivity.class.getName())
822af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || className.endsWith(".RunningServices")) {
8237a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_RUNNING;
8245203bdffe6ce2b829d0fab8c7691fa92aca6e972Amith Yamasani        } else if (className.equals(StorageUseActivity.class.getName())
825af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || Intent.ACTION_MANAGE_PACKAGE_STORAGE.equals(action)
826af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || className.endsWith(".StorageUse")) {
827afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSortOrder = SORT_ORDER_SIZE;
8287a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_ALL;
829762eaa77e3e12d5337ddc9cb87b473c47af5524aKenny Root        } else if (Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)) {
8307a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            // Select the all-apps list, with the default sorting
8317a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_ALL;
832afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
8337a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
834728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (savedInstanceState != null) {
83502c22131e93e1a506141b1890c7134909ded876fAmith Yamasani            mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder);
8367a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            int tmp = savedInstanceState.getInt(EXTRA_DEFAULT_LIST_TYPE, -1);
8377a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            if (tmp != -1) defaultListType = tmp;
83802c22131e93e1a506141b1890c7134909ded876fAmith Yamasani            mShowBackground = savedInstanceState.getBoolean(EXTRA_SHOW_BACKGROUND, false);
839728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
8407a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
8417a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        mDefaultListType = defaultListType;
8423b7dbcecf70788df4950340cbf750dbe524dca96Amith Yamasani
84344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        final Intent containerIntent = new Intent().setComponent(
84444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey                StorageMeasurement.DEFAULT_CONTAINER_COMPONENT);
84544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE);
8461337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
847f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
848f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingSizeStr = getActivity().getText(R.string.computing_size);
849f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
850a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        TabInfo tab = new TabInfo(this, mApplicationsState,
851309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_third_party),
852309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_DOWNLOADED, this, savedInstanceState);
853309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
854f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
855309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (!Environment.isExternalStorageEmulated()) {
856a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            tab = new TabInfo(this, mApplicationsState,
857309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    getActivity().getString(R.string.filter_apps_onsdcard),
858309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    LIST_TYPE_SDCARD, this, savedInstanceState);
859309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTabs.add(tab);
860508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
8617a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
862a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        tab = new TabInfo(this, mApplicationsState,
863309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_running),
864309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_RUNNING, this, savedInstanceState);
865309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
8667a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
867a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        tab = new TabInfo(this, mApplicationsState,
868309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_all),
869309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_ALL, this, savedInstanceState);
870309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
871309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
8727a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
8737a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
874309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    @Override
875309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
876309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // initialize the inflater
877309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mInflater = inflater;
8787a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
879309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        View rootView = mInflater.inflate(R.layout.manage_applications_content,
880309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                container, false);
881309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mContentContainer = container;
882309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mRootView = rootView;
8837a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
884309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
885309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        MyPagerAdapter adapter = new MyPagerAdapter();
886309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager.setAdapter(adapter);
887309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager.setOnPageChangeListener(adapter);
888309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs);
889309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        tabs.setTabIndicatorColorResource(android.R.color.holo_blue_light);
8907a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
891a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // We have to do this now because PreferenceFrameLayout looks at it
892a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // only when the view is added.
893a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        if (container instanceof PreferenceFrameLayout) {
894a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true;
895a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
896a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
89714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
89814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            buildResetDialog();
89914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
90014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
90113ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn        if (savedInstanceState == null) {
90213ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            // First time init: make sure view pager is showing the correct tab.
90313ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            for (int i = 0; i < mTabs.size(); i++) {
90413ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                TabInfo tab = mTabs.get(i);
90513ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                if (tab.mListType == mDefaultListType) {
90613ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                    mViewPager.setCurrentItem(i);
90713ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                    break;
90813ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                }
90913ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            }
91013ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn        }
91113ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn
912309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        return rootView;
913afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
914f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
915f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    @Override
916728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public void onStart() {
917728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onStart();
918b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu    }
919b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
920afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
921f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onResume() {
922728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onResume();
923728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = true;
924309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        updateCurrentTab(mViewPager.getCurrentItem());
925ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
926afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
927b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
928728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
929f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onSaveInstanceState(Bundle outState) {
930728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onSaveInstanceState(outState);
93102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani        outState.putInt(EXTRA_SORT_ORDER, mSortOrder);
9327a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        if (mDefaultListType != -1) {
9337a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            outState.putInt(EXTRA_DEFAULT_LIST_TYPE, mDefaultListType);
934f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
93502c22131e93e1a506141b1890c7134909ded876fAmith Yamasani        outState.putBoolean(EXTRA_SHOW_BACKGROUND, mShowBackground);
93614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog != null) {
93714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            outState.putBoolean(EXTRA_RESET_DIALOG, true);
93814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
939728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
940728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
941728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
942f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onPause() {
943728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onPause();
944728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = false;
945309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
946309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTabs.get(i).pause();
947728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
948728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
949728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
950728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
95114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onStop() {
95214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        super.onStop();
95314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog != null) {
95414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog.dismiss();
95514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = null;
95614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
95714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
95814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
95914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
960a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    public void onDestroyView() {
961a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        super.onDestroyView();
962a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
963a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // We are going to keep the tab data structures around, but they
964a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // are no longer attached to their view hierarchy.
965a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
966a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTabs.get(i).detachView();
967a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
968a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    }
969a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
970a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    @Override
971f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onActivityResult(int requestCode, int resultCode, Intent data) {
972728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
973e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mApplicationsState.requestSize(mCurrentPkgName);
974ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        }
975afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
9767a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
977309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    TabInfo tabForType(int type) {
978309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i = 0; i < mTabs.size(); i++) {
979309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = mTabs.get(i);
980309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (tab.mListType == type) {
981309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                return tab;
982309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
9837a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        }
984309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        return null;
9857a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    }
9867a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
987afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // utility method used to start sub activity
988afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void startApplicationDetailsActivity() {
989f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        // start new fragment to display extended information
990f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        Bundle args = new Bundle();
991f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mCurrentPkgName);
992f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
993f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        PreferenceActivity pa = (PreferenceActivity)getActivity();
994ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        pa.startPreferencePanel(InstalledAppDetails.class.getName(), args,
995ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                R.string.application_info_label, null, this, INSTALLED_APP_DETAILS);
996afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
997afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
998afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
999f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
1000ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        Log.i(TAG, "onCreateOptionsMenu in " + this + ": " + menu);
1001ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mOptionsMenu = menu;
10020385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn        // note: icons removed for now because the cause the new action
10030385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn        // bar UI to be very confusing.
1004afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
10050385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn                //.setIcon(android.R.drawable.ic_menu_sort_alphabetically)
1006348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1007afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
10080385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn                //.setIcon(android.R.drawable.ic_menu_sort_by_size)
1009348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1010ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services)
1011ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
1012ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes)
1013ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
101414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        menu.add(0, RESET_APP_PREFERENCES, 4, R.string.reset_app_preferences)
101514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1016ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1017afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1018afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1019afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1020f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onPrepareOptionsMenu(Menu menu) {
1021ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1022ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
1023ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
1024ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    @Override
1025ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onDestroyOptionsMenu() {
1026ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mOptionsMenu = null;
1027ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
102844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
102944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    @Override
103044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    public void onDestroy() {
103144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        getActivity().unbindService(mContainerConnection);
103244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        super.onDestroy();
103344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    }
103444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
1035ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    void updateOptionsMenu() {
1036ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (mOptionsMenu == null) {
1037ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return;
1038ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
1039ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
1040673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root        /*
1041673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         * The running processes screen doesn't use the mApplicationsAdapter
1042673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         * so bringing up this menu in that case doesn't make any sense.
1043673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         */
1044309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (mCurTab != null && mCurTab.mListType == LIST_TYPE_RUNNING) {
1045309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = tabForType(LIST_TYPE_RUNNING);
1046309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            boolean showingBackground = tab != null && tab.mRunningProcessesView != null
1047309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    ? tab.mRunningProcessesView.mAdapter.getShowBackground() : false;
1048ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false);
1049ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false);
1050ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground);
1051ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground);
105214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false);
10531337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else {
1054ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
1055ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
1056ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false);
1057ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false);
105814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(true);
105914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
106014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
106114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
106214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    void buildResetDialog() {
106314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == null) {
106414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
106514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setTitle(R.string.reset_app_preferences_title);
106614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setMessage(R.string.reset_app_preferences_desc);
106714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setPositiveButton(R.string.reset_app_preferences_button, this);
106814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setNegativeButton(R.string.cancel, null);
106914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = builder.show();
107014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog.setOnDismissListener(this);
107114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
107214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
107314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
107414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
107514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onDismiss(DialogInterface dialog) {
107614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == dialog) {
107714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = null;
107814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
107914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
108014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
108114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
108214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
108314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onClick(DialogInterface dialog, int which) {
108414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == dialog) {
108514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final PackageManager pm = getActivity().getPackageManager();
108614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final INotificationManager nm = INotificationManager.Stub.asInterface(
108714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    ServiceManager.getService(Context.NOTIFICATION_SERVICE));
108814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final NetworkPolicyManager npm = NetworkPolicyManager.from(getActivity());
108914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final Handler handler = new Handler(getActivity().getMainLooper());
109014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            (new AsyncTask<Void, Void, Void>() {
109114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                @Override protected Void doInBackground(Void... params) {
109214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    List<ApplicationInfo> apps = pm.getInstalledApplications(
109314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            PackageManager.GET_DISABLED_COMPONENTS);
109414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    for (int i=0; i<apps.size(); i++) {
109514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        ApplicationInfo app = apps.get(i);
109614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        try {
109714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName);
109814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            nm.setNotificationsEnabledForPackage(app.packageName, true);
109914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        } catch (android.os.RemoteException ex) {
110014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
110114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        if (DEBUG) Log.v(TAG, "Clearing preferred: " + app.packageName);
110214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        pm.clearPackagePreferredActivities(app.packageName);
110314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        if (!app.enabled) {
110414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName);
110514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (pm.getApplicationEnabledSetting(app.packageName)
110614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                    == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
110714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                pm.setApplicationEnabledSetting(app.packageName,
110814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                        PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
110914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                        PackageManager.DONT_KILL_APP);
111014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            }
111114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
111214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
111314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    // We should have cleared all of the preferred apps above;
111414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    // just in case some may be lingering, retrieve whatever is
111514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    // still set and remove it.
111614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    ArrayList<IntentFilter> filters = new ArrayList<IntentFilter>();
111714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    ArrayList<ComponentName> prefActivities = new ArrayList<ComponentName>();
111814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    pm.getPreferredActivities(filters, prefActivities, null);
111914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    for (int i=0; i<prefActivities.size(); i++) {
112014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        if (DEBUG) Log.v(TAG, "Clearing preferred: "
112114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                + prefActivities.get(i).getPackageName());
112214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        pm.clearPackagePreferredActivities(prefActivities.get(i).getPackageName());
112314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
112438305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    final int[] restrictedUids = npm.getUidsWithPolicy(
112514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            POLICY_REJECT_METERED_BACKGROUND);
112638305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    final int currentUserId = ActivityManager.getCurrentUser();
112738305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    for (int uid : restrictedUids) {
112838305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        // Only reset for current user
112938305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        if (UserHandle.getUserId(uid) == currentUserId) {
113038305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                            if (DEBUG) Log.v(TAG, "Clearing data policy: " + uid);
113138305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                            npm.setUidPolicy(uid, POLICY_NONE);
113238305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        }
113314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
113414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    handler.post(new Runnable() {
113514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        @Override public void run() {
113614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Done clearing");
113714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (getActivity() != null && mActivityResumed) {
113814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                if (DEBUG) Log.v(TAG, "Updating UI!");
1139309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                for (int i=0; i<mTabs.size(); i++) {
1140309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    TabInfo tab = mTabs.get(i);
1141309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    if (tab.mApplications != null) {
1142309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                        tab.mApplications.pause();
1143309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    }
1144309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                }
1145309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                if (mCurTab != null) {
1146309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    mCurTab.resume(mSortOrder);
1147309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                }
114814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            }
114914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
115014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    });
115114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    return null;
115214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                }
115314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            }).execute();
1154673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root        }
1155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
1159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int menuId = item.getItemId();
1160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) {
1161e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mSortOrder = menuId;
1162309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mApplications != null) {
1163309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mApplications.rebuild(mSortOrder);
11641337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            }
11651337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else if (menuId == SHOW_RUNNING_SERVICES) {
11660385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn            mShowBackground = false;
1167309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
1168309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(false);
1169309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
11701337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else if (menuId == SHOW_BACKGROUND_PROCESSES) {
11710385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn            mShowBackground = true;
1172309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
1173309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(true);
1174309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
117514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        } else if (menuId == RESET_APP_PREFERENCES) {
117614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            buildResetDialog();
1177f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani        } else {
1178f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani            // Handle the home button
1179f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani            return false;
1180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1181ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return true;
1183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1184d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn
1185a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    public void onItemClick(TabInfo tab, AdapterView<?> parent, View view, int position,
1186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long id) {
1187a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        if (tab.mApplications != null && tab.mApplications.getCount() > position) {
1188a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            ApplicationsState.AppEntry entry = tab.mApplications.getAppEntry(position);
1189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurrentPkgName = entry.info.packageName;
1190309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            startApplicationDetailsActivity();
11911337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
1192309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
11931337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
1194309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public void updateCurrentTab(int position) {
1195309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        TabInfo tab = mTabs.get(position);
1196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mCurTab = tab;
119744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
1198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // Put things in the correct paused/resumed state.
1199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (mActivityResumed) {
1200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.build(mInflater, mContentContainer, mRootView);
1201309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.resume(mSortOrder);
12021337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else {
1203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.pause();
12041337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
1205309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
1206309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo t = mTabs.get(i);
1207309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (t != mCurTab) {
1208309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                t.pause();
12091337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            }
12101337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
12111337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
1212309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mCurTab.updateStorageUsage();
1213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        updateOptionsMenu();
1214a31be80ef056add00e0d239414f80f932978277fAdam Powell        final Activity host = getActivity();
1215a31be80ef056add00e0d239414f80f932978277fAdam Powell        if (host != null) {
1216a31be80ef056add00e0d239414f80f932978277fAdam Powell            host.invalidateOptionsMenu();
1217a31be80ef056add00e0d239414f80f932978277fAdam Powell        }
1218e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    }
1219e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
122044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    private volatile IMediaContainerService mContainerService;
122144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
122244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    private final ServiceConnection mContainerConnection = new ServiceConnection() {
122344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        @Override
122444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        public void onServiceConnected(ComponentName name, IBinder service) {
122544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey            mContainerService = IMediaContainerService.Stub.asInterface(service);
1226a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            for (int i=0; i<mTabs.size(); i++) {
1227a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mTabs.get(i).setContainerService(mContainerService);
1228309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
122944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        }
123044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
123144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        @Override
123244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        public void onServiceDisconnected(ComponentName name) {
123344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey            mContainerService = null;
123444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        }
123544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    };
1236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1237