ManageApplications.java revision cc22af08117a2f90d879cc360f76de48fd234e0d
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License.
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport static android.net.NetworkPolicyManager.POLICY_NONE;
2014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
2138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu
22a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.app.Activity;
2338305fb1777147cbcb86774c466e88434daff141Jeff Sharkeyimport android.app.ActivityManager;
2414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.AlertDialog;
25a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackbornimport android.app.AppOpsManager;
26f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment;
2714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.INotificationManager;
2844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ComponentName;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
3014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.DialogInterface;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
3244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ServiceConnection;
3319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport android.content.pm.ApplicationInfo;
346dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.IPackageManager;
356dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.PackageInfo;
3614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.pm.PackageManager;
3714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.net.NetworkPolicyManager;
3814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.AsyncTask;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
401337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.os.Environment;
4114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.Handler;
4244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.os.IBinder;
436dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.RemoteException;
446dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.ServiceManager;
4538305fb1777147cbcb86774c466e88434daff141Jeff Sharkeyimport android.os.UserHandle;
46a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackbornimport android.preference.PreferenceFrameLayout;
47309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerAdapter;
48309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerTabStrip;
49309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.ViewPager;
5037f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglioimport android.text.BidiFormatter;
511337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.text.format.Formatter;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu;
55f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.MenuInflater;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup;
59ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackbornimport android.view.animation.AnimationUtils;
60e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView;
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView;
62a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.widget.AdapterView.OnItemClickListener;
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter;
64c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filter;
65c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filterable;
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView;
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
68b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
6944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.internal.app.IMediaContainerService;
70b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.internal.content.PackageHelper;
71b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.R;
72263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglioimport com.android.settings.SettingsActivity;
73b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.RunningServicesActivity;
74b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.StorageUseActivity;
75b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.applications.ApplicationsState.AppEntry;
7644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.settings.deviceinfo.StorageMeasurement;
77309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport com.android.settings.Utils;
78b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Comparator;
8114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport java.util.List;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
836dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornfinal class CanBeOnSdCardChecker {
846dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    final IPackageManager mPm;
856dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    int mInstallLocation;
866dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
876dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    CanBeOnSdCardChecker() {
886dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mPm = IPackageManager.Stub.asInterface(
896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                ServiceManager.getService("package"));
906dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
916dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
926dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    void init() {
936dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        try {
946dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            mInstallLocation = mPm.getInstallLocation();
956dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        } catch (RemoteException e) {
966dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            Log.e("CanBeOnSdCardChecker", "Is Package Manager running?");
976dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            return;
986dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        }
996dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
1006dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
1016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    boolean check(ApplicationInfo info) {
1026dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        boolean canBe = false;
1036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
1046dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            canBe = true;
1056dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        } else {
1063c24cfed8d5116ff21986acb60a918cb079a0efdKenny Root            if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
1076dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                if (info.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL ||
1086dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        info.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
1096dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    canBe = true;
1106dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                } else if (info.installLocation
1116dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) {
1126dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    if (mInstallLocation == PackageHelper.APP_INSTALL_EXTERNAL) {
1136dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        // For apps with no preference and the default value set
1146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        // to install on sdcard.
1156dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        canBe = true;
1166dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    }
1176dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                }
1186dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            }
1196dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        }
1206dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        return canBe;
1216dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
1226dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn}
1236dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
124a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborninterface AppClickListener {
125a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    void onItemClick(ManageApplications.TabInfo tab, AdapterView<?> parent,
126a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            View view, int position, long id);
127a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn}
128a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to pick an application that will be used to display installation information and
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * options to uninstall/delete user data for system applications. This activity
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * intent.
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
135f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class ManageApplications extends Fragment implements
136a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        AppClickListener, DialogInterface.OnClickListener,
13714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        DialogInterface.OnDismissListener {
13802c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
139e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final String TAG = "ManageApplications";
140e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final boolean DEBUG = false;
14102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
14202c22131e93e1a506141b1890c7134909ded876fAmith Yamasani    private static final String EXTRA_SORT_ORDER = "sortOrder";
14302c22131e93e1a506141b1890c7134909ded876fAmith Yamasani    private static final String EXTRA_SHOW_BACKGROUND = "showBackground";
1447a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    private static final String EXTRA_DEFAULT_LIST_TYPE = "defaultListType";
14514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    private static final String EXTRA_RESET_DIALOG = "resetDialog";
14602c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // attributes used as keys when passing values to InstalledAppDetails activity
14838b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu    public static final String APP_CHG = "chg";
14902c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // constant value that can be used to check return code from sub activity.
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int INSTALLED_APP_DETAILS = 1;
152d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn
153bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_TOTAL = 0;
154bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_INTERNAL = 1;
155bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_EXTERNAL = 2;
156bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order that can be changed through the menu can be sorted alphabetically
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // or size(descending)
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int MENU_OPTIONS_BASE = 0;
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Filter options used for displayed list of applications
1616cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0;
162728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1;
163728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2;
16418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    public static final int FILTER_APPS_DISABLED = MENU_OPTIONS_BASE + 3;
165747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu
1666cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4;
1676cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5;
1681337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6;
1691337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7;
17014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 8;
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private int mSortOrder = SORT_ORDER_ALPHA;
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;
22518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                case LIST_TYPE_DISABLED: mFilter = FILTER_APPS_DISABLED; break;
226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                default: mFilter = FILTER_APPS_ALL; break;
227309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
228309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mClickListener = clickListener;
229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mInvalidSizeStr = owner.getActivity().getText(R.string.invalid_size_value);
230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mComputingSizeStr = owner.getActivity().getText(R.string.computing_size);
231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mSavedInstanceState = savedInstanceState;
232309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
233309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
234a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public void setContainerService(IMediaContainerService containerService) {
235a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mContainerService = containerService;
236a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            updateStorageUsage();
237a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
238a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
239309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public View build(LayoutInflater inflater, ViewGroup contentParent, View contentChild) {
240309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRootView != null) {
241309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                return mRootView;
242309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
243309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mInflater = inflater;
245309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRootView = inflater.inflate(mListType == LIST_TYPE_RUNNING
246309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    ? R.layout.manage_applications_running
247309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    : R.layout.manage_applications_apps, null);
248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer = mRootView.findViewById(R.id.loading_container);
249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.setVisibility(View.VISIBLE);
250309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mListContainer = mRootView.findViewById(R.id.list_container);
251309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mListContainer != null) {
252309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                // Create adapter and list view here
253309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty);
254309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                ListView lv = (ListView) mListContainer.findViewById(android.R.id.list);
255309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (emptyView != null) {
256309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    lv.setEmptyView(emptyView);
257309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
258309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setOnItemClickListener(this);
259309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setSaveEnabled(true);
260309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setItemsCanFocus(true);
261309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setTextFilterEnabled(true);
262309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView = lv;
263309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications = new ApplicationsAdapter(mApplicationsState, this, mFilter);
264309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView.setAdapter(mApplications);
265309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView.setRecyclerListener(mApplications);
266309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar);
267309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel);
268309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText);
269309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText);
270309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false);
271a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (mFilter == FILTER_APPS_SDCARD) {
272a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mStorageChartLabel.setText(mOwner.getActivity().getText(
273a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            R.string.sd_card_storage));
274a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                } else {
275a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mStorageChartLabel.setText(mOwner.getActivity().getText(
276a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            R.string.internal_storage));
277a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                }
278a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                applyCurrentStorage();
279309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
280309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView = (RunningProcessesView)mRootView.findViewById(
281309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    R.id.running_processes);
282309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
283309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mRunningProcessesView.doCreate(mSavedInstanceState);
284309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
285309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
286309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mRootView;
287309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
288309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
289a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public void detachView() {
290a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mRootView != null) {
291a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                ViewGroup group = (ViewGroup)mRootView.getParent();
292a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (group != null) {
293a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    group.removeView(mRootView);
294a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                }
295a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            }
296a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
297a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
298309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void resume(int sortOrder) {
299309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications != null) {
300309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications.resume(sortOrder);
301309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
302309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
303309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                boolean haveData = mRunningProcessesView.doResume(mOwner, mRunningProcessesAvail);
304309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (haveData) {
305309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mRunningProcessesView.setVisibility(View.VISIBLE);
306309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLoadingContainer.setVisibility(View.INVISIBLE);
307309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                } else {
308309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLoadingContainer.setVisibility(View.VISIBLE);
309309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
310309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
311309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
312309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
313309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void pause() {
314309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications != null) {
315309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications.pause();
316309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
317309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
318309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mRunningProcessesView.doPause();
319309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
320309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
321309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
322f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su        public void release() {
323f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su            if (mApplications != null) {
324f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su                mApplications.release();
325f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su            }
326f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su        }
327f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su
328309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        void updateStorageUsage() {
329309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            // Make sure a callback didn't come at an inopportune time.
330309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mOwner.getActivity() == null) return;
331309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            // Doesn't make sense for stuff that is not an app list.
332309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications == null) return;
333309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
334a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mFreeStorage = 0;
335a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mAppStorage = 0;
336a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTotalStorage = 0;
337309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
338309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mFilter == FILTER_APPS_SDCARD) {
339309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mContainerService != null) {
340309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    try {
341309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        final long[] stats = mContainerService.getFileSystemStats(
342309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                Environment.getExternalStorageDirectory().getPath());
343a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mTotalStorage = stats[0];
344a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mFreeStorage = stats[1];
345309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    } catch (RemoteException e) {
346309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        Log.w(TAG, "Problem in container service", e);
347309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
348309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
349309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
350309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mApplications != null) {
351309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    final int N = mApplications.getCount();
352309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    for (int i=0; i<N; i++) {
353309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
3541f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                        mAppStorage += ae.externalCodeSize + ae.externalDataSize
3551f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                                + ae.externalCacheSize;
356309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
357309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
358309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            } else {
359309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mContainerService != null) {
360309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    try {
361309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        final long[] stats = mContainerService.getFileSystemStats(
362309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                Environment.getDataDirectory().getPath());
363a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mTotalStorage = stats[0];
364a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mFreeStorage = stats[1];
365309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    } catch (RemoteException e) {
366309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        Log.w(TAG, "Problem in container service", e);
367309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
368309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
369309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
370309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                final boolean emulatedStorage = Environment.isExternalStorageEmulated();
371309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mApplications != null) {
372309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    final int N = mApplications.getCount();
373309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    for (int i=0; i<N; i++) {
374309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
375a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mAppStorage += ae.codeSize + ae.dataSize;
376309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        if (emulatedStorage) {
377a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            mAppStorage += ae.externalCodeSize + ae.externalDataSize;
378309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        }
379309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
380309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
381a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mFreeStorage += mApplicationsState.sumCacheSizes();
382309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
383a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
384a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            applyCurrentStorage();
385a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
386a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
387a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        void applyCurrentStorage() {
388a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            // If view hierarchy is not yet created, no views to update.
389a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mRootView == null) {
390a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                return;
391309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
392a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mTotalStorage > 0) {
39337f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                BidiFormatter bidiFormatter = BidiFormatter.getInstance();
394a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mColorBar.setRatios((mTotalStorage-mFreeStorage-mAppStorage)/(float)mTotalStorage,
395a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mAppStorage/(float)mTotalStorage, mFreeStorage/(float)mTotalStorage);
396a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                long usedStorage = mTotalStorage - mFreeStorage;
397309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastUsedStorage != usedStorage) {
398309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastUsedStorage = usedStorage;
39937f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                    String sizeStr = bidiFormatter.unicodeWrap(
40037f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                            Formatter.formatShortFileSize(mOwner.getActivity(), usedStorage));
401309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mUsedStorageText.setText(mOwner.getActivity().getResources().getString(
402309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            R.string.service_foreground_processes, sizeStr));
403309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
404a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (mLastFreeStorage != mFreeStorage) {
405a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mLastFreeStorage = mFreeStorage;
40637f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                    String sizeStr = bidiFormatter.unicodeWrap(
40737f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                            Formatter.formatShortFileSize(mOwner.getActivity(), mFreeStorage));
408309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mFreeStorageText.setText(mOwner.getActivity().getResources().getString(
409309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            R.string.service_background_processes, sizeStr));
410309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
411309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            } else {
412309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mColorBar.setRatios(0, 0, 0);
413309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastUsedStorage != -1) {
414309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastUsedStorage = -1;
415309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mUsedStorageText.setText("");
416309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
417309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastFreeStorage != -1) {
418309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastFreeStorage = -1;
419309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mFreeStorageText.setText("");
420309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
421309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
422309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
423309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
424309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
425309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
426a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mClickListener.onItemClick(this, parent, view, position, id);
427309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
428309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
429309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        void handleRunningProcessesAvail() {
430309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
431309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mOwner.getActivity(), android.R.anim.fade_out));
432309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation(
433309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mOwner.getActivity(), android.R.anim.fade_in));
434309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView.setVisibility(View.VISIBLE);
435309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.setVisibility(View.GONE);
436309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
437309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
438309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
43918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    private int mNumTabs;
440309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    TabInfo mCurTab = null;
441309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Size resource used for packages whose size computation failed for some reason
4439244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    CharSequence mInvalidSizeStr;
444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingSizeStr;
445afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // layout inflater object used to inflate views
447afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LayoutInflater mInflater;
448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
449de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private String mCurrentPkgName;
450afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
451ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    private Menu mOptionsMenu;
4527a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
4537a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    // These are for keeping track of activity and spinner switch state.
454728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    private boolean mActivityResumed;
455728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
4567a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_DOWNLOADED = 0;
4577a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_RUNNING = 1;
4587a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_SDCARD = 2;
4597a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_ALL = 3;
46018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    static final int LIST_TYPE_DISABLED = 4;
461f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
4620385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn    private boolean mShowBackground = false;
4630385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn
4647a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    private int mDefaultListType = -1;
465f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
466309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ViewGroup mContentContainer;
467309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private View mRootView;
468309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ViewPager mViewPager;
469f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
47014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    AlertDialog mResetDialog;
47114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
472309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    class MyPagerAdapter extends PagerAdapter
473309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            implements ViewPager.OnPageChangeListener {
474309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        int mCurPos = 0;
475309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
476309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
477309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public int getCount() {
47818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            return mNumTabs;
479309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
480309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
481309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
482309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public Object instantiateItem(ViewGroup container, int position) {
483309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = mTabs.get(position);
484309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            View root = tab.build(mInflater, mContentContainer, mRootView);
485309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            container.addView(root);
48618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            root.setTag(R.id.name, tab);
487309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return root;
488309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
489309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
490309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
491309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void destroyItem(ViewGroup container, int position, Object object) {
492309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            container.removeView((View)object);
493ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn        }
494ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn
495309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
496309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public boolean isViewFromObject(View view, Object object) {
497309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return view == object;
498309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
4997a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
500309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
50118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        public int getItemPosition(Object object) {
50218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            return super.getItemPosition(object);
50318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            //return ((TabInfo)((View)object).getTag(R.id.name)).mListType;
50418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        }
50518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
50618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        @Override
507309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public CharSequence getPageTitle(int position) {
508309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mTabs.get(position).mLabel;
509309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
510309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
511309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
512309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
513309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
514309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
515309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
516309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageSelected(int position) {
517309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurPos = position;
518309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
519309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
520309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
521309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageScrollStateChanged(int state) {
522309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (state == ViewPager.SCROLL_STATE_IDLE) {
523309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                updateCurrentTab(mCurPos);
524309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
5257a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        }
5267a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    }
5277a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
528e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project    /*
529e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * Custom adapter implementation for the ListView
530e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * This adapter maintains a map for each displayed application and its properties
531e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * An index value on each AppInfo object indicates the correct position or index
532e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * in the list. If the list gets updated dynamically when the user is viewing the list of
533e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * applications, we need to return the correct index of position. This is done by mapping
534e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * the getId methods via the package name into the internal maps and indices.
535e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * The order of applications in the list is mirrored in mAppLocalList
536e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project     */
537309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    static class ApplicationsAdapter extends BaseAdapter implements Filterable,
538e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.Callbacks, AbsListView.RecyclerListener {
539e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ApplicationsState mState;
540309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final ApplicationsState.Session mSession;
541309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final TabInfo mTab;
542309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final Context mContext;
543e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ArrayList<View> mActive = new ArrayList<View>();
544309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final int mFilterMode;
545e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mBaseEntries;
546e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mEntries;
547e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private boolean mResumed;
548309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private int mLastSortMode=-1;
54919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        private boolean mWaitingForData;
550bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        private int mWhichSize = SIZE_TOTAL;
551e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        CharSequence mCurFilterPrefix;
552e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
553e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private Filter mFilter = new Filter() {
554e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
555e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected FilterResults performFiltering(CharSequence constraint) {
556e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> entries
557e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = applyPrefixFilter(constraint, mBaseEntries);
558e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                FilterResults fr = new FilterResults();
559e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.values = entries;
560e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.count = entries.size();
561e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return fr;
562e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            }
563355b32faa924a0b39067dd759ba03e5af97065caSuchi Amalapurapu
564e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
565e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected void publishResults(CharSequence constraint, FilterResults results) {
566e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mCurFilterPrefix = constraint;
567e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values;
568e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                notifyDataSetChanged();
569309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.updateStorageUsage();
570afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
571e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        };
572c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
573309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public ApplicationsAdapter(ApplicationsState state, TabInfo tab, int filterMode) {
574e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mState = state;
575309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mSession = state.newSession(this);
576309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab = tab;
577309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mContext = tab.mOwner.getActivity();
578309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mFilterMode = filterMode;
579c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
580e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
581309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void resume(int sort) {
582e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Resume!  mResumed=" + mResumed);
583e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (!mResumed) {
584e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = true;
585309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mSession.resume();
586e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mLastSortMode = sort;
58719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                rebuild(true);
588e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            } else {
589309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                rebuild(sort);
590c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
591e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project        }
592c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
593e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void pause() {
594e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mResumed) {
595e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = false;
596309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mSession.pause();
597e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
598afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
599b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
600f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su        public void release() {
601f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su            mSession.release();
602f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su        }
603f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su
604309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void rebuild(int sort) {
605309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (sort == mLastSortMode) {
606e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return;
607e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
608e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mLastSortMode = sort;
60919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            rebuild(true);
610afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
611afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
61219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        public void rebuild(boolean eraseold) {
613e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Rebuilding app list...");
614e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppFilter filterObj;
615e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            Comparator<AppEntry> comparatorObj;
616bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            boolean emulated = Environment.isExternalStorageEmulated();
617bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            if (emulated) {
618bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mWhichSize = SIZE_TOTAL;
619bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            } else {
620bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mWhichSize = SIZE_INTERNAL;
621bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            }
622309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            switch (mFilterMode) {
623e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_THIRD_PARTY:
624e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.THIRD_PARTY_FILTER;
625e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
626e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_SDCARD:
627e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.ON_SD_CARD_FILTER;
628bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                    if (!emulated) {
629bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                        mWhichSize = SIZE_EXTERNAL;
630bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                    }
631e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
63218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                case FILTER_APPS_DISABLED:
63318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                    filterObj = ApplicationsState.DISABLED_FILTER;
63418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                    break;
635e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
63618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                    filterObj = ApplicationsState.ALL_ENABLED_FILTER;
637e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
638e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
639e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            switch (mLastSortMode) {
640e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case SORT_ORDER_SIZE:
641430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                    switch (mWhichSize) {
642430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        case SIZE_INTERNAL:
643430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR;
644430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
645430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        case SIZE_EXTERNAL:
646430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.EXTERNAL_SIZE_COMPARATOR;
647430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
648430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        default:
649430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.SIZE_COMPARATOR;
650430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
651430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                    }
652e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
653e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
654e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    comparatorObj = ApplicationsState.ALPHA_COMPARATOR;
655e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
656e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
65719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            ArrayList<ApplicationsState.AppEntry> entries
658309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    = mSession.rebuild(filterObj, comparatorObj);
65919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (entries == null && !eraseold) {
66019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                // Don't have new list yet, but can continue using the old one.
66119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                return;
66219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
66319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mBaseEntries = entries;
66419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (mBaseEntries != null) {
66519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
66619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            } else {
66719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mEntries = null;
66819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
669e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            notifyDataSetChanged();
670309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.updateStorageUsage();
67119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
67219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (entries == null) {
67319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mWaitingForData = true;
674309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.setVisibility(View.INVISIBLE);
675309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.setVisibility(View.VISIBLE);
67619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            } else {
677309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.setVisibility(View.VISIBLE);
678309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.setVisibility(View.GONE);
67919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
680afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
681afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
682e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix,
683e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> origEntries) {
684e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (prefix == null || prefix.length() == 0) {
685e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return origEntries;
686afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
687e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                String prefixStr = ApplicationsState.normalize(prefix.toString());
688e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                final String spacePrefixStr = " " + prefixStr;
689e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> newEntries
690e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = new ArrayList<ApplicationsState.AppEntry>();
691e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                for (int i=0; i<origEntries.size(); i++) {
692e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    ApplicationsState.AppEntry entry = origEntries.get(i);
693e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    String nlabel = entry.getNormalizedLabel();
694e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) {
695e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        newEntries.add(entry);
696ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                    }
697ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                }
698e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return newEntries;
699afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
700afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
701ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu
702e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
703e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onRunningStateChanged(boolean running) {
704309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mOwner.getActivity().setProgressBarIndeterminateVisibility(running);
705afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
706b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
707e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
70819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        public void onRebuildComplete(ArrayList<AppEntry> apps) {
709309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mTab.mLoadingContainer.getVisibility() == View.VISIBLE) {
710309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
711309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        mContext, android.R.anim.fade_out));
712309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.startAnimation(AnimationUtils.loadAnimation(
713309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        mContext, android.R.anim.fade_in));
7144e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn            }
715309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mListContainer.setVisibility(View.VISIBLE);
716309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mLoadingContainer.setVisibility(View.GONE);
71719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mWaitingForData = false;
71819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mBaseEntries = apps;
71919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
72019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            notifyDataSetChanged();
721309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.updateStorageUsage();
72219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        }
72319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
72419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        @Override
725e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageListChanged() {
72619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            rebuild(false);
727afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
728b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
729e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
730e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageIconChanged() {
731e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // We ensure icons are loaded when their item is displayed, so
732e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // don't care about icons loaded in the background.
733afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
734b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
735e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
736e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageSizeChanged(String packageName) {
737e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            for (int i=0; i<mActive.size(); i++) {
738e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag();
739e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (holder.entry.info.packageName.equals(packageName)) {
740e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    synchronized (holder.entry) {
741309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
742c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
743309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    if (holder.entry.info.packageName.equals(mTab.mOwner.mCurrentPkgName)
744e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                            && mLastSortMode == SORT_ORDER_SIZE) {
745e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // We got the size information for the last app the
746e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // user viewed, and are sorting by size...  they may
747e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // have cleared data, so we immediately want to resort
748e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // the list with the new size to reflect it to the user.
74919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                        rebuild(false);
750c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
751309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mTab.updateStorageUsage();
752e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    return;
753c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                }
754c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
755c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
756c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
757e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
758e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onAllSizesComputed() {
759e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mLastSortMode == SORT_ORDER_SIZE) {
76019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                rebuild(false);
761afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
762a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTab.updateStorageUsage();
763afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
764afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
765afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int getCount() {
766e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries != null ? mEntries.size() : 0;
767afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
768afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
769afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public Object getItem(int position) {
770e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
771afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
772afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
773e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public ApplicationsState.AppEntry getAppEntry(int position) {
774e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
775afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
776afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
777afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public long getItemId(int position) {
778e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position).id;
779afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
780afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
781afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
782347c9a0544328e65120582834ce330fb0d473f28Jeff Brown            // A ViewHolder keeps references to children views to avoid unnecessary calls
783afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to findViewById() on each row.
784309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            AppViewHolder holder = AppViewHolder.createOrRecycle(mTab.mInflater, convertView);
7859244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            convertView = holder.rootView;
786afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
787afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Bind the data efficiently with the holder
788e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppEntry entry = mEntries.get(position);
789e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            synchronized (entry) {
790e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                holder.entry = entry;
791e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.label != null) {
792e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appName.setText(entry.label);
793afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
794e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mState.ensureIcon(entry);
795e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.icon != null) {
796e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appIcon.setImageDrawable(entry.icon);
797afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
798309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
7993db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                if ((entry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {
8003db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setVisibility(View.VISIBLE);
8013db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setText(R.string.not_installed);
8023db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                } else if (!entry.info.enabled) {
8033db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setVisibility(View.VISIBLE);
8043db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setText(R.string.disabled);
80544178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                } else {
80644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    holder.disabled.setVisibility(View.GONE);
80744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                }
808309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mFilterMode == FILTER_APPS_SDCARD) {
8096dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setVisibility(View.VISIBLE);
8106dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setChecked((entry.info.flags
8116dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                            & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
8126dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                } else {
8136dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setVisibility(View.GONE);
8146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                }
815afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
816e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(convertView);
817e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.add(convertView);
818afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return convertView;
819afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
820c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
821e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
822c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        public Filter getFilter() {
823e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mFilter;
824c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
825c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
826e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
827e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onMovedToScrapHeap(View view) {
828e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(view);
829728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
830728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
831728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
832afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
833f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle savedInstanceState) {
834afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
835f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
836f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        setHasOptionsMenu(true);
837f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
838f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
839f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        Intent intent = getActivity().getIntent();
840ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        String action = intent.getAction();
8417a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        int defaultListType = LIST_TYPE_DOWNLOADED;
842ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        String className = getArguments() != null
843ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                ? getArguments().getString("classname") : null;
844ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (className == null) {
845ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            className = intent.getComponent().getClassName();
846ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
847af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani        if (className.equals(RunningServicesActivity.class.getName())
848af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || className.endsWith(".RunningServices")) {
8497a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_RUNNING;
8505203bdffe6ce2b829d0fab8c7691fa92aca6e972Amith Yamasani        } else if (className.equals(StorageUseActivity.class.getName())
851af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || Intent.ACTION_MANAGE_PACKAGE_STORAGE.equals(action)
852af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || className.endsWith(".StorageUse")) {
853afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSortOrder = SORT_ORDER_SIZE;
8547a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_ALL;
855263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio        } else if (android.provider.Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)) {
8567a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            // Select the all-apps list, with the default sorting
8577a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_ALL;
858afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
8597a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
860728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (savedInstanceState != null) {
86102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani            mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder);
8627a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            int tmp = savedInstanceState.getInt(EXTRA_DEFAULT_LIST_TYPE, -1);
8637a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            if (tmp != -1) defaultListType = tmp;
86402c22131e93e1a506141b1890c7134909ded876fAmith Yamasani            mShowBackground = savedInstanceState.getBoolean(EXTRA_SHOW_BACKGROUND, false);
865728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
8667a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
8677a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        mDefaultListType = defaultListType;
8683b7dbcecf70788df4950340cbf750dbe524dca96Amith Yamasani
86944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        final Intent containerIntent = new Intent().setComponent(
87044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey                StorageMeasurement.DEFAULT_CONTAINER_COMPONENT);
87144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE);
8721337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
873f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
874f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingSizeStr = getActivity().getText(R.string.computing_size);
875f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
876a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        TabInfo tab = new TabInfo(this, mApplicationsState,
877309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_third_party),
878309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_DOWNLOADED, this, savedInstanceState);
879309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
880f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
881309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (!Environment.isExternalStorageEmulated()) {
882a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            tab = new TabInfo(this, mApplicationsState,
883309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    getActivity().getString(R.string.filter_apps_onsdcard),
884309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    LIST_TYPE_SDCARD, this, savedInstanceState);
885309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTabs.add(tab);
886508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
8877a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
888a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        tab = new TabInfo(this, mApplicationsState,
889309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_running),
890309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_RUNNING, this, savedInstanceState);
891309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
8927a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
893a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        tab = new TabInfo(this, mApplicationsState,
894309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_all),
895309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_ALL, this, savedInstanceState);
896309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
89718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
89818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        tab = new TabInfo(this, mApplicationsState,
89918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                getActivity().getString(R.string.filter_apps_disabled),
90018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                LIST_TYPE_DISABLED, this, savedInstanceState);
90118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        mTabs.add(tab);
90218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
90318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        mNumTabs = mTabs.size();
904309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
9057a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
9067a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
907309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    @Override
908309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
909309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // initialize the inflater
910309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mInflater = inflater;
9117a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
912309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        View rootView = mInflater.inflate(R.layout.manage_applications_content,
913309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                container, false);
914309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mContentContainer = container;
915309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mRootView = rootView;
9167a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
917309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
918309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        MyPagerAdapter adapter = new MyPagerAdapter();
919309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager.setAdapter(adapter);
920309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager.setOnPageChangeListener(adapter);
921309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs);
922cc22af08117a2f90d879cc360f76de48fd234e0dFabrice Di Meglio        tabs.setTabIndicatorColorResource(R.color.theme_accent);
9237a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
924a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // We have to do this now because PreferenceFrameLayout looks at it
925a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // only when the view is added.
926a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        if (container instanceof PreferenceFrameLayout) {
927a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true;
928a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
929a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
93014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
93114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            buildResetDialog();
93214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
93314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
93413ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn        if (savedInstanceState == null) {
93513ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            // First time init: make sure view pager is showing the correct tab.
93613ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            for (int i = 0; i < mTabs.size(); i++) {
93713ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                TabInfo tab = mTabs.get(i);
93813ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                if (tab.mListType == mDefaultListType) {
93913ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                    mViewPager.setCurrentItem(i);
94013ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                    break;
94113ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                }
94213ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            }
94313ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn        }
94413ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn
945309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        return rootView;
946afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
947f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
948f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    @Override
949728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public void onStart() {
950728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onStart();
951b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu    }
952b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
953afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
954f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onResume() {
955728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onResume();
956728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = true;
957309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        updateCurrentTab(mViewPager.getCurrentItem());
958f5f08628cc0129e92277d6ddfcf6ae680887573dDianne Hackborn        updateNumTabs();
959ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
960afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
961b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
962728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
963f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onSaveInstanceState(Bundle outState) {
964728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onSaveInstanceState(outState);
96502c22131e93e1a506141b1890c7134909ded876fAmith Yamasani        outState.putInt(EXTRA_SORT_ORDER, mSortOrder);
9667a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        if (mDefaultListType != -1) {
9677a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            outState.putInt(EXTRA_DEFAULT_LIST_TYPE, mDefaultListType);
968f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
96902c22131e93e1a506141b1890c7134909ded876fAmith Yamasani        outState.putBoolean(EXTRA_SHOW_BACKGROUND, mShowBackground);
97014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog != null) {
97114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            outState.putBoolean(EXTRA_RESET_DIALOG, true);
97214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
973728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
974728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
975728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
976f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onPause() {
977728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onPause();
978728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = false;
979309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
980309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTabs.get(i).pause();
981728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
982728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
983728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
984728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
98514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onStop() {
98614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        super.onStop();
98714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog != null) {
98814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog.dismiss();
98914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = null;
99014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
99114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
99214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
99314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
994a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    public void onDestroyView() {
995a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        super.onDestroyView();
996a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
997a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // We are going to keep the tab data structures around, but they
998a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // are no longer attached to their view hierarchy.
999a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
1000a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTabs.get(i).detachView();
1001f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su            mTabs.get(i).release();
1002a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
1003a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    }
1004a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
1005a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    @Override
1006f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onActivityResult(int requestCode, int resultCode, Intent data) {
1007728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
1008e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mApplicationsState.requestSize(mCurrentPkgName);
1009ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        }
1010afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
10117a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
101218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    private void updateNumTabs() {
101318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        int newNum = mApplicationsState.haveDisabledApps() ? mTabs.size() : (mTabs.size()-1);
101418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        if (newNum != mNumTabs) {
101518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            mNumTabs = newNum;
101618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            if (mViewPager != null) {
101718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                mViewPager.getAdapter().notifyDataSetChanged();
101818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            }
101918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        }
102018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    }
102118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
1022309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    TabInfo tabForType(int type) {
1023309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i = 0; i < mTabs.size(); i++) {
1024309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = mTabs.get(i);
1025309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (tab.mListType == type) {
1026309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                return tab;
1027309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
10287a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        }
1029309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        return null;
10307a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    }
10317a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
1032afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // utility method used to start sub activity
1033afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void startApplicationDetailsActivity() {
1034f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        // start new fragment to display extended information
1035f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        Bundle args = new Bundle();
1036f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mCurrentPkgName);
1037f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
1038263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio        SettingsActivity sa = (SettingsActivity) getActivity();
1039263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio        sa.startPreferencePanel(InstalledAppDetails.class.getName(), args,
1040ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                R.string.application_info_label, null, this, INSTALLED_APP_DETAILS);
1041afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1042afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1043afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1044f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
1045ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mOptionsMenu = menu;
10460385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn        // note: icons removed for now because the cause the new action
10470385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn        // bar UI to be very confusing.
1048afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
10490385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn                //.setIcon(android.R.drawable.ic_menu_sort_alphabetically)
1050348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1051afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
10520385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn                //.setIcon(android.R.drawable.ic_menu_sort_by_size)
1053348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1054ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services)
1055ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
1056ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes)
1057ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
105814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        menu.add(0, RESET_APP_PREFERENCES, 4, R.string.reset_app_preferences)
105914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1060ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1061afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1062afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1063afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1064f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onPrepareOptionsMenu(Menu menu) {
1065ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1066ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
1067ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
1068ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    @Override
1069ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onDestroyOptionsMenu() {
1070ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mOptionsMenu = null;
1071ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
107244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
107344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    @Override
107444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    public void onDestroy() {
107544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        getActivity().unbindService(mContainerConnection);
107644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        super.onDestroy();
107744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    }
107844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
1079ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    void updateOptionsMenu() {
1080ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (mOptionsMenu == null) {
1081ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return;
1082ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
1083ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
1084673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root        /*
1085673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         * The running processes screen doesn't use the mApplicationsAdapter
1086673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         * so bringing up this menu in that case doesn't make any sense.
1087673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         */
1088309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (mCurTab != null && mCurTab.mListType == LIST_TYPE_RUNNING) {
1089309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = tabForType(LIST_TYPE_RUNNING);
1090309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            boolean showingBackground = tab != null && tab.mRunningProcessesView != null
1091309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    ? tab.mRunningProcessesView.mAdapter.getShowBackground() : false;
1092ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false);
1093ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false);
1094ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground);
1095ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground);
109614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false);
1097eca1fc2cadb9c1f15ab042e2080a8b8eb40ab6faThiago Vinícius Freire de Araújo Ribeiro            mShowBackground = showingBackground;
10981337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else {
1099ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
1100ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
1101ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false);
1102ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false);
110314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(true);
110414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
110514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
110614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
110714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    void buildResetDialog() {
110814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == null) {
110914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
111014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setTitle(R.string.reset_app_preferences_title);
111114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setMessage(R.string.reset_app_preferences_desc);
111214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setPositiveButton(R.string.reset_app_preferences_button, this);
111314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setNegativeButton(R.string.cancel, null);
111414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = builder.show();
111514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog.setOnDismissListener(this);
111614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
111714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
111814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
111914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
112014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onDismiss(DialogInterface dialog) {
112114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == dialog) {
112214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = null;
112314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
112414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
112514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
112614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
112714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
112814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onClick(DialogInterface dialog, int which) {
112914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == dialog) {
113014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final PackageManager pm = getActivity().getPackageManager();
1131596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn            final IPackageManager mIPm = IPackageManager.Stub.asInterface(
1132a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn                    ServiceManager.getService("package"));
113314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final INotificationManager nm = INotificationManager.Stub.asInterface(
113414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    ServiceManager.getService(Context.NOTIFICATION_SERVICE));
113514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final NetworkPolicyManager npm = NetworkPolicyManager.from(getActivity());
1136a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn            final AppOpsManager aom = (AppOpsManager)getActivity().getSystemService(
1137a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn                    Context.APP_OPS_SERVICE);
113814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final Handler handler = new Handler(getActivity().getMainLooper());
113914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            (new AsyncTask<Void, Void, Void>() {
114014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                @Override protected Void doInBackground(Void... params) {
114114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    List<ApplicationInfo> apps = pm.getInstalledApplications(
114214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            PackageManager.GET_DISABLED_COMPONENTS);
114314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    for (int i=0; i<apps.size(); i++) {
114414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        ApplicationInfo app = apps.get(i);
114514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        try {
114614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName);
1147df3f6d6c4722a7acc8189e47d0499aaf618969f9Daniel Sandler                            nm.setNotificationsEnabledForPackage(app.packageName, app.uid, true);
114814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        } catch (android.os.RemoteException ex) {
114914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
115014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        if (!app.enabled) {
115114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName);
115214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (pm.getApplicationEnabledSetting(app.packageName)
115314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                    == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
115414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                pm.setApplicationEnabledSetting(app.packageName,
115514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                        PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
115614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                        PackageManager.DONT_KILL_APP);
115714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            }
115814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
115914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
1160596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn                    try {
1161596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn                        mIPm.resetPreferredActivities(UserHandle.myUserId());
1162596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn                    } catch (RemoteException e) {
116314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
1164a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn                    aom.resetAllModes();
116538305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    final int[] restrictedUids = npm.getUidsWithPolicy(
116614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            POLICY_REJECT_METERED_BACKGROUND);
116738305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    final int currentUserId = ActivityManager.getCurrentUser();
116838305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    for (int uid : restrictedUids) {
116938305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        // Only reset for current user
117038305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        if (UserHandle.getUserId(uid) == currentUserId) {
117138305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                            if (DEBUG) Log.v(TAG, "Clearing data policy: " + uid);
117238305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                            npm.setUidPolicy(uid, POLICY_NONE);
117338305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        }
117414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
117514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    handler.post(new Runnable() {
117614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        @Override public void run() {
117714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Done clearing");
117814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (getActivity() != null && mActivityResumed) {
117914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                if (DEBUG) Log.v(TAG, "Updating UI!");
1180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                for (int i=0; i<mTabs.size(); i++) {
1181309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    TabInfo tab = mTabs.get(i);
1182309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    if (tab.mApplications != null) {
1183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                        tab.mApplications.pause();
1184309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    }
1185309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                }
1186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                if (mCurTab != null) {
1187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    mCurTab.resume(mSortOrder);
1188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                }
118914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            }
119014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
119114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    });
119214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    return null;
119314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                }
119414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            }).execute();
1195673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root        }
1196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
1200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int menuId = item.getItemId();
1201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) {
1202e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mSortOrder = menuId;
1203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mApplications != null) {
1204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mApplications.rebuild(mSortOrder);
12051337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            }
12061337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else if (menuId == SHOW_RUNNING_SERVICES) {
12070385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn            mShowBackground = false;
1208309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
1209309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(false);
1210309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
12111337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else if (menuId == SHOW_BACKGROUND_PROCESSES) {
12120385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn            mShowBackground = true;
1213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
1214309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(true);
1215309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
121614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        } else if (menuId == RESET_APP_PREFERENCES) {
121714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            buildResetDialog();
1218f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani        } else {
1219f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani            // Handle the home button
1220f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani            return false;
1221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1222ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return true;
1224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1225d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn
1226a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    public void onItemClick(TabInfo tab, AdapterView<?> parent, View view, int position,
1227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long id) {
1228a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        if (tab.mApplications != null && tab.mApplications.getCount() > position) {
1229a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            ApplicationsState.AppEntry entry = tab.mApplications.getAppEntry(position);
1230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurrentPkgName = entry.info.packageName;
1231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            startApplicationDetailsActivity();
12321337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
1233309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
12341337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
1235309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public void updateCurrentTab(int position) {
1236309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        TabInfo tab = mTabs.get(position);
1237309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mCurTab = tab;
123844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
1239309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // Put things in the correct paused/resumed state.
1240309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (mActivityResumed) {
1241309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.build(mInflater, mContentContainer, mRootView);
1242309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.resume(mSortOrder);
12431337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else {
1244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.pause();
12451337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
1246309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
1247309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo t = mTabs.get(i);
1248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (t != mCurTab) {
1249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                t.pause();
12501337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            }
12511337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
12521337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
1253309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mCurTab.updateStorageUsage();
1254309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        updateOptionsMenu();
1255a31be80ef056add00e0d239414f80f932978277fAdam Powell        final Activity host = getActivity();
1256a31be80ef056add00e0d239414f80f932978277fAdam Powell        if (host != null) {
1257a31be80ef056add00e0d239414f80f932978277fAdam Powell            host.invalidateOptionsMenu();
1258a31be80ef056add00e0d239414f80f932978277fAdam Powell        }
1259e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    }
1260e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
126144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    private volatile IMediaContainerService mContainerService;
126244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
126344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    private final ServiceConnection mContainerConnection = new ServiceConnection() {
126444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        @Override
126544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        public void onServiceConnected(ComponentName name, IBinder service) {
126644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey            mContainerService = IMediaContainerService.Stub.asInterface(service);
1267a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            for (int i=0; i<mTabs.size(); i++) {
1268a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mTabs.get(i).setContainerService(mContainerService);
1269309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
127044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        }
127144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
127244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        @Override
127344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        public void onServiceDisconnected(ComponentName name) {
127444dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey            mContainerService = null;
127544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        }
127644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    };
1277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1278