ManageApplications.java revision a4af18755e0a344c628e4ddc4ece793d3401e6fb
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;
2314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.AlertDialog;
24f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment;
2514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.INotificationManager;
2644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ComponentName;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
2814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.DialogInterface;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
3014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.IntentFilter;
3144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ServiceConnection;
3219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport android.content.pm.ApplicationInfo;
336dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.IPackageManager;
346dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.PackageInfo;
3514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.pm.PackageManager;
3614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.net.NetworkPolicyManager;
3714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.AsyncTask;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
391337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.os.Environment;
4014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.Handler;
4144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.os.IBinder;
426dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.RemoteException;
436dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.ServiceManager;
44f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.preference.PreferenceActivity;
45a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackbornimport android.preference.PreferenceFrameLayout;
46728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.provider.Settings;
47309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerAdapter;
48309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerTabStrip;
49309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.ViewPager;
501337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.text.format.Formatter;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu;
54f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.MenuInflater;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup;
58ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackbornimport android.view.animation.AnimationUtils;
59e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView;
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView;
61a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.widget.AdapterView.OnItemClickListener;
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter;
63c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filter;
64c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filterable;
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView;
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
67b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
6844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.internal.app.IMediaContainerService;
69b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.internal.content.PackageHelper;
70b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.R;
71b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.RunningServicesActivity;
72b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.StorageUseActivity;
73b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.applications.ApplicationsState.AppEntry;
7444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.settings.deviceinfo.StorageMeasurement;
75309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport com.android.settings.Utils;
76b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Comparator;
7914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport java.util.List;
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
816dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornfinal class CanBeOnSdCardChecker {
826dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    final IPackageManager mPm;
836dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    int mInstallLocation;
846dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
856dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    CanBeOnSdCardChecker() {
866dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mPm = IPackageManager.Stub.asInterface(
876dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                ServiceManager.getService("package"));
886dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
906dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    void init() {
916dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        try {
926dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            mInstallLocation = mPm.getInstallLocation();
936dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        } catch (RemoteException e) {
946dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            Log.e("CanBeOnSdCardChecker", "Is Package Manager running?");
956dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            return;
966dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        }
976dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
986dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
996dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    boolean check(ApplicationInfo info) {
1006dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        boolean canBe = false;
1016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
1026dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            canBe = true;
1036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        } else {
1043c24cfed8d5116ff21986acb60a918cb079a0efdKenny Root            if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
1056dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                if (info.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL ||
1066dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        info.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
1076dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    canBe = true;
1086dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                } else if (info.installLocation
1096dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) {
1106dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    if (mInstallLocation == PackageHelper.APP_INSTALL_EXTERNAL) {
1116dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        // For apps with no preference and the default value set
1126dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        // to install on sdcard.
1136dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        canBe = true;
1146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    }
1156dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                }
1166dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            }
1176dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        }
1186dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        return canBe;
1196dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
1206dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn}
1216dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
122a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborninterface AppClickListener {
123a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    void onItemClick(ManageApplications.TabInfo tab, AdapterView<?> parent,
124a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            View view, int position, long id);
125a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn}
126a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to pick an application that will be used to display installation information and
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * options to uninstall/delete user data for system applications. This activity
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * intent.
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
133f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class ManageApplications extends Fragment implements
134a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        AppClickListener, DialogInterface.OnClickListener,
13514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        DialogInterface.OnDismissListener {
13602c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
137e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final String TAG = "ManageApplications";
138e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final boolean DEBUG = false;
13902c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
14002c22131e93e1a506141b1890c7134909ded876fAmith Yamasani    private static final String EXTRA_FILTER_APPS = "filterApps";
14102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani    private static final String EXTRA_SORT_ORDER = "sortOrder";
14202c22131e93e1a506141b1890c7134909ded876fAmith Yamasani    private static final String EXTRA_SHOW_BACKGROUND = "showBackground";
1437a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    private static final String EXTRA_DEFAULT_LIST_TYPE = "defaultListType";
14414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    private static final String EXTRA_RESET_DIALOG = "resetDialog";
14502c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // attributes used as keys when passing values to InstalledAppDetails activity
14738b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu    public static final String APP_CHG = "chg";
14802c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // constant value that can be used to check return code from sub activity.
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int INSTALLED_APP_DETAILS = 1;
151d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn
152bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_TOTAL = 0;
153bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_INTERNAL = 1;
154bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_EXTERNAL = 2;
155bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order that can be changed through the menu can be sorted alphabetically
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // or size(descending)
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int MENU_OPTIONS_BASE = 0;
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Filter options used for displayed list of applications
1606cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0;
161728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1;
162728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2;
163747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu
1646cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4;
1656cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5;
1661337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6;
1671337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7;
16814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 8;
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private int mSortOrder = SORT_ORDER_ALPHA;
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Filter value
172fe4a2bc43f45b14db62c67d7c2531a3d7f1b8590Suchi Amalapurapu    private int mFilterApps = FILTER_APPS_THIRD_PARTY;
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
174e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    private ApplicationsState mApplicationsState;
175309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
176309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public static class TabInfo implements OnItemClickListener {
177309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final ManageApplications mOwner;
178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final ApplicationsState mApplicationsState;
179309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mLabel;
180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final int mListType;
181309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final int mFilter;
182a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public final AppClickListener mClickListener;
183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mInvalidSizeStr;
184309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mComputingSizeStr;
185309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final Bundle mSavedInstanceState;
186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public ApplicationsAdapter mApplications;
188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public LayoutInflater mInflater;
189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public View mRootView;
190309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
191a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        private IMediaContainerService mContainerService;
192a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
193309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private View mLoadingContainer;
194309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
195309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private View mListContainer;
196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
197309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // ListView used to display list
198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private ListView mListView;
199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // Custom view used to display running processes
200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private RunningProcessesView mRunningProcessesView;
201309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
202309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private LinearColorBar mColorBar;
203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private TextView mStorageChartLabel;
204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private TextView mUsedStorageText;
205309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private TextView mFreeStorageText;
206a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        private long mFreeStorage = 0, mAppStorage = 0, mTotalStorage = 0;
207309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage;
208309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
209309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        final Runnable mRunningProcessesAvail = new Runnable() {
210309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            public void run() {
211309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                handleRunningProcessesAvail();
212309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        };
214309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
215309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public TabInfo(ManageApplications owner, ApplicationsState apps,
216a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                CharSequence label, int listType, AppClickListener clickListener,
217309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                Bundle savedInstanceState) {
218309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mOwner = owner;
219309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mApplicationsState = apps;
220309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLabel = label;
221309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mListType = listType;
222309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            switch (listType) {
223309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                case LIST_TYPE_DOWNLOADED: mFilter = FILTER_APPS_THIRD_PARTY; break;
224309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                case LIST_TYPE_SDCARD: mFilter = FILTER_APPS_SDCARD; break;
225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                default: mFilter = FILTER_APPS_ALL; break;
226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
227309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mClickListener = clickListener;
228309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mInvalidSizeStr = owner.getActivity().getText(R.string.invalid_size_value);
229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mComputingSizeStr = owner.getActivity().getText(R.string.computing_size);
230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mSavedInstanceState = savedInstanceState;
231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
232309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
233a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public void setContainerService(IMediaContainerService containerService) {
234a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mContainerService = containerService;
235a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            updateStorageUsage();
236a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
237a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
238309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public View build(LayoutInflater inflater, ViewGroup contentParent, View contentChild) {
239309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRootView != null) {
240309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                return mRootView;
241309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
242309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
243309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mInflater = inflater;
244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRootView = inflater.inflate(mListType == LIST_TYPE_RUNNING
245309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    ? R.layout.manage_applications_running
246309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    : R.layout.manage_applications_apps, null);
247309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer = mRootView.findViewById(R.id.loading_container);
248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.setVisibility(View.VISIBLE);
249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mListContainer = mRootView.findViewById(R.id.list_container);
250309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mListContainer != null) {
251309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                // Create adapter and list view here
252309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty);
253309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                ListView lv = (ListView) mListContainer.findViewById(android.R.id.list);
254309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (emptyView != null) {
255309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    lv.setEmptyView(emptyView);
256309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
257309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setOnItemClickListener(this);
258309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setSaveEnabled(true);
259309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setItemsCanFocus(true);
260309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setTextFilterEnabled(true);
261309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView = lv;
262309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications = new ApplicationsAdapter(mApplicationsState, this, mFilter);
263309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView.setAdapter(mApplications);
264309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView.setRecyclerListener(mApplications);
265309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar);
266309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel);
267309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText);
268309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText);
269309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false);
270a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (mFilter == FILTER_APPS_SDCARD) {
271a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mStorageChartLabel.setText(mOwner.getActivity().getText(
272a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            R.string.sd_card_storage));
273a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                } else {
274a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mStorageChartLabel.setText(mOwner.getActivity().getText(
275a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            R.string.internal_storage));
276a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                }
277a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                applyCurrentStorage();
278309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
279309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView = (RunningProcessesView)mRootView.findViewById(
280309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    R.id.running_processes);
281309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
282309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mRunningProcessesView.doCreate(mSavedInstanceState);
283309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
284309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
285309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mRootView;
286309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
287309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
288a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public void detachView() {
289a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mRootView != null) {
290a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                ViewGroup group = (ViewGroup)mRootView.getParent();
291a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (group != null) {
292a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    group.removeView(mRootView);
293a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                }
294a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            }
295a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
296a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
297309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void resume(int sortOrder) {
298309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications != null) {
299309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications.resume(sortOrder);
300309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
301309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
302309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                boolean haveData = mRunningProcessesView.doResume(mOwner, mRunningProcessesAvail);
303309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (haveData) {
304309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mRunningProcessesView.setVisibility(View.VISIBLE);
305309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLoadingContainer.setVisibility(View.INVISIBLE);
306309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                } else {
307309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLoadingContainer.setVisibility(View.VISIBLE);
308309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
309309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
310309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
311309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
312309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void pause() {
313309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications != null) {
314309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications.pause();
315309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
316309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
317309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mRunningProcessesView.doPause();
318309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
319309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
320309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
321309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        void updateStorageUsage() {
322309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            // Make sure a callback didn't come at an inopportune time.
323309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mOwner.getActivity() == null) return;
324309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            // Doesn't make sense for stuff that is not an app list.
325309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications == null) return;
326309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
327a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mFreeStorage = 0;
328a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mAppStorage = 0;
329a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTotalStorage = 0;
330309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
331309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mFilter == FILTER_APPS_SDCARD) {
332309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mContainerService != null) {
333309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    try {
334309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        final long[] stats = mContainerService.getFileSystemStats(
335309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                Environment.getExternalStorageDirectory().getPath());
336a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mTotalStorage = stats[0];
337a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mFreeStorage = stats[1];
338309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    } catch (RemoteException e) {
339309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        Log.w(TAG, "Problem in container service", e);
340309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
341309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
342309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
343309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mApplications != null) {
344309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    final int N = mApplications.getCount();
345309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    for (int i=0; i<N; i++) {
346309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
347a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mAppStorage += ae.externalCodeSize + ae.externalDataSize;
348309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
349309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
350309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            } else {
351309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mContainerService != null) {
352309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    try {
353309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        final long[] stats = mContainerService.getFileSystemStats(
354309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                Environment.getDataDirectory().getPath());
355a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mTotalStorage = stats[0];
356a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mFreeStorage = stats[1];
357309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    } catch (RemoteException e) {
358309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        Log.w(TAG, "Problem in container service", e);
359309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
360309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
361309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
362309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                final boolean emulatedStorage = Environment.isExternalStorageEmulated();
363309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mApplications != null) {
364309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    final int N = mApplications.getCount();
365309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    for (int i=0; i<N; i++) {
366309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
367a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mAppStorage += ae.codeSize + ae.dataSize;
368309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        if (emulatedStorage) {
369a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            mAppStorage += ae.externalCodeSize + ae.externalDataSize;
370309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        }
371309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
372309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
373a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mFreeStorage += mApplicationsState.sumCacheSizes();
374309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
375a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
376a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            applyCurrentStorage();
377a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
378a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
379a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        void applyCurrentStorage() {
380a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            // If view hierarchy is not yet created, no views to update.
381a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mRootView == null) {
382a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                return;
383309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
384a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mTotalStorage > 0) {
385a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mColorBar.setRatios((mTotalStorage-mFreeStorage-mAppStorage)/(float)mTotalStorage,
386a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mAppStorage/(float)mTotalStorage, mFreeStorage/(float)mTotalStorage);
387a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                long usedStorage = mTotalStorage - mFreeStorage;
388309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastUsedStorage != usedStorage) {
389309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastUsedStorage = usedStorage;
390309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    String sizeStr = Formatter.formatShortFileSize(
391309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            mOwner.getActivity(), usedStorage);
392309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mUsedStorageText.setText(mOwner.getActivity().getResources().getString(
393309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            R.string.service_foreground_processes, sizeStr));
394309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
395a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (mLastFreeStorage != mFreeStorage) {
396a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mLastFreeStorage = mFreeStorage;
397309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    String sizeStr = Formatter.formatShortFileSize(
398a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            mOwner.getActivity(), mFreeStorage);
399309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mFreeStorageText.setText(mOwner.getActivity().getResources().getString(
400309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            R.string.service_background_processes, sizeStr));
401309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
402309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            } else {
403309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mColorBar.setRatios(0, 0, 0);
404309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastUsedStorage != -1) {
405309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastUsedStorage = -1;
406309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mUsedStorageText.setText("");
407309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
408309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastFreeStorage != -1) {
409309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastFreeStorage = -1;
410309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mFreeStorageText.setText("");
411309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
412309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
413309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
414309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
415309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
416309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
417a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mClickListener.onItemClick(this, parent, view, position, id);
418309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
419309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
420309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        void handleRunningProcessesAvail() {
421309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
422309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mOwner.getActivity(), android.R.anim.fade_out));
423309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation(
424309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mOwner.getActivity(), android.R.anim.fade_in));
425309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView.setVisibility(View.VISIBLE);
426309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.setVisibility(View.GONE);
427309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
428309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
429309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
430309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    TabInfo mCurTab = null;
431309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Size resource used for packages whose size computation failed for some reason
4339244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    CharSequence mInvalidSizeStr;
434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingSizeStr;
435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // layout inflater object used to inflate views
437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LayoutInflater mInflater;
438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
439de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private String mCurrentPkgName;
440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
441ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    private Menu mOptionsMenu;
4427a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
4437a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    // These are for keeping track of activity and spinner switch state.
444728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    private boolean mActivityResumed;
445728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
4467a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_DOWNLOADED = 0;
4477a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_RUNNING = 1;
4487a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_SDCARD = 2;
4497a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_ALL = 3;
450f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
4510385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn    private boolean mShowBackground = false;
4520385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn
4537a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    private int mDefaultListType = -1;
454f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
455309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ViewGroup mContentContainer;
456309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private View mRootView;
457309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ViewPager mViewPager;
458f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
45914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    AlertDialog mResetDialog;
46014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
461309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    class MyPagerAdapter extends PagerAdapter
462309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            implements ViewPager.OnPageChangeListener {
463309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        int mCurPos = 0;
464309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
465309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
466309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public int getCount() {
467309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mTabs.size();
468309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
469309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
470309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
471309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public Object instantiateItem(ViewGroup container, int position) {
472309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = mTabs.get(position);
473309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            View root = tab.build(mInflater, mContentContainer, mRootView);
474309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            container.addView(root);
475309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return root;
476309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
477309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
478309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
479309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void destroyItem(ViewGroup container, int position, Object object) {
480309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            container.removeView((View)object);
481ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn        }
482ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn
483309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
484309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public boolean isViewFromObject(View view, Object object) {
485309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return view == object;
486309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
4877a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
488309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
489309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public CharSequence getPageTitle(int position) {
490309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mTabs.get(position).mLabel;
491309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
492309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
493309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
494309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
495309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
496309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
497309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
498309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageSelected(int position) {
499309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurPos = position;
500309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
501309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
502309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
503309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageScrollStateChanged(int state) {
504309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (state == ViewPager.SCROLL_STATE_IDLE) {
505309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                updateCurrentTab(mCurPos);
506309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
5077a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        }
5087a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    }
5097a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
510e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project    /*
511e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * Custom adapter implementation for the ListView
512e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * This adapter maintains a map for each displayed application and its properties
513e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * An index value on each AppInfo object indicates the correct position or index
514e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * in the list. If the list gets updated dynamically when the user is viewing the list of
515e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * applications, we need to return the correct index of position. This is done by mapping
516e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * the getId methods via the package name into the internal maps and indices.
517e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * The order of applications in the list is mirrored in mAppLocalList
518e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project     */
519309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    static class ApplicationsAdapter extends BaseAdapter implements Filterable,
520e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.Callbacks, AbsListView.RecyclerListener {
521e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ApplicationsState mState;
522309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final ApplicationsState.Session mSession;
523309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final TabInfo mTab;
524309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final Context mContext;
525e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ArrayList<View> mActive = new ArrayList<View>();
526309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final int mFilterMode;
527e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mBaseEntries;
528e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mEntries;
529e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private boolean mResumed;
530309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private int mLastSortMode=-1;
53119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        private boolean mWaitingForData;
532bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        private int mWhichSize = SIZE_TOTAL;
533e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        CharSequence mCurFilterPrefix;
534e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
535e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private Filter mFilter = new Filter() {
536e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
537e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected FilterResults performFiltering(CharSequence constraint) {
538e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> entries
539e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = applyPrefixFilter(constraint, mBaseEntries);
540e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                FilterResults fr = new FilterResults();
541e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.values = entries;
542e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.count = entries.size();
543e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return fr;
544e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            }
545355b32faa924a0b39067dd759ba03e5af97065caSuchi Amalapurapu
546e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
547e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected void publishResults(CharSequence constraint, FilterResults results) {
548e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mCurFilterPrefix = constraint;
549e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values;
550e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                notifyDataSetChanged();
551309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.updateStorageUsage();
552afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
553e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        };
554c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
555309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public ApplicationsAdapter(ApplicationsState state, TabInfo tab, int filterMode) {
556e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mState = state;
557309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mSession = state.newSession(this);
558309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab = tab;
559309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mContext = tab.mOwner.getActivity();
560309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mFilterMode = filterMode;
561c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
562e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
563309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void resume(int sort) {
564e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Resume!  mResumed=" + mResumed);
565e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (!mResumed) {
566e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = true;
567309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mSession.resume();
568e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mLastSortMode = sort;
56919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                rebuild(true);
570e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            } else {
571309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                rebuild(sort);
572c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
573e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project        }
574c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
575e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void pause() {
576e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mResumed) {
577e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = false;
578309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mSession.pause();
579e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
580afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
581b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
582309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void rebuild(int sort) {
583309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (sort == mLastSortMode) {
584e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return;
585e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
586e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mLastSortMode = sort;
58719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            rebuild(true);
588afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
589afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
59019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        public void rebuild(boolean eraseold) {
591e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Rebuilding app list...");
592e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppFilter filterObj;
593e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            Comparator<AppEntry> comparatorObj;
594bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            boolean emulated = Environment.isExternalStorageEmulated();
595bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            if (emulated) {
596bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mWhichSize = SIZE_TOTAL;
597bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            } else {
598bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mWhichSize = SIZE_INTERNAL;
599bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            }
600309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            switch (mFilterMode) {
601e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_THIRD_PARTY:
602e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.THIRD_PARTY_FILTER;
603e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
604e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_SDCARD:
605e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.ON_SD_CARD_FILTER;
606bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                    if (!emulated) {
607bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                        mWhichSize = SIZE_EXTERNAL;
608bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                    }
609e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
610e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
611e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = null;
612e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
613e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
614e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            switch (mLastSortMode) {
615e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case SORT_ORDER_SIZE:
616430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                    switch (mWhichSize) {
617430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        case SIZE_INTERNAL:
618430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR;
619430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
620430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        case SIZE_EXTERNAL:
621430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.EXTERNAL_SIZE_COMPARATOR;
622430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
623430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        default:
624430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.SIZE_COMPARATOR;
625430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
626430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                    }
627e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
628e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
629e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    comparatorObj = ApplicationsState.ALPHA_COMPARATOR;
630e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
631e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
63219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            ArrayList<ApplicationsState.AppEntry> entries
633309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    = mSession.rebuild(filterObj, comparatorObj);
63419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (entries == null && !eraseold) {
63519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                // Don't have new list yet, but can continue using the old one.
63619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                return;
63719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
63819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mBaseEntries = entries;
63919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (mBaseEntries != null) {
64019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
64119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            } else {
64219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mEntries = null;
64319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
644e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            notifyDataSetChanged();
645309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.updateStorageUsage();
64619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
64719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (entries == null) {
64819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mWaitingForData = true;
649309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.setVisibility(View.INVISIBLE);
650309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.setVisibility(View.VISIBLE);
65119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            } else {
652309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.setVisibility(View.VISIBLE);
653309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.setVisibility(View.GONE);
65419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
655afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
656afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
657e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix,
658e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> origEntries) {
659e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (prefix == null || prefix.length() == 0) {
660e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return origEntries;
661afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
662e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                String prefixStr = ApplicationsState.normalize(prefix.toString());
663e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                final String spacePrefixStr = " " + prefixStr;
664e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> newEntries
665e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = new ArrayList<ApplicationsState.AppEntry>();
666e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                for (int i=0; i<origEntries.size(); i++) {
667e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    ApplicationsState.AppEntry entry = origEntries.get(i);
668e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    String nlabel = entry.getNormalizedLabel();
669e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) {
670e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        newEntries.add(entry);
671ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                    }
672ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                }
673e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return newEntries;
674afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
675afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
676ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu
677e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
678e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onRunningStateChanged(boolean running) {
679309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mOwner.getActivity().setProgressBarIndeterminateVisibility(running);
680afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
681b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
682e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
68319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        public void onRebuildComplete(ArrayList<AppEntry> apps) {
684309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mTab.mLoadingContainer.getVisibility() == View.VISIBLE) {
685309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
686309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        mContext, android.R.anim.fade_out));
687309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.startAnimation(AnimationUtils.loadAnimation(
688309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        mContext, android.R.anim.fade_in));
6894e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn            }
690309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mListContainer.setVisibility(View.VISIBLE);
691309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mLoadingContainer.setVisibility(View.GONE);
69219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mWaitingForData = false;
69319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mBaseEntries = apps;
69419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
69519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            notifyDataSetChanged();
696309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.updateStorageUsage();
69719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        }
69819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
69919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        @Override
700e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageListChanged() {
70119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            rebuild(false);
702afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
703b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
704e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
705e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageIconChanged() {
706e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // We ensure icons are loaded when their item is displayed, so
707e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // don't care about icons loaded in the background.
708afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
709b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
710e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
711e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageSizeChanged(String packageName) {
712e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            for (int i=0; i<mActive.size(); i++) {
713e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag();
714e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (holder.entry.info.packageName.equals(packageName)) {
715e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    synchronized (holder.entry) {
716309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
717c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
718309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    if (holder.entry.info.packageName.equals(mTab.mOwner.mCurrentPkgName)
719e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                            && mLastSortMode == SORT_ORDER_SIZE) {
720e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // We got the size information for the last app the
721e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // user viewed, and are sorting by size...  they may
722e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // have cleared data, so we immediately want to resort
723e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // the list with the new size to reflect it to the user.
72419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                        rebuild(false);
725c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
726309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mTab.updateStorageUsage();
727e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    return;
728c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                }
729c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
730c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
731c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
732e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
733e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onAllSizesComputed() {
734e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mLastSortMode == SORT_ORDER_SIZE) {
73519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                rebuild(false);
736afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
737a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTab.updateStorageUsage();
738afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
739afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
740afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int getCount() {
741e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries != null ? mEntries.size() : 0;
742afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
743afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
744afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public Object getItem(int position) {
745e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
746afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
747afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
748e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public ApplicationsState.AppEntry getAppEntry(int position) {
749e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
750afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
751afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
752afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public long getItemId(int position) {
753e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position).id;
754afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
755afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
756afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
757347c9a0544328e65120582834ce330fb0d473f28Jeff Brown            // A ViewHolder keeps references to children views to avoid unnecessary calls
758afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to findViewById() on each row.
759309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            AppViewHolder holder = AppViewHolder.createOrRecycle(mTab.mInflater, convertView);
7609244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            convertView = holder.rootView;
761afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
762afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Bind the data efficiently with the holder
763e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppEntry entry = mEntries.get(position);
764e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            synchronized (entry) {
765e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                holder.entry = entry;
766e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.label != null) {
767e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appName.setText(entry.label);
768309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    holder.appName.setTextColor(mContext.getResources().getColorStateList(
769e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                            entry.info.enabled ? android.R.color.primary_text_dark
7709db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                                    : android.R.color.secondary_text_dark));
771afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
772e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mState.ensureIcon(entry);
773e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.icon != null) {
774e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appIcon.setImageDrawable(entry.icon);
775afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
776309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
77744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                if (InstalledAppDetails.SUPPORT_DISABLE_APPS) {
77844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    holder.disabled.setVisibility(entry.info.enabled ? View.GONE : View.VISIBLE);
77944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                } else {
78044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    holder.disabled.setVisibility(View.GONE);
78144178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                }
782309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mFilterMode == FILTER_APPS_SDCARD) {
7836dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setVisibility(View.VISIBLE);
7846dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setChecked((entry.info.flags
7856dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                            & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
7866dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                } else {
7876dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setVisibility(View.GONE);
7886dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                }
789afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
790e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(convertView);
791e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.add(convertView);
792afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return convertView;
793afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
794c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
795e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
796c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        public Filter getFilter() {
797e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mFilter;
798c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
799c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
800e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
801e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onMovedToScrapHeap(View view) {
802e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(view);
803728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
804728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
805728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
806afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
807f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle savedInstanceState) {
808afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
809f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
810f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        setHasOptionsMenu(true);
811f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
812f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
813f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        Intent intent = getActivity().getIntent();
814ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        String action = intent.getAction();
8157a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        int defaultListType = LIST_TYPE_DOWNLOADED;
816ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        String className = getArguments() != null
817ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                ? getArguments().getString("classname") : null;
818ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (className == null) {
819ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            className = intent.getComponent().getClassName();
820ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
821af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani        if (className.equals(RunningServicesActivity.class.getName())
822af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || className.endsWith(".RunningServices")) {
8237a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_RUNNING;
8245203bdffe6ce2b829d0fab8c7691fa92aca6e972Amith Yamasani        } else if (className.equals(StorageUseActivity.class.getName())
825af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || Intent.ACTION_MANAGE_PACKAGE_STORAGE.equals(action)
826af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || className.endsWith(".StorageUse")) {
827afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSortOrder = SORT_ORDER_SIZE;
828fe4a2bc43f45b14db62c67d7c2531a3d7f1b8590Suchi Amalapurapu            mFilterApps = FILTER_APPS_ALL;
8297a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_ALL;
830762eaa77e3e12d5337ddc9cb87b473c47af5524aKenny Root        } else if (Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)) {
8317a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            // Select the all-apps list, with the default sorting
8327a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_ALL;
833afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
8347a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
835728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (savedInstanceState != null) {
83602c22131e93e1a506141b1890c7134909ded876fAmith Yamasani            mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder);
83702c22131e93e1a506141b1890c7134909ded876fAmith Yamasani            mFilterApps = savedInstanceState.getInt(EXTRA_FILTER_APPS, mFilterApps);
8387a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            int tmp = savedInstanceState.getInt(EXTRA_DEFAULT_LIST_TYPE, -1);
8397a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            if (tmp != -1) defaultListType = tmp;
84002c22131e93e1a506141b1890c7134909ded876fAmith Yamasani            mShowBackground = savedInstanceState.getBoolean(EXTRA_SHOW_BACKGROUND, false);
841728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
8427a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
8437a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        mDefaultListType = defaultListType;
8443b7dbcecf70788df4950340cbf750dbe524dca96Amith Yamasani
84544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        final Intent containerIntent = new Intent().setComponent(
84644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey                StorageMeasurement.DEFAULT_CONTAINER_COMPONENT);
84744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE);
8481337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
849f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
850f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingSizeStr = getActivity().getText(R.string.computing_size);
851f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
852a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        TabInfo tab = new TabInfo(this, mApplicationsState,
853309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_third_party),
854309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_DOWNLOADED, this, savedInstanceState);
855309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
856f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
857309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (!Environment.isExternalStorageEmulated()) {
858a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            tab = new TabInfo(this, mApplicationsState,
859309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    getActivity().getString(R.string.filter_apps_onsdcard),
860309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    LIST_TYPE_SDCARD, this, savedInstanceState);
861309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTabs.add(tab);
862508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
8637a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
864a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        tab = new TabInfo(this, mApplicationsState,
865309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_running),
866309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_RUNNING, this, savedInstanceState);
867309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
8687a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
869a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        tab = new TabInfo(this, mApplicationsState,
870309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_all),
871309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_ALL, this, savedInstanceState);
872309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
873309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
8747a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
8757a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
876309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    @Override
877309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
878309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // initialize the inflater
879309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mInflater = inflater;
8807a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
881309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        View rootView = mInflater.inflate(R.layout.manage_applications_content,
882309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                container, false);
883309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mContentContainer = container;
884309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mRootView = rootView;
8857a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
886309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
887309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        MyPagerAdapter adapter = new MyPagerAdapter();
888309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager.setAdapter(adapter);
889309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager.setOnPageChangeListener(adapter);
890309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs);
891309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        tabs.setTabIndicatorColorResource(android.R.color.holo_blue_light);
8927a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
893a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // We have to do this now because PreferenceFrameLayout looks at it
894a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // only when the view is added.
895a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        if (container instanceof PreferenceFrameLayout) {
896a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true;
897a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
898a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
89914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
90014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            buildResetDialog();
90114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
90214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
903309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        return rootView;
904afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
905f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
906f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    @Override
907728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public void onStart() {
908728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onStart();
909b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu    }
910b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
911afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
912f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onResume() {
913728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onResume();
914728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = true;
915309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        updateCurrentTab(mViewPager.getCurrentItem());
916ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
917afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
918b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
919728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
920f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onSaveInstanceState(Bundle outState) {
921728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onSaveInstanceState(outState);
92202c22131e93e1a506141b1890c7134909ded876fAmith Yamasani        outState.putInt(EXTRA_SORT_ORDER, mSortOrder);
92302c22131e93e1a506141b1890c7134909ded876fAmith Yamasani        outState.putInt(EXTRA_FILTER_APPS, mFilterApps);
9247a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        if (mDefaultListType != -1) {
9257a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            outState.putInt(EXTRA_DEFAULT_LIST_TYPE, mDefaultListType);
926f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
92702c22131e93e1a506141b1890c7134909ded876fAmith Yamasani        outState.putBoolean(EXTRA_SHOW_BACKGROUND, mShowBackground);
92814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog != null) {
92914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            outState.putBoolean(EXTRA_RESET_DIALOG, true);
93014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
931728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
932728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
933728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
934f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onPause() {
935728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onPause();
936728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = false;
937309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
938309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTabs.get(i).pause();
939728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
940728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
941728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
942728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
94314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onStop() {
94414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        super.onStop();
94514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog != null) {
94614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog.dismiss();
94714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = null;
94814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
94914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
95014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
95114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
952a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    public void onDestroyView() {
953a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        super.onDestroyView();
954a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
955a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // We are going to keep the tab data structures around, but they
956a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // are no longer attached to their view hierarchy.
957a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
958a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTabs.get(i).detachView();
959a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
960a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    }
961a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
962a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    @Override
963f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onActivityResult(int requestCode, int resultCode, Intent data) {
964728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
965e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mApplicationsState.requestSize(mCurrentPkgName);
966ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        }
967afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
9687a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
969309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    TabInfo tabForType(int type) {
970309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i = 0; i < mTabs.size(); i++) {
971309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = mTabs.get(i);
972309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (tab.mListType == type) {
973309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                return tab;
974309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
9757a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        }
976309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        return null;
9777a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    }
9787a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
979afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // utility method used to start sub activity
980afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void startApplicationDetailsActivity() {
981f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        // start new fragment to display extended information
982f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        Bundle args = new Bundle();
983f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mCurrentPkgName);
984f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
985f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        PreferenceActivity pa = (PreferenceActivity)getActivity();
986ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        pa.startPreferencePanel(InstalledAppDetails.class.getName(), args,
987ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                R.string.application_info_label, null, this, INSTALLED_APP_DETAILS);
988afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
989afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
990afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
991f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
992ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        Log.i(TAG, "onCreateOptionsMenu in " + this + ": " + menu);
993ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mOptionsMenu = menu;
9940385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn        // note: icons removed for now because the cause the new action
9950385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn        // bar UI to be very confusing.
996afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
9970385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn                //.setIcon(android.R.drawable.ic_menu_sort_alphabetically)
998348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
999afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
10000385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn                //.setIcon(android.R.drawable.ic_menu_sort_by_size)
1001348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1002ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services)
1003ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
1004ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes)
1005ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
100614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        menu.add(0, RESET_APP_PREFERENCES, 4, R.string.reset_app_preferences)
100714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1008ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1009afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1010afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1011afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1012f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onPrepareOptionsMenu(Menu menu) {
1013ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1014ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
1015ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
1016ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    @Override
1017ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onDestroyOptionsMenu() {
1018ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mOptionsMenu = null;
1019ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
102044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
102144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    @Override
102244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    public void onDestroy() {
102344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        getActivity().unbindService(mContainerConnection);
102444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        super.onDestroy();
102544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    }
102644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
1027ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    void updateOptionsMenu() {
1028ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (mOptionsMenu == null) {
1029ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return;
1030ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
1031ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
1032673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root        /*
1033673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         * The running processes screen doesn't use the mApplicationsAdapter
1034673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         * so bringing up this menu in that case doesn't make any sense.
1035673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         */
1036309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (mCurTab != null && mCurTab.mListType == LIST_TYPE_RUNNING) {
1037309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = tabForType(LIST_TYPE_RUNNING);
1038309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            boolean showingBackground = tab != null && tab.mRunningProcessesView != null
1039309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    ? tab.mRunningProcessesView.mAdapter.getShowBackground() : false;
1040ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false);
1041ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false);
1042ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground);
1043ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground);
104414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false);
10451337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else {
1046ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
1047ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
1048ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false);
1049ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false);
105014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(true);
105114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
105214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
105314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
105414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    void buildResetDialog() {
105514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == null) {
105614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
105714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setTitle(R.string.reset_app_preferences_title);
105814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setMessage(R.string.reset_app_preferences_desc);
105914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setPositiveButton(R.string.reset_app_preferences_button, this);
106014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setNegativeButton(R.string.cancel, null);
106114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = builder.show();
106214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog.setOnDismissListener(this);
106314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
106414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
106514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
106614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
106714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onDismiss(DialogInterface dialog) {
106814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == dialog) {
106914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = null;
107014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
107114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
107214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
107314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
107414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
107514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onClick(DialogInterface dialog, int which) {
107614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == dialog) {
107714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final PackageManager pm = getActivity().getPackageManager();
107814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final INotificationManager nm = INotificationManager.Stub.asInterface(
107914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    ServiceManager.getService(Context.NOTIFICATION_SERVICE));
108014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final NetworkPolicyManager npm = NetworkPolicyManager.from(getActivity());
108114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final Handler handler = new Handler(getActivity().getMainLooper());
108214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            (new AsyncTask<Void, Void, Void>() {
108314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                @Override protected Void doInBackground(Void... params) {
108414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    List<ApplicationInfo> apps = pm.getInstalledApplications(
108514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            PackageManager.GET_DISABLED_COMPONENTS);
108614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    for (int i=0; i<apps.size(); i++) {
108714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        ApplicationInfo app = apps.get(i);
108814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        try {
108914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName);
109014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            nm.setNotificationsEnabledForPackage(app.packageName, true);
109114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        } catch (android.os.RemoteException ex) {
109214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
109314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        if (DEBUG) Log.v(TAG, "Clearing preferred: " + app.packageName);
109414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        pm.clearPackagePreferredActivities(app.packageName);
109514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        if (!app.enabled) {
109614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName);
109714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (pm.getApplicationEnabledSetting(app.packageName)
109814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                    == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
109914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                pm.setApplicationEnabledSetting(app.packageName,
110014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                        PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
110114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                        PackageManager.DONT_KILL_APP);
110214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            }
110314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
110414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
110514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    // We should have cleared all of the preferred apps above;
110614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    // just in case some may be lingering, retrieve whatever is
110714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    // still set and remove it.
110814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    ArrayList<IntentFilter> filters = new ArrayList<IntentFilter>();
110914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    ArrayList<ComponentName> prefActivities = new ArrayList<ComponentName>();
111014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    pm.getPreferredActivities(filters, prefActivities, null);
111114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    for (int i=0; i<prefActivities.size(); i++) {
111214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        if (DEBUG) Log.v(TAG, "Clearing preferred: "
111314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                + prefActivities.get(i).getPackageName());
111414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        pm.clearPackagePreferredActivities(prefActivities.get(i).getPackageName());
111514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
111614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    final int[] restrictedAppIds = npm.getAppsWithPolicy(
111714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            POLICY_REJECT_METERED_BACKGROUND);
111814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    for (int i : restrictedAppIds) {
111914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        if (DEBUG) Log.v(TAG, "Clearing data policy: " + i);
112014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        npm.setAppPolicy(i, POLICY_NONE);
112114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
112214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    handler.post(new Runnable() {
112314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        @Override public void run() {
112414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Done clearing");
112514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (getActivity() != null && mActivityResumed) {
112614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                if (DEBUG) Log.v(TAG, "Updating UI!");
1127309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                for (int i=0; i<mTabs.size(); i++) {
1128309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    TabInfo tab = mTabs.get(i);
1129309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    if (tab.mApplications != null) {
1130309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                        tab.mApplications.pause();
1131309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    }
1132309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                }
1133309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                if (mCurTab != null) {
1134309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    mCurTab.resume(mSortOrder);
1135309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                }
113614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            }
113714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
113814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    });
113914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    return null;
114014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                }
114114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            }).execute();
1142673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root        }
1143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
1147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int menuId = item.getItemId();
1148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) {
1149e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mSortOrder = menuId;
1150309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mApplications != null) {
1151309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mApplications.rebuild(mSortOrder);
11521337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            }
11531337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else if (menuId == SHOW_RUNNING_SERVICES) {
11540385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn            mShowBackground = false;
1155309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
1156309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(false);
1157309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
11581337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else if (menuId == SHOW_BACKGROUND_PROCESSES) {
11590385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn            mShowBackground = true;
1160309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
1161309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(true);
1162309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
116314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        } else if (menuId == RESET_APP_PREFERENCES) {
116414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            buildResetDialog();
1165f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani        } else {
1166f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani            // Handle the home button
1167f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani            return false;
1168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1169ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return true;
1171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1172d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn
1173a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    public void onItemClick(TabInfo tab, AdapterView<?> parent, View view, int position,
1174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long id) {
1175a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        if (tab.mApplications != null && tab.mApplications.getCount() > position) {
1176a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            ApplicationsState.AppEntry entry = tab.mApplications.getAppEntry(position);
1177309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurrentPkgName = entry.info.packageName;
1178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            startApplicationDetailsActivity();
11791337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
1180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
11811337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
1182309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public void updateCurrentTab(int position) {
1183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        TabInfo tab = mTabs.get(position);
1184309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mCurTab = tab;
118544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
1186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // Put things in the correct paused/resumed state.
1187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (mActivityResumed) {
1188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.build(mInflater, mContentContainer, mRootView);
1189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.resume(mSortOrder);
11901337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else {
1191309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.pause();
11921337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
1193309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
1194309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo t = mTabs.get(i);
1195309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (t != mCurTab) {
1196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                t.pause();
11971337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            }
11981337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
11991337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
1200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mCurTab.updateStorageUsage();
1201309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        updateOptionsMenu();
1202a31be80ef056add00e0d239414f80f932978277fAdam Powell        final Activity host = getActivity();
1203a31be80ef056add00e0d239414f80f932978277fAdam Powell        if (host != null) {
1204a31be80ef056add00e0d239414f80f932978277fAdam Powell            host.invalidateOptionsMenu();
1205a31be80ef056add00e0d239414f80f932978277fAdam Powell        }
1206e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    }
1207e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
120844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    private volatile IMediaContainerService mContainerService;
120944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
121044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    private final ServiceConnection mContainerConnection = new ServiceConnection() {
121144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        @Override
121244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        public void onServiceConnected(ComponentName name, IBinder service) {
121344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey            mContainerService = IMediaContainerService.Stub.asInterface(service);
1214a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            for (int i=0; i<mTabs.size(); i++) {
1215a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mTabs.get(i).setContainerService(mContainerService);
1216309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
121744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        }
121844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
121944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        @Override
122044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        public void onServiceDisconnected(ComponentName name) {
122144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey            mContainerService = null;
122244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        }
122344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    };
1224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1225