ManageApplications.java revision 37f3c8f574b984e4980ebf598358726b3f852156
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License.
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport static android.net.NetworkPolicyManager.POLICY_NONE;
2014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
2138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu
22a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.app.Activity;
2338305fb1777147cbcb86774c466e88434daff141Jeff Sharkeyimport android.app.ActivityManager;
2414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.AlertDialog;
25a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackbornimport android.app.AppOpsManager;
26f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment;
2714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.INotificationManager;
2844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ComponentName;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
3014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.DialogInterface;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
3214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.IntentFilter;
3344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ServiceConnection;
3419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport android.content.pm.ApplicationInfo;
356dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.IPackageManager;
366dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.PackageInfo;
3714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.pm.PackageManager;
3814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.net.NetworkPolicyManager;
3914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.AsyncTask;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
411337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.os.Environment;
4214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.Handler;
4344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.os.IBinder;
446dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.RemoteException;
456dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.ServiceManager;
4638305fb1777147cbcb86774c466e88434daff141Jeff Sharkeyimport android.os.UserHandle;
47f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.preference.PreferenceActivity;
48a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackbornimport android.preference.PreferenceFrameLayout;
49728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.provider.Settings;
50309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerAdapter;
51309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerTabStrip;
52309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.ViewPager;
5337f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglioimport android.text.BidiFormatter;
541337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.text.format.Formatter;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu;
58f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.MenuInflater;
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem;
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup;
62ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackbornimport android.view.animation.AnimationUtils;
63e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView;
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView;
65a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.widget.AdapterView.OnItemClickListener;
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter;
67c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filter;
68c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filterable;
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView;
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
71b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
7244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.internal.app.IMediaContainerService;
73b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.internal.content.PackageHelper;
74b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.R;
75b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.RunningServicesActivity;
76b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.StorageUseActivity;
77b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.applications.ApplicationsState.AppEntry;
7844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.settings.deviceinfo.StorageMeasurement;
79309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport com.android.settings.Utils;
80b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Comparator;
8314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport java.util.List;
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
856dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornfinal class CanBeOnSdCardChecker {
866dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    final IPackageManager mPm;
876dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    int mInstallLocation;
886dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    CanBeOnSdCardChecker() {
906dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mPm = IPackageManager.Stub.asInterface(
916dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                ServiceManager.getService("package"));
926dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
936dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
946dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    void init() {
956dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        try {
966dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            mInstallLocation = mPm.getInstallLocation();
976dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        } catch (RemoteException e) {
986dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            Log.e("CanBeOnSdCardChecker", "Is Package Manager running?");
996dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            return;
1006dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        }
1016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
1026dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
1036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    boolean check(ApplicationInfo info) {
1046dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        boolean canBe = false;
1056dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
1066dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            canBe = true;
1076dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        } else {
1083c24cfed8d5116ff21986acb60a918cb079a0efdKenny Root            if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
1096dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                if (info.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL ||
1106dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        info.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
1116dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    canBe = true;
1126dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                } else if (info.installLocation
1136dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) {
1146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    if (mInstallLocation == PackageHelper.APP_INSTALL_EXTERNAL) {
1156dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        // For apps with no preference and the default value set
1166dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        // to install on sdcard.
1176dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        canBe = true;
1186dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    }
1196dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                }
1206dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            }
1216dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        }
1226dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        return canBe;
1236dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
1246dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn}
1256dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
126a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborninterface AppClickListener {
127a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    void onItemClick(ManageApplications.TabInfo tab, AdapterView<?> parent,
128a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            View view, int position, long id);
129a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn}
130a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to pick an application that will be used to display installation information and
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * options to uninstall/delete user data for system applications. This activity
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * intent.
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
137f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class ManageApplications extends Fragment implements
138a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        AppClickListener, DialogInterface.OnClickListener,
13914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        DialogInterface.OnDismissListener {
14002c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
141e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final String TAG = "ManageApplications";
142e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final boolean DEBUG = false;
14302c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
14402c22131e93e1a506141b1890c7134909ded876fAmith Yamasani    private static final String EXTRA_SORT_ORDER = "sortOrder";
14502c22131e93e1a506141b1890c7134909ded876fAmith Yamasani    private static final String EXTRA_SHOW_BACKGROUND = "showBackground";
1467a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    private static final String EXTRA_DEFAULT_LIST_TYPE = "defaultListType";
14714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    private static final String EXTRA_RESET_DIALOG = "resetDialog";
14802c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // attributes used as keys when passing values to InstalledAppDetails activity
15038b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu    public static final String APP_CHG = "chg";
15102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // constant value that can be used to check return code from sub activity.
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int INSTALLED_APP_DETAILS = 1;
154d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn
155bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_TOTAL = 0;
156bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_INTERNAL = 1;
157bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_EXTERNAL = 2;
158bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order that can be changed through the menu can be sorted alphabetically
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // or size(descending)
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int MENU_OPTIONS_BASE = 0;
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Filter options used for displayed list of applications
1636cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0;
164728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1;
165728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2;
16618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    public static final int FILTER_APPS_DISABLED = MENU_OPTIONS_BASE + 3;
167747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu
1686cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4;
1696cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5;
1701337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6;
1711337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7;
17214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 8;
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private int mSortOrder = SORT_ORDER_ALPHA;
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
176e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    private ApplicationsState mApplicationsState;
177309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public static class TabInfo implements OnItemClickListener {
179309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final ManageApplications mOwner;
180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final ApplicationsState mApplicationsState;
181309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mLabel;
182309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final int mListType;
183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final int mFilter;
184a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public final AppClickListener mClickListener;
185309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mInvalidSizeStr;
186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mComputingSizeStr;
187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final Bundle mSavedInstanceState;
188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public ApplicationsAdapter mApplications;
190309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public LayoutInflater mInflater;
191309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public View mRootView;
192309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
193a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        private IMediaContainerService mContainerService;
194a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
195309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private View mLoadingContainer;
196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
197309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private View mListContainer;
198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // ListView used to display list
200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private ListView mListView;
201309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // Custom view used to display running processes
202309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private RunningProcessesView mRunningProcessesView;
203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private LinearColorBar mColorBar;
205309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private TextView mStorageChartLabel;
206309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private TextView mUsedStorageText;
207309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private TextView mFreeStorageText;
208a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        private long mFreeStorage = 0, mAppStorage = 0, mTotalStorage = 0;
209309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage;
210309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
211309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        final Runnable mRunningProcessesAvail = new Runnable() {
212309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            public void run() {
213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                handleRunningProcessesAvail();
214309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
215309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        };
216309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
217309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public TabInfo(ManageApplications owner, ApplicationsState apps,
218a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                CharSequence label, int listType, AppClickListener clickListener,
219309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                Bundle savedInstanceState) {
220309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mOwner = owner;
221309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mApplicationsState = apps;
222309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLabel = label;
223309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mListType = listType;
224309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            switch (listType) {
225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                case LIST_TYPE_DOWNLOADED: mFilter = FILTER_APPS_THIRD_PARTY; break;
226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                case LIST_TYPE_SDCARD: mFilter = FILTER_APPS_SDCARD; break;
22718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                case LIST_TYPE_DISABLED: mFilter = FILTER_APPS_DISABLED; break;
228309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                default: mFilter = FILTER_APPS_ALL; break;
229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mClickListener = clickListener;
231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mInvalidSizeStr = owner.getActivity().getText(R.string.invalid_size_value);
232309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mComputingSizeStr = owner.getActivity().getText(R.string.computing_size);
233309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mSavedInstanceState = savedInstanceState;
234309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
235309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
236a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public void setContainerService(IMediaContainerService containerService) {
237a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mContainerService = containerService;
238a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            updateStorageUsage();
239a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
240a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
241309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public View build(LayoutInflater inflater, ViewGroup contentParent, View contentChild) {
242309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRootView != null) {
243309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                return mRootView;
244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
245309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
246309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mInflater = inflater;
247309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRootView = inflater.inflate(mListType == LIST_TYPE_RUNNING
248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    ? R.layout.manage_applications_running
249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    : R.layout.manage_applications_apps, null);
250309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer = mRootView.findViewById(R.id.loading_container);
251309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.setVisibility(View.VISIBLE);
252309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mListContainer = mRootView.findViewById(R.id.list_container);
253309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mListContainer != null) {
254309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                // Create adapter and list view here
255309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty);
256309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                ListView lv = (ListView) mListContainer.findViewById(android.R.id.list);
257309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (emptyView != null) {
258309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    lv.setEmptyView(emptyView);
259309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
260309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setOnItemClickListener(this);
261309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setSaveEnabled(true);
262309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setItemsCanFocus(true);
263309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setTextFilterEnabled(true);
264309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView = lv;
265309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications = new ApplicationsAdapter(mApplicationsState, this, mFilter);
266309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView.setAdapter(mApplications);
267309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView.setRecyclerListener(mApplications);
268309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar);
269309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel);
270309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText);
271309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText);
272309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false);
273a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (mFilter == FILTER_APPS_SDCARD) {
274a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mStorageChartLabel.setText(mOwner.getActivity().getText(
275a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            R.string.sd_card_storage));
276a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                } else {
277a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mStorageChartLabel.setText(mOwner.getActivity().getText(
278a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            R.string.internal_storage));
279a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                }
280a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                applyCurrentStorage();
281309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
282309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView = (RunningProcessesView)mRootView.findViewById(
283309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    R.id.running_processes);
284309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
285309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mRunningProcessesView.doCreate(mSavedInstanceState);
286309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
287309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
288309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mRootView;
289309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
290309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
291a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public void detachView() {
292a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mRootView != null) {
293a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                ViewGroup group = (ViewGroup)mRootView.getParent();
294a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (group != null) {
295a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    group.removeView(mRootView);
296a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                }
297a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            }
298a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
299a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
300309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void resume(int sortOrder) {
301309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications != null) {
302309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications.resume(sortOrder);
303309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
304309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
305309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                boolean haveData = mRunningProcessesView.doResume(mOwner, mRunningProcessesAvail);
306309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (haveData) {
307309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mRunningProcessesView.setVisibility(View.VISIBLE);
308309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLoadingContainer.setVisibility(View.INVISIBLE);
309309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                } else {
310309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLoadingContainer.setVisibility(View.VISIBLE);
311309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
312309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
313309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
314309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
315309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void pause() {
316309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications != null) {
317309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications.pause();
318309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
319309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
320309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mRunningProcessesView.doPause();
321309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
322309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
323309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
324309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        void updateStorageUsage() {
325309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            // Make sure a callback didn't come at an inopportune time.
326309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mOwner.getActivity() == null) return;
327309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            // Doesn't make sense for stuff that is not an app list.
328309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications == null) return;
329309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
330a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mFreeStorage = 0;
331a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mAppStorage = 0;
332a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTotalStorage = 0;
333309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
334309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mFilter == FILTER_APPS_SDCARD) {
335309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mContainerService != null) {
336309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    try {
337309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        final long[] stats = mContainerService.getFileSystemStats(
338309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                Environment.getExternalStorageDirectory().getPath());
339a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mTotalStorage = stats[0];
340a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mFreeStorage = stats[1];
341309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    } catch (RemoteException e) {
342309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        Log.w(TAG, "Problem in container service", e);
343309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
344309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
345309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
346309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mApplications != null) {
347309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    final int N = mApplications.getCount();
348309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    for (int i=0; i<N; i++) {
349309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
3501f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                        mAppStorage += ae.externalCodeSize + ae.externalDataSize
3511f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                                + ae.externalCacheSize;
352309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
353309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
354309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            } else {
355309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mContainerService != null) {
356309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    try {
357309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        final long[] stats = mContainerService.getFileSystemStats(
358309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                Environment.getDataDirectory().getPath());
359a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mTotalStorage = stats[0];
360a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mFreeStorage = stats[1];
361309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    } catch (RemoteException e) {
362309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        Log.w(TAG, "Problem in container service", e);
363309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
364309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
365309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
366309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                final boolean emulatedStorage = Environment.isExternalStorageEmulated();
367309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mApplications != null) {
368309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    final int N = mApplications.getCount();
369309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    for (int i=0; i<N; i++) {
370309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
371a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mAppStorage += ae.codeSize + ae.dataSize;
372309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        if (emulatedStorage) {
373a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            mAppStorage += ae.externalCodeSize + ae.externalDataSize;
374309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        }
375309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
376309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
377a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mFreeStorage += mApplicationsState.sumCacheSizes();
378309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
379a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
380a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            applyCurrentStorage();
381a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
382a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
383a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        void applyCurrentStorage() {
384a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            // If view hierarchy is not yet created, no views to update.
385a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mRootView == null) {
386a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                return;
387309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
388a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mTotalStorage > 0) {
38937f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                BidiFormatter bidiFormatter = BidiFormatter.getInstance();
390a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mColorBar.setRatios((mTotalStorage-mFreeStorage-mAppStorage)/(float)mTotalStorage,
391a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mAppStorage/(float)mTotalStorage, mFreeStorage/(float)mTotalStorage);
392a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                long usedStorage = mTotalStorage - mFreeStorage;
393309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastUsedStorage != usedStorage) {
394309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastUsedStorage = usedStorage;
39537f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                    String sizeStr = bidiFormatter.unicodeWrap(
39637f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                            Formatter.formatShortFileSize(mOwner.getActivity(), usedStorage));
397309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mUsedStorageText.setText(mOwner.getActivity().getResources().getString(
398309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            R.string.service_foreground_processes, sizeStr));
399309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
400a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (mLastFreeStorage != mFreeStorage) {
401a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mLastFreeStorage = mFreeStorage;
40237f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                    String sizeStr = bidiFormatter.unicodeWrap(
40337f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                            Formatter.formatShortFileSize(mOwner.getActivity(), mFreeStorage));
404309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mFreeStorageText.setText(mOwner.getActivity().getResources().getString(
405309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            R.string.service_background_processes, sizeStr));
406309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
407309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            } else {
408309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mColorBar.setRatios(0, 0, 0);
409309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastUsedStorage != -1) {
410309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastUsedStorage = -1;
411309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mUsedStorageText.setText("");
412309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
413309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastFreeStorage != -1) {
414309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastFreeStorage = -1;
415309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mFreeStorageText.setText("");
416309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
417309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
418309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
419309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
420309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
421309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
422a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mClickListener.onItemClick(this, parent, view, position, id);
423309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
424309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
425309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        void handleRunningProcessesAvail() {
426309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
427309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mOwner.getActivity(), android.R.anim.fade_out));
428309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation(
429309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mOwner.getActivity(), android.R.anim.fade_in));
430309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView.setVisibility(View.VISIBLE);
431309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.setVisibility(View.GONE);
432309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
433309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
434309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
43518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    private int mNumTabs;
436309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    TabInfo mCurTab = null;
437309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Size resource used for packages whose size computation failed for some reason
4399244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    CharSequence mInvalidSizeStr;
440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingSizeStr;
441afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // layout inflater object used to inflate views
443afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LayoutInflater mInflater;
444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
445de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private String mCurrentPkgName;
446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
447ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    private Menu mOptionsMenu;
4487a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
4497a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    // These are for keeping track of activity and spinner switch state.
450728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    private boolean mActivityResumed;
451728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
4527a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_DOWNLOADED = 0;
4537a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_RUNNING = 1;
4547a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_SDCARD = 2;
4557a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_ALL = 3;
45618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    static final int LIST_TYPE_DISABLED = 4;
457f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
4580385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn    private boolean mShowBackground = false;
4590385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn
4607a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    private int mDefaultListType = -1;
461f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
462309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ViewGroup mContentContainer;
463309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private View mRootView;
464309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ViewPager mViewPager;
465f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
46614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    AlertDialog mResetDialog;
46714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
468309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    class MyPagerAdapter extends PagerAdapter
469309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            implements ViewPager.OnPageChangeListener {
470309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        int mCurPos = 0;
471309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
472309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
473309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public int getCount() {
47418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            return mNumTabs;
475309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
476309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
477309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
478309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public Object instantiateItem(ViewGroup container, int position) {
479309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = mTabs.get(position);
480309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            View root = tab.build(mInflater, mContentContainer, mRootView);
481309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            container.addView(root);
48218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            root.setTag(R.id.name, tab);
483309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return root;
484309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
485309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
486309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
487309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void destroyItem(ViewGroup container, int position, Object object) {
488309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            container.removeView((View)object);
489ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn        }
490ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn
491309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
492309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public boolean isViewFromObject(View view, Object object) {
493309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return view == object;
494309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
4957a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
496309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
49718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        public int getItemPosition(Object object) {
49818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            return super.getItemPosition(object);
49918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            //return ((TabInfo)((View)object).getTag(R.id.name)).mListType;
50018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        }
50118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
50218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        @Override
503309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public CharSequence getPageTitle(int position) {
504309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mTabs.get(position).mLabel;
505309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
506309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
507309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
508309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
509309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
510309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
511309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
512309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageSelected(int position) {
513309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurPos = position;
514309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
515309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
516309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
517309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageScrollStateChanged(int state) {
518309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (state == ViewPager.SCROLL_STATE_IDLE) {
519309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                updateCurrentTab(mCurPos);
520309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
5217a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        }
5227a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    }
5237a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
524e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project    /*
525e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * Custom adapter implementation for the ListView
526e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * This adapter maintains a map for each displayed application and its properties
527e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * An index value on each AppInfo object indicates the correct position or index
528e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * in the list. If the list gets updated dynamically when the user is viewing the list of
529e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * applications, we need to return the correct index of position. This is done by mapping
530e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * the getId methods via the package name into the internal maps and indices.
531e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * The order of applications in the list is mirrored in mAppLocalList
532e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project     */
533309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    static class ApplicationsAdapter extends BaseAdapter implements Filterable,
534e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.Callbacks, AbsListView.RecyclerListener {
535e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ApplicationsState mState;
536309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final ApplicationsState.Session mSession;
537309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final TabInfo mTab;
538309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final Context mContext;
539e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ArrayList<View> mActive = new ArrayList<View>();
540309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final int mFilterMode;
541e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mBaseEntries;
542e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mEntries;
543e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private boolean mResumed;
544309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private int mLastSortMode=-1;
54519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        private boolean mWaitingForData;
546bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        private int mWhichSize = SIZE_TOTAL;
547e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        CharSequence mCurFilterPrefix;
548e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
549e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private Filter mFilter = new Filter() {
550e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
551e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected FilterResults performFiltering(CharSequence constraint) {
552e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> entries
553e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = applyPrefixFilter(constraint, mBaseEntries);
554e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                FilterResults fr = new FilterResults();
555e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.values = entries;
556e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.count = entries.size();
557e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return fr;
558e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            }
559355b32faa924a0b39067dd759ba03e5af97065caSuchi Amalapurapu
560e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
561e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected void publishResults(CharSequence constraint, FilterResults results) {
562e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mCurFilterPrefix = constraint;
563e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values;
564e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                notifyDataSetChanged();
565309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.updateStorageUsage();
566afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
567e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        };
568c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
569309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public ApplicationsAdapter(ApplicationsState state, TabInfo tab, int filterMode) {
570e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mState = state;
571309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mSession = state.newSession(this);
572309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab = tab;
573309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mContext = tab.mOwner.getActivity();
574309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mFilterMode = filterMode;
575c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
576e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
577309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void resume(int sort) {
578e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Resume!  mResumed=" + mResumed);
579e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (!mResumed) {
580e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = true;
581309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mSession.resume();
582e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mLastSortMode = sort;
58319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                rebuild(true);
584e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            } else {
585309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                rebuild(sort);
586c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
587e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project        }
588c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
589e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void pause() {
590e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mResumed) {
591e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = false;
592309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mSession.pause();
593e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
594afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
595b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
596309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void rebuild(int sort) {
597309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (sort == mLastSortMode) {
598e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return;
599e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
600e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mLastSortMode = sort;
60119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            rebuild(true);
602afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
603afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
60419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        public void rebuild(boolean eraseold) {
605e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Rebuilding app list...");
606e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppFilter filterObj;
607e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            Comparator<AppEntry> comparatorObj;
608bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            boolean emulated = Environment.isExternalStorageEmulated();
609bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            if (emulated) {
610bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mWhichSize = SIZE_TOTAL;
611bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            } else {
612bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mWhichSize = SIZE_INTERNAL;
613bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            }
614309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            switch (mFilterMode) {
615e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_THIRD_PARTY:
616e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.THIRD_PARTY_FILTER;
617e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
618e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_SDCARD:
619e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.ON_SD_CARD_FILTER;
620bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                    if (!emulated) {
621bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                        mWhichSize = SIZE_EXTERNAL;
622bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                    }
623e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
62418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                case FILTER_APPS_DISABLED:
62518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                    filterObj = ApplicationsState.DISABLED_FILTER;
62618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                    break;
627e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
62818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                    filterObj = ApplicationsState.ALL_ENABLED_FILTER;
629e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
630e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
631e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            switch (mLastSortMode) {
632e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case SORT_ORDER_SIZE:
633430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                    switch (mWhichSize) {
634430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        case SIZE_INTERNAL:
635430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR;
636430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
637430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        case SIZE_EXTERNAL:
638430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.EXTERNAL_SIZE_COMPARATOR;
639430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
640430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        default:
641430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.SIZE_COMPARATOR;
642430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
643430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                    }
644e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
645e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
646e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    comparatorObj = ApplicationsState.ALPHA_COMPARATOR;
647e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
648e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
64919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            ArrayList<ApplicationsState.AppEntry> entries
650309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    = mSession.rebuild(filterObj, comparatorObj);
65119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (entries == null && !eraseold) {
65219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                // Don't have new list yet, but can continue using the old one.
65319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                return;
65419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
65519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mBaseEntries = entries;
65619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (mBaseEntries != null) {
65719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
65819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            } else {
65919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mEntries = null;
66019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
661e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            notifyDataSetChanged();
662309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.updateStorageUsage();
66319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
66419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (entries == null) {
66519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mWaitingForData = true;
666309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.setVisibility(View.INVISIBLE);
667309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.setVisibility(View.VISIBLE);
66819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            } else {
669309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.setVisibility(View.VISIBLE);
670309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.setVisibility(View.GONE);
67119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
672afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
673afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
674e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix,
675e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> origEntries) {
676e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (prefix == null || prefix.length() == 0) {
677e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return origEntries;
678afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
679e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                String prefixStr = ApplicationsState.normalize(prefix.toString());
680e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                final String spacePrefixStr = " " + prefixStr;
681e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> newEntries
682e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = new ArrayList<ApplicationsState.AppEntry>();
683e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                for (int i=0; i<origEntries.size(); i++) {
684e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    ApplicationsState.AppEntry entry = origEntries.get(i);
685e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    String nlabel = entry.getNormalizedLabel();
686e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) {
687e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        newEntries.add(entry);
688ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                    }
689ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                }
690e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return newEntries;
691afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
692afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
693ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu
694e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
695e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onRunningStateChanged(boolean running) {
696309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mOwner.getActivity().setProgressBarIndeterminateVisibility(running);
697afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
698b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
699e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
70019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        public void onRebuildComplete(ArrayList<AppEntry> apps) {
701309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mTab.mLoadingContainer.getVisibility() == View.VISIBLE) {
702309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
703309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        mContext, android.R.anim.fade_out));
704309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.startAnimation(AnimationUtils.loadAnimation(
705309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        mContext, android.R.anim.fade_in));
7064e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn            }
707309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mListContainer.setVisibility(View.VISIBLE);
708309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mLoadingContainer.setVisibility(View.GONE);
70919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mWaitingForData = false;
71019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mBaseEntries = apps;
71119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
71219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            notifyDataSetChanged();
713309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.updateStorageUsage();
71419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        }
71519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
71619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        @Override
717e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageListChanged() {
71819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            rebuild(false);
719afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
720b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
721e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
722e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageIconChanged() {
723e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // We ensure icons are loaded when their item is displayed, so
724e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // don't care about icons loaded in the background.
725afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
726b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
727e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
728e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageSizeChanged(String packageName) {
729e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            for (int i=0; i<mActive.size(); i++) {
730e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag();
731e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (holder.entry.info.packageName.equals(packageName)) {
732e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    synchronized (holder.entry) {
733309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
734c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
735309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    if (holder.entry.info.packageName.equals(mTab.mOwner.mCurrentPkgName)
736e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                            && mLastSortMode == SORT_ORDER_SIZE) {
737e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // We got the size information for the last app the
738e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // user viewed, and are sorting by size...  they may
739e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // have cleared data, so we immediately want to resort
740e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // the list with the new size to reflect it to the user.
74119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                        rebuild(false);
742c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
743309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mTab.updateStorageUsage();
744e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    return;
745c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                }
746c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
747c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
748c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
749e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
750e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onAllSizesComputed() {
751e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mLastSortMode == SORT_ORDER_SIZE) {
75219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                rebuild(false);
753afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
754a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTab.updateStorageUsage();
755afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
756afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
757afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int getCount() {
758e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries != null ? mEntries.size() : 0;
759afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
760afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
761afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public Object getItem(int position) {
762e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
763afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
764afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
765e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public ApplicationsState.AppEntry getAppEntry(int position) {
766e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
767afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
768afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
769afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public long getItemId(int position) {
770e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position).id;
771afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
772afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
773afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
774347c9a0544328e65120582834ce330fb0d473f28Jeff Brown            // A ViewHolder keeps references to children views to avoid unnecessary calls
775afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to findViewById() on each row.
776309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            AppViewHolder holder = AppViewHolder.createOrRecycle(mTab.mInflater, convertView);
7779244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            convertView = holder.rootView;
778afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
779afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Bind the data efficiently with the holder
780e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppEntry entry = mEntries.get(position);
781e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            synchronized (entry) {
782e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                holder.entry = entry;
783e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.label != null) {
784e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appName.setText(entry.label);
785afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
786e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mState.ensureIcon(entry);
787e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.icon != null) {
788e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appIcon.setImageDrawable(entry.icon);
789afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
790309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
7913db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                if ((entry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {
7923db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setVisibility(View.VISIBLE);
7933db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setText(R.string.not_installed);
7943db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                } else if (!entry.info.enabled) {
7953db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setVisibility(View.VISIBLE);
7963db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setText(R.string.disabled);
79744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                } else {
79844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    holder.disabled.setVisibility(View.GONE);
79944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                }
800309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mFilterMode == FILTER_APPS_SDCARD) {
8016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setVisibility(View.VISIBLE);
8026dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setChecked((entry.info.flags
8036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                            & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
8046dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                } else {
8056dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setVisibility(View.GONE);
8066dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                }
807afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
808e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(convertView);
809e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.add(convertView);
810afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return convertView;
811afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
812c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
813e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
814c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        public Filter getFilter() {
815e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mFilter;
816c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
817c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
818e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
819e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onMovedToScrapHeap(View view) {
820e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(view);
821728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
822728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
823728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
824afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
825f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle savedInstanceState) {
826afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
827f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
828f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        setHasOptionsMenu(true);
829f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
830f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
831f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        Intent intent = getActivity().getIntent();
832ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        String action = intent.getAction();
8337a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        int defaultListType = LIST_TYPE_DOWNLOADED;
834ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        String className = getArguments() != null
835ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                ? getArguments().getString("classname") : null;
836ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (className == null) {
837ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            className = intent.getComponent().getClassName();
838ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
839af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani        if (className.equals(RunningServicesActivity.class.getName())
840af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || className.endsWith(".RunningServices")) {
8417a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_RUNNING;
8425203bdffe6ce2b829d0fab8c7691fa92aca6e972Amith Yamasani        } else if (className.equals(StorageUseActivity.class.getName())
843af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || Intent.ACTION_MANAGE_PACKAGE_STORAGE.equals(action)
844af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || className.endsWith(".StorageUse")) {
845afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSortOrder = SORT_ORDER_SIZE;
8467a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_ALL;
847762eaa77e3e12d5337ddc9cb87b473c47af5524aKenny Root        } else if (Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)) {
8487a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            // Select the all-apps list, with the default sorting
8497a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_ALL;
850afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
8517a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
852728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (savedInstanceState != null) {
85302c22131e93e1a506141b1890c7134909ded876fAmith Yamasani            mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder);
8547a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            int tmp = savedInstanceState.getInt(EXTRA_DEFAULT_LIST_TYPE, -1);
8557a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            if (tmp != -1) defaultListType = tmp;
85602c22131e93e1a506141b1890c7134909ded876fAmith Yamasani            mShowBackground = savedInstanceState.getBoolean(EXTRA_SHOW_BACKGROUND, false);
857728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
8587a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
8597a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        mDefaultListType = defaultListType;
8603b7dbcecf70788df4950340cbf750dbe524dca96Amith Yamasani
86144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        final Intent containerIntent = new Intent().setComponent(
86244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey                StorageMeasurement.DEFAULT_CONTAINER_COMPONENT);
86344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE);
8641337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
865f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
866f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingSizeStr = getActivity().getText(R.string.computing_size);
867f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
868a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        TabInfo tab = new TabInfo(this, mApplicationsState,
869309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_third_party),
870309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_DOWNLOADED, this, savedInstanceState);
871309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
872f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
873309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (!Environment.isExternalStorageEmulated()) {
874a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            tab = new TabInfo(this, mApplicationsState,
875309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    getActivity().getString(R.string.filter_apps_onsdcard),
876309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    LIST_TYPE_SDCARD, this, savedInstanceState);
877309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTabs.add(tab);
878508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
8797a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
880a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        tab = new TabInfo(this, mApplicationsState,
881309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_running),
882309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_RUNNING, this, savedInstanceState);
883309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
8847a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
885a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        tab = new TabInfo(this, mApplicationsState,
886309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_all),
887309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_ALL, this, savedInstanceState);
888309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
88918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
89018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        tab = new TabInfo(this, mApplicationsState,
89118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                getActivity().getString(R.string.filter_apps_disabled),
89218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                LIST_TYPE_DISABLED, this, savedInstanceState);
89318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        mTabs.add(tab);
89418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
89518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        mNumTabs = mTabs.size();
896309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
8977a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
8987a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
899309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    @Override
900309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
901309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // initialize the inflater
902309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mInflater = inflater;
9037a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
904309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        View rootView = mInflater.inflate(R.layout.manage_applications_content,
905309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                container, false);
906309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mContentContainer = container;
907309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mRootView = rootView;
9087a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
909309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
910309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        MyPagerAdapter adapter = new MyPagerAdapter();
911309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager.setAdapter(adapter);
912309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager.setOnPageChangeListener(adapter);
913309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs);
914309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        tabs.setTabIndicatorColorResource(android.R.color.holo_blue_light);
9157a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
916a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // We have to do this now because PreferenceFrameLayout looks at it
917a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // only when the view is added.
918a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        if (container instanceof PreferenceFrameLayout) {
919a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true;
920a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
921a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
92214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
92314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            buildResetDialog();
92414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
92514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
92613ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn        if (savedInstanceState == null) {
92713ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            // First time init: make sure view pager is showing the correct tab.
92813ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            for (int i = 0; i < mTabs.size(); i++) {
92913ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                TabInfo tab = mTabs.get(i);
93013ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                if (tab.mListType == mDefaultListType) {
93113ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                    mViewPager.setCurrentItem(i);
93213ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                    break;
93313ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                }
93413ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            }
93513ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn        }
93613ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn
937309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        return rootView;
938afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
939f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
940f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    @Override
941728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public void onStart() {
942728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onStart();
943b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu    }
944b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
945afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
946f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onResume() {
947728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onResume();
948728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = true;
949309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        updateCurrentTab(mViewPager.getCurrentItem());
950f5f08628cc0129e92277d6ddfcf6ae680887573dDianne Hackborn        updateNumTabs();
951ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
952afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
953b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
954728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
955f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onSaveInstanceState(Bundle outState) {
956728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onSaveInstanceState(outState);
95702c22131e93e1a506141b1890c7134909ded876fAmith Yamasani        outState.putInt(EXTRA_SORT_ORDER, mSortOrder);
9587a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        if (mDefaultListType != -1) {
9597a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            outState.putInt(EXTRA_DEFAULT_LIST_TYPE, mDefaultListType);
960f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
96102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani        outState.putBoolean(EXTRA_SHOW_BACKGROUND, mShowBackground);
96214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog != null) {
96314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            outState.putBoolean(EXTRA_RESET_DIALOG, true);
96414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
965728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
966728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
967728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
968f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onPause() {
969728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onPause();
970728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = false;
971309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
972309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTabs.get(i).pause();
973728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
974728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
975728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
976728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
97714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onStop() {
97814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        super.onStop();
97914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog != null) {
98014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog.dismiss();
98114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = null;
98214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
98314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
98414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
98514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
986a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    public void onDestroyView() {
987a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        super.onDestroyView();
988a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
989a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // We are going to keep the tab data structures around, but they
990a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // are no longer attached to their view hierarchy.
991a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
992a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTabs.get(i).detachView();
993a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
994a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    }
995a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
996a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    @Override
997f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onActivityResult(int requestCode, int resultCode, Intent data) {
998728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
999e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mApplicationsState.requestSize(mCurrentPkgName);
1000ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        }
1001afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
10027a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
100318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    private void updateNumTabs() {
100418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        int newNum = mApplicationsState.haveDisabledApps() ? mTabs.size() : (mTabs.size()-1);
100518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        if (newNum != mNumTabs) {
100618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            mNumTabs = newNum;
100718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            if (mViewPager != null) {
100818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                mViewPager.getAdapter().notifyDataSetChanged();
100918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            }
101018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        }
101118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    }
101218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
1013309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    TabInfo tabForType(int type) {
1014309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i = 0; i < mTabs.size(); i++) {
1015309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = mTabs.get(i);
1016309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (tab.mListType == type) {
1017309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                return tab;
1018309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
10197a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        }
1020309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        return null;
10217a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    }
10227a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
1023afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // utility method used to start sub activity
1024afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void startApplicationDetailsActivity() {
1025f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        // start new fragment to display extended information
1026f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        Bundle args = new Bundle();
1027f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mCurrentPkgName);
1028f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
1029f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        PreferenceActivity pa = (PreferenceActivity)getActivity();
1030ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        pa.startPreferencePanel(InstalledAppDetails.class.getName(), args,
1031ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                R.string.application_info_label, null, this, INSTALLED_APP_DETAILS);
1032afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1033afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1034afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1035f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
1036ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mOptionsMenu = menu;
10370385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn        // note: icons removed for now because the cause the new action
10380385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn        // bar UI to be very confusing.
1039afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
10400385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn                //.setIcon(android.R.drawable.ic_menu_sort_alphabetically)
1041348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1042afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
10430385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn                //.setIcon(android.R.drawable.ic_menu_sort_by_size)
1044348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1045ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services)
1046ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
1047ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes)
1048ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
104914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        menu.add(0, RESET_APP_PREFERENCES, 4, R.string.reset_app_preferences)
105014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1051ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1052afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1053afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1054afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1055f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onPrepareOptionsMenu(Menu menu) {
1056ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1057ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
1058ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
1059ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    @Override
1060ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onDestroyOptionsMenu() {
1061ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mOptionsMenu = null;
1062ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
106344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
106444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    @Override
106544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    public void onDestroy() {
106644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        getActivity().unbindService(mContainerConnection);
106744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        super.onDestroy();
106844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    }
106944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
1070ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    void updateOptionsMenu() {
1071ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (mOptionsMenu == null) {
1072ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return;
1073ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
1074ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
1075673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root        /*
1076673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         * The running processes screen doesn't use the mApplicationsAdapter
1077673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         * so bringing up this menu in that case doesn't make any sense.
1078673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         */
1079309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (mCurTab != null && mCurTab.mListType == LIST_TYPE_RUNNING) {
1080309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = tabForType(LIST_TYPE_RUNNING);
1081309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            boolean showingBackground = tab != null && tab.mRunningProcessesView != null
1082309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    ? tab.mRunningProcessesView.mAdapter.getShowBackground() : false;
1083ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false);
1084ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false);
1085ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground);
1086ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground);
108714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false);
10881337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else {
1089ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
1090ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
1091ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false);
1092ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false);
109314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(true);
109414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
109514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
109614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
109714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    void buildResetDialog() {
109814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == null) {
109914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
110014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setTitle(R.string.reset_app_preferences_title);
110114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setMessage(R.string.reset_app_preferences_desc);
110214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setPositiveButton(R.string.reset_app_preferences_button, this);
110314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setNegativeButton(R.string.cancel, null);
110414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = builder.show();
110514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog.setOnDismissListener(this);
110614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
110714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
110814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
110914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
111014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onDismiss(DialogInterface dialog) {
111114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == dialog) {
111214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = null;
111314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
111414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
111514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
111614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
111714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
111814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onClick(DialogInterface dialog, int which) {
111914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == dialog) {
112014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final PackageManager pm = getActivity().getPackageManager();
1121596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn            final IPackageManager mIPm = IPackageManager.Stub.asInterface(
1122a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn                    ServiceManager.getService("package"));
112314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final INotificationManager nm = INotificationManager.Stub.asInterface(
112414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    ServiceManager.getService(Context.NOTIFICATION_SERVICE));
112514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final NetworkPolicyManager npm = NetworkPolicyManager.from(getActivity());
1126a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn            final AppOpsManager aom = (AppOpsManager)getActivity().getSystemService(
1127a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn                    Context.APP_OPS_SERVICE);
112814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final Handler handler = new Handler(getActivity().getMainLooper());
112914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            (new AsyncTask<Void, Void, Void>() {
113014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                @Override protected Void doInBackground(Void... params) {
113114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    List<ApplicationInfo> apps = pm.getInstalledApplications(
113214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            PackageManager.GET_DISABLED_COMPONENTS);
113314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    for (int i=0; i<apps.size(); i++) {
113414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        ApplicationInfo app = apps.get(i);
113514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        try {
113614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName);
1137df3f6d6c4722a7acc8189e47d0499aaf618969f9Daniel Sandler                            nm.setNotificationsEnabledForPackage(app.packageName, app.uid, true);
113814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        } catch (android.os.RemoteException ex) {
113914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
114014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        if (!app.enabled) {
114114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName);
114214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (pm.getApplicationEnabledSetting(app.packageName)
114314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                    == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
114414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                pm.setApplicationEnabledSetting(app.packageName,
114514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                        PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
114614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                        PackageManager.DONT_KILL_APP);
114714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            }
114814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
114914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
1150596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn                    try {
1151596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn                        mIPm.resetPreferredActivities(UserHandle.myUserId());
1152596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn                    } catch (RemoteException e) {
115314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
1154a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn                    aom.resetAllModes();
115538305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    final int[] restrictedUids = npm.getUidsWithPolicy(
115614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            POLICY_REJECT_METERED_BACKGROUND);
115738305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    final int currentUserId = ActivityManager.getCurrentUser();
115838305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    for (int uid : restrictedUids) {
115938305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        // Only reset for current user
116038305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        if (UserHandle.getUserId(uid) == currentUserId) {
116138305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                            if (DEBUG) Log.v(TAG, "Clearing data policy: " + uid);
116238305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                            npm.setUidPolicy(uid, POLICY_NONE);
116338305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        }
116414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
116514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    handler.post(new Runnable() {
116614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        @Override public void run() {
116714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Done clearing");
116814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (getActivity() != null && mActivityResumed) {
116914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                if (DEBUG) Log.v(TAG, "Updating UI!");
1170309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                for (int i=0; i<mTabs.size(); i++) {
1171309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    TabInfo tab = mTabs.get(i);
1172309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    if (tab.mApplications != null) {
1173309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                        tab.mApplications.pause();
1174309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    }
1175309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                }
1176309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                if (mCurTab != null) {
1177309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    mCurTab.resume(mSortOrder);
1178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                }
117914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            }
118014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
118114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    });
118214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    return null;
118314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                }
118414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            }).execute();
1185673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root        }
1186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
1190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int menuId = item.getItemId();
1191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) {
1192e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mSortOrder = menuId;
1193309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mApplications != null) {
1194309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mApplications.rebuild(mSortOrder);
11951337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            }
11961337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else if (menuId == SHOW_RUNNING_SERVICES) {
11970385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn            mShowBackground = false;
1198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
1199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(false);
1200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
12011337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else if (menuId == SHOW_BACKGROUND_PROCESSES) {
12020385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn            mShowBackground = true;
1203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
1204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(true);
1205309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
120614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        } else if (menuId == RESET_APP_PREFERENCES) {
120714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            buildResetDialog();
1208f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani        } else {
1209f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani            // Handle the home button
1210f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani            return false;
1211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1212ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return true;
1214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1215d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn
1216a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    public void onItemClick(TabInfo tab, AdapterView<?> parent, View view, int position,
1217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long id) {
1218a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        if (tab.mApplications != null && tab.mApplications.getCount() > position) {
1219a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            ApplicationsState.AppEntry entry = tab.mApplications.getAppEntry(position);
1220309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurrentPkgName = entry.info.packageName;
1221309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            startApplicationDetailsActivity();
12221337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
1223309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
12241337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
1225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public void updateCurrentTab(int position) {
1226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        TabInfo tab = mTabs.get(position);
1227309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mCurTab = tab;
122844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
1229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // Put things in the correct paused/resumed state.
1230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (mActivityResumed) {
1231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.build(mInflater, mContentContainer, mRootView);
1232309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.resume(mSortOrder);
12331337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else {
1234309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.pause();
12351337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
1236309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
1237309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo t = mTabs.get(i);
1238309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (t != mCurTab) {
1239309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                t.pause();
12401337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            }
12411337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
12421337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
1243309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mCurTab.updateStorageUsage();
1244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        updateOptionsMenu();
1245a31be80ef056add00e0d239414f80f932978277fAdam Powell        final Activity host = getActivity();
1246a31be80ef056add00e0d239414f80f932978277fAdam Powell        if (host != null) {
1247a31be80ef056add00e0d239414f80f932978277fAdam Powell            host.invalidateOptionsMenu();
1248a31be80ef056add00e0d239414f80f932978277fAdam Powell        }
1249e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    }
1250e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
125144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    private volatile IMediaContainerService mContainerService;
125244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
125344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    private final ServiceConnection mContainerConnection = new ServiceConnection() {
125444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        @Override
125544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        public void onServiceConnected(ComponentName name, IBinder service) {
125644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey            mContainerService = IMediaContainerService.Stub.asInterface(service);
1257a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            for (int i=0; i<mTabs.size(); i++) {
1258a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mTabs.get(i).setContainerService(mContainerService);
1259309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
126044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        }
126144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
126244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        @Override
126344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        public void onServiceDisconnected(ComponentName name) {
126444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey            mContainerService = null;
126544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        }
126644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    };
1267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1268