1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License.
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport static android.net.NetworkPolicyManager.POLICY_NONE;
2014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
2138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu
22a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.app.Activity;
2338305fb1777147cbcb86774c466e88434daff141Jeff Sharkeyimport android.app.ActivityManager;
2414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.AlertDialog;
25a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackbornimport android.app.AppOpsManager;
26f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment;
2714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.app.INotificationManager;
2844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ComponentName;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
3014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.DialogInterface;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
3244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.content.ServiceConnection;
3319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport android.content.pm.ApplicationInfo;
346dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.IPackageManager;
356dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.content.pm.PackageInfo;
3614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.content.pm.PackageManager;
3714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.net.NetworkPolicyManager;
3814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.AsyncTask;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
401337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackbornimport android.os.Environment;
4114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport android.os.Handler;
4244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport android.os.IBinder;
436dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.RemoteException;
446dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornimport android.os.ServiceManager;
4538305fb1777147cbcb86774c466e88434daff141Jeff Sharkeyimport android.os.UserHandle;
46c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport android.os.UserManager;
47a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackbornimport android.preference.PreferenceFrameLayout;
48c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport android.provider.Settings;
49309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerAdapter;
50309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.PagerTabStrip;
51309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport android.support.v4.view.ViewPager;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu;
55f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.MenuInflater;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup;
59ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackbornimport android.view.animation.AnimationUtils;
60e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView;
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView;
62a31be80ef056add00e0d239414f80f932978277fAdam Powellimport android.widget.AdapterView.OnItemClickListener;
63c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport android.widget.AdapterView.OnItemSelectedListener;
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter;
65c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filter;
66c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filterable;
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView;
68c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport android.widget.Spinner;
69b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
7044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.internal.app.IMediaContainerService;
71b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.internal.content.PackageHelper;
72b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.R;
73263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglioimport com.android.settings.SettingsActivity;
74c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghinaimport com.android.settings.UserSpinnerAdapter;
75b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.RunningServicesActivity;
76b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.Settings.StorageUseActivity;
77b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkeyimport com.android.settings.applications.ApplicationsState.AppEntry;
7844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkeyimport com.android.settings.deviceinfo.StorageMeasurement;
79309c5dcee18ced447d049d5de882a9586694e04cDianne Hackbornimport com.android.settings.Utils;
80b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Comparator;
8314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackbornimport java.util.List;
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
856dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackbornfinal class CanBeOnSdCardChecker {
866dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    final IPackageManager mPm;
876dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    int mInstallLocation;
886dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    CanBeOnSdCardChecker() {
906dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mPm = IPackageManager.Stub.asInterface(
916dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                ServiceManager.getService("package"));
926dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
936dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
946dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    void init() {
956dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        try {
966dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            mInstallLocation = mPm.getInstallLocation();
976dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        } catch (RemoteException e) {
986dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            Log.e("CanBeOnSdCardChecker", "Is Package Manager running?");
996dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            return;
1006dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        }
1016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
1026dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
1036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    boolean check(ApplicationInfo info) {
1046dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        boolean canBe = false;
1056dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
1066dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            canBe = true;
1076dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        } else {
1083c24cfed8d5116ff21986acb60a918cb079a0efdKenny Root            if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
1096dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                if (info.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL ||
1106dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        info.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
1116dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    canBe = true;
1126dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                } else if (info.installLocation
1136dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) {
1146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    if (mInstallLocation == PackageHelper.APP_INSTALL_EXTERNAL) {
1156dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        // For apps with no preference and the default value set
1166dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        // to install on sdcard.
1176dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                        canBe = true;
1186dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    }
1196dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                }
1206dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            }
1216dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        }
1226dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        return canBe;
1236dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    }
1246dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn}
1256dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
126a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborninterface AppClickListener {
127a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    void onItemClick(ManageApplications.TabInfo tab, AdapterView<?> parent,
128a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            View view, int position, long id);
129a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn}
130a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to pick an application that will be used to display installation information and
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * options to uninstall/delete user data for system applications. This activity
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * intent.
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
137f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class ManageApplications extends Fragment implements
138a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        AppClickListener, DialogInterface.OnClickListener,
139c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        DialogInterface.OnDismissListener, OnItemSelectedListener  {
14002c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
141e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final String TAG = "ManageApplications";
142e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final boolean DEBUG = false;
14302c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
144f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina    private static final String EXTRA_LIST_TYPE = "currentListType";
14502c22131e93e1a506141b1890c7134909ded876fAmith Yamasani    private static final String EXTRA_SORT_ORDER = "sortOrder";
14602c22131e93e1a506141b1890c7134909ded876fAmith Yamasani    private static final String EXTRA_SHOW_BACKGROUND = "showBackground";
1477a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    private static final String EXTRA_DEFAULT_LIST_TYPE = "defaultListType";
14814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    private static final String EXTRA_RESET_DIALOG = "resetDialog";
14902c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // attributes used as keys when passing values to InstalledAppDetails activity
15138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu    public static final String APP_CHG = "chg";
15202c22131e93e1a506141b1890c7134909ded876fAmith Yamasani
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // constant value that can be used to check return code from sub activity.
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int INSTALLED_APP_DETAILS = 1;
155d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn
156bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_TOTAL = 0;
157bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_INTERNAL = 1;
158bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    public static final int SIZE_EXTERNAL = 2;
159bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order that can be changed through the menu can be sorted alphabetically
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // or size(descending)
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int MENU_OPTIONS_BASE = 0;
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Filter options used for displayed list of applications
1646cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0;
165728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1;
166728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2;
16718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    public static final int FILTER_APPS_DISABLED = MENU_OPTIONS_BASE + 3;
168747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu
1696cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4;
1706cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5;
1711337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6;
1721337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7;
17314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 8;
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private int mSortOrder = SORT_ORDER_ALPHA;
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
177e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    private ApplicationsState mApplicationsState;
178309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
179309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public static class TabInfo implements OnItemClickListener {
180309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final ManageApplications mOwner;
181309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final ApplicationsState mApplicationsState;
182309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mLabel;
183309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final int mListType;
184309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final int mFilter;
185a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public final AppClickListener mClickListener;
186309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mInvalidSizeStr;
187309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public final CharSequence mComputingSizeStr;
188309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final Bundle mSavedInstanceState;
189309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
190309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public ApplicationsAdapter mApplications;
191309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public LayoutInflater mInflater;
192309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public View mRootView;
193309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
194a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        private IMediaContainerService mContainerService;
195a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
196309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private View mLoadingContainer;
197309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
198309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private View mListContainer;
199309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
200309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // ListView used to display list
201309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private ListView mListView;
202309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // Custom view used to display running processes
203309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private RunningProcessesView mRunningProcessesView;
204309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
205fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn        //private LinearColorBar mColorBar;
206fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn        //private TextView mStorageChartLabel;
207fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn        //private TextView mUsedStorageText;
208fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn        //private TextView mFreeStorageText;
209a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        private long mFreeStorage = 0, mAppStorage = 0, mTotalStorage = 0;
210309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage;
211309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
212309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        final Runnable mRunningProcessesAvail = new Runnable() {
213309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            public void run() {
214309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                handleRunningProcessesAvail();
215309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
216309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        };
217309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
218309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public TabInfo(ManageApplications owner, ApplicationsState apps,
219a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                CharSequence label, int listType, AppClickListener clickListener,
220309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                Bundle savedInstanceState) {
221309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mOwner = owner;
222309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mApplicationsState = apps;
223309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLabel = label;
224309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mListType = listType;
225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            switch (listType) {
226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                case LIST_TYPE_DOWNLOADED: mFilter = FILTER_APPS_THIRD_PARTY; break;
227309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                case LIST_TYPE_SDCARD: mFilter = FILTER_APPS_SDCARD; break;
22818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                case LIST_TYPE_DISABLED: mFilter = FILTER_APPS_DISABLED; break;
229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                default: mFilter = FILTER_APPS_ALL; break;
230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mClickListener = clickListener;
232309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mInvalidSizeStr = owner.getActivity().getText(R.string.invalid_size_value);
233309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mComputingSizeStr = owner.getActivity().getText(R.string.computing_size);
234309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mSavedInstanceState = savedInstanceState;
235309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
236309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
237a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public void setContainerService(IMediaContainerService containerService) {
238a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mContainerService = containerService;
239a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            updateStorageUsage();
240a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
241a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
242309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public View build(LayoutInflater inflater, ViewGroup contentParent, View contentChild) {
243309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRootView != null) {
244309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                return mRootView;
245309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
246309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mInflater = inflater;
247309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRootView = inflater.inflate(mListType == LIST_TYPE_RUNNING
248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    ? R.layout.manage_applications_running
249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    : R.layout.manage_applications_apps, null);
250309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer = mRootView.findViewById(R.id.loading_container);
251309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.setVisibility(View.VISIBLE);
252309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mListContainer = mRootView.findViewById(R.id.list_container);
253309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mListContainer != null) {
254309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                // Create adapter and list view here
255309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty);
256309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                ListView lv = (ListView) mListContainer.findViewById(android.R.id.list);
257309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (emptyView != null) {
258309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    lv.setEmptyView(emptyView);
259309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
260309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setOnItemClickListener(this);
261309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setSaveEnabled(true);
262309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setItemsCanFocus(true);
263309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                lv.setTextFilterEnabled(true);
264309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView = lv;
265309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications = new ApplicationsAdapter(mApplicationsState, this, mFilter);
266309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView.setAdapter(mApplications);
267309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mListView.setRecyclerListener(mApplications);
268fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                //mColorBar = (LinearColorBar)mListContainer.findViewById(R.id.storage_color_bar);
269fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                //mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel);
270fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                //mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText);
271fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                //mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText);
272309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false);
273a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (mFilter == FILTER_APPS_SDCARD) {
274fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                    //mStorageChartLabel.setText(mOwner.getActivity().getText(
275fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                    //        R.string.sd_card_storage));
276a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                } else {
277fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                    //mStorageChartLabel.setText(mOwner.getActivity().getText(
278fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn                    //        R.string.internal_storage));
279a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                }
280a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                applyCurrentStorage();
281309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
282309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView = (RunningProcessesView)mRootView.findViewById(
283309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    R.id.running_processes);
284309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
285309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mRunningProcessesView.doCreate(mSavedInstanceState);
286309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
287309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
288309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mRootView;
289309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
290309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
291a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        public void detachView() {
292a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mRootView != null) {
293a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                ViewGroup group = (ViewGroup)mRootView.getParent();
294a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (group != null) {
295a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    group.removeView(mRootView);
296a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                }
297a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            }
298a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
299a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
300309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void resume(int sortOrder) {
301309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications != null) {
302309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications.resume(sortOrder);
303309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
304309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
305309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                boolean haveData = mRunningProcessesView.doResume(mOwner, mRunningProcessesAvail);
306309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (haveData) {
307309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mRunningProcessesView.setVisibility(View.VISIBLE);
308309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLoadingContainer.setVisibility(View.INVISIBLE);
309309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                } else {
310309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLoadingContainer.setVisibility(View.VISIBLE);
311309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
312309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
313309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
314309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
315309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void pause() {
316309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications != null) {
317309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mApplications.pause();
318309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
319309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mRunningProcessesView != null) {
320309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mRunningProcessesView.doPause();
321309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
322309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
323309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
324f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su        public void release() {
325f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su            if (mApplications != null) {
326f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su                mApplications.release();
327f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su            }
328f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su        }
329f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su
330309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        void updateStorageUsage() {
331309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            // Make sure a callback didn't come at an inopportune time.
332309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mOwner.getActivity() == null) return;
333309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            // Doesn't make sense for stuff that is not an app list.
334309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mApplications == null) return;
335309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
336a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mFreeStorage = 0;
337a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mAppStorage = 0;
338a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTotalStorage = 0;
339309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
340309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mFilter == FILTER_APPS_SDCARD) {
341309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mContainerService != null) {
342309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    try {
343309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        final long[] stats = mContainerService.getFileSystemStats(
344309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                Environment.getExternalStorageDirectory().getPath());
345a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mTotalStorage = stats[0];
346a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mFreeStorage = stats[1];
347309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    } catch (RemoteException e) {
348309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        Log.w(TAG, "Problem in container service", e);
349309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
350309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
351309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
352309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mApplications != null) {
353309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    final int N = mApplications.getCount();
354309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    for (int i=0; i<N; i++) {
355309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
3561f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                        mAppStorage += ae.externalCodeSize + ae.externalDataSize
3571f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                                + ae.externalCacheSize;
358309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
359309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
360309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            } else {
361309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mContainerService != null) {
362309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    try {
363309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        final long[] stats = mContainerService.getFileSystemStats(
364309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                Environment.getDataDirectory().getPath());
365a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mTotalStorage = stats[0];
366a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mFreeStorage = stats[1];
367309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    } catch (RemoteException e) {
368309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        Log.w(TAG, "Problem in container service", e);
369309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
370309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
371309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
372309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                final boolean emulatedStorage = Environment.isExternalStorageEmulated();
373309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mApplications != null) {
374309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    final int N = mApplications.getCount();
375309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    for (int i=0; i<N; i++) {
376309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
377a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mAppStorage += ae.codeSize + ae.dataSize;
378309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        if (emulatedStorage) {
379a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                            mAppStorage += ae.externalCodeSize + ae.externalDataSize;
380309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        }
381309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    }
382309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
383a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mFreeStorage += mApplicationsState.sumCacheSizes();
384309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
385a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
386a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            applyCurrentStorage();
387a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
388a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
389a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        void applyCurrentStorage() {
390a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            // If view hierarchy is not yet created, no views to update.
391a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mRootView == null) {
392a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                return;
393309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
394fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn            /*
395a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            if (mTotalStorage > 0) {
39637f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                BidiFormatter bidiFormatter = BidiFormatter.getInstance();
397a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mColorBar.setRatios((mTotalStorage-mFreeStorage-mAppStorage)/(float)mTotalStorage,
398a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                        mAppStorage/(float)mTotalStorage, mFreeStorage/(float)mTotalStorage);
399a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                long usedStorage = mTotalStorage - mFreeStorage;
400309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastUsedStorage != usedStorage) {
401309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastUsedStorage = usedStorage;
40237f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                    String sizeStr = bidiFormatter.unicodeWrap(
40337f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                            Formatter.formatShortFileSize(mOwner.getActivity(), usedStorage));
404309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mUsedStorageText.setText(mOwner.getActivity().getResources().getString(
405309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            R.string.service_foreground_processes, sizeStr));
406309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
407a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                if (mLastFreeStorage != mFreeStorage) {
408a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                    mLastFreeStorage = mFreeStorage;
40937f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                    String sizeStr = bidiFormatter.unicodeWrap(
41037f3c8f574b984e4980ebf598358726b3f852156Fabrice Di Meglio                            Formatter.formatShortFileSize(mOwner.getActivity(), mFreeStorage));
411309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mFreeStorageText.setText(mOwner.getActivity().getResources().getString(
412309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                            R.string.service_background_processes, sizeStr));
413309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
414309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            } else {
415309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mColorBar.setRatios(0, 0, 0);
416309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastUsedStorage != -1) {
417309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastUsedStorage = -1;
418309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mUsedStorageText.setText("");
419309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
420309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mLastFreeStorage != -1) {
421309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mLastFreeStorage = -1;
422309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mFreeStorageText.setText("");
423309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                }
424309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
425fe9590bb19e3acf6b68b67b40f43de8bc094d1b6Dianne Hackborn            */
426309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
427309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
428309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
429309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
430a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mClickListener.onItemClick(this, parent, view, position, id);
431309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
432309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
433309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        void handleRunningProcessesAvail() {
434309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
435309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mOwner.getActivity(), android.R.anim.fade_out));
436309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation(
437309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mOwner.getActivity(), android.R.anim.fade_in));
438309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mRunningProcessesView.setVisibility(View.VISIBLE);
439309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mLoadingContainer.setVisibility(View.GONE);
440309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
441309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
442309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
44318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    private int mNumTabs;
444309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    TabInfo mCurTab = null;
445309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Size resource used for packages whose size computation failed for some reason
4479244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    CharSequence mInvalidSizeStr;
448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingSizeStr;
449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
450afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // layout inflater object used to inflate views
451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LayoutInflater mInflater;
452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
453de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private String mCurrentPkgName;
454afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
455ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    private Menu mOptionsMenu;
4567a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
4577a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    // These are for keeping track of activity and spinner switch state.
458728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    private boolean mActivityResumed;
459f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina
460f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina    private static final int LIST_TYPE_MISSING = -1;
4617a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_DOWNLOADED = 0;
4627a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_RUNNING = 1;
4637a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_SDCARD = 2;
4647a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    static final int LIST_TYPE_ALL = 3;
46518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    static final int LIST_TYPE_DISABLED = 4;
466f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
4670385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn    private boolean mShowBackground = false;
4680385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn
4697a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    private int mDefaultListType = -1;
470f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
471309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ViewGroup mContentContainer;
472309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private View mRootView;
473309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ViewPager mViewPager;
474aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina    private ViewGroup mPinnedHeader;
475c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    private UserSpinnerAdapter mProfileSpinnerAdapter;
47606cd50177a4eddf6e8fc86a5b935f6985d8d82c9Alexandra Gherghina    private Spinner mSpinner;
477c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    private Context mContext;
478f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
47914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    AlertDialog mResetDialog;
48014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
481309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    class MyPagerAdapter extends PagerAdapter
482309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            implements ViewPager.OnPageChangeListener {
483309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        int mCurPos = 0;
484309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
485309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
486309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public int getCount() {
48718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            return mNumTabs;
488309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
489309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
490309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
491309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public Object instantiateItem(ViewGroup container, int position) {
492309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = mTabs.get(position);
493309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            View root = tab.build(mInflater, mContentContainer, mRootView);
494309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            container.addView(root);
49518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            root.setTag(R.id.name, tab);
496309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return root;
497309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
498309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
499309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
500309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void destroyItem(ViewGroup container, int position, Object object) {
501309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            container.removeView((View)object);
502ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn        }
503ff3673c7f477b1d78e64a8bc28754552dcdc8826Dianne Hackborn
504309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
505309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public boolean isViewFromObject(View view, Object object) {
506309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return view == object;
507309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
5087a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
509309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
51018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        public int getItemPosition(Object object) {
51118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            return super.getItemPosition(object);
51218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            //return ((TabInfo)((View)object).getTag(R.id.name)).mListType;
51318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        }
51418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
51518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        @Override
516309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public CharSequence getPageTitle(int position) {
517309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            return mTabs.get(position).mLabel;
518309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
519309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
520309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
521309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
522309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
523309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
524309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
525309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageSelected(int position) {
526309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurPos = position;
527309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        }
528309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn
529309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        @Override
530309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void onPageScrollStateChanged(int state) {
531309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (state == ViewPager.SCROLL_STATE_IDLE) {
532309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                updateCurrentTab(mCurPos);
533309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
5347a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        }
5357a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    }
5367a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
537e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project    /*
538e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * Custom adapter implementation for the ListView
539e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * This adapter maintains a map for each displayed application and its properties
540e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * An index value on each AppInfo object indicates the correct position or index
541e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * in the list. If the list gets updated dynamically when the user is viewing the list of
542e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * applications, we need to return the correct index of position. This is done by mapping
543e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * the getId methods via the package name into the internal maps and indices.
544e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * The order of applications in the list is mirrored in mAppLocalList
545e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project     */
546309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    static class ApplicationsAdapter extends BaseAdapter implements Filterable,
547e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.Callbacks, AbsListView.RecyclerListener {
548e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ApplicationsState mState;
549309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final ApplicationsState.Session mSession;
550309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final TabInfo mTab;
551309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final Context mContext;
552e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ArrayList<View> mActive = new ArrayList<View>();
553309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private final int mFilterMode;
554e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mBaseEntries;
555e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mEntries;
556e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private boolean mResumed;
557309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        private int mLastSortMode=-1;
55819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        private boolean mWaitingForData;
559bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        private int mWhichSize = SIZE_TOTAL;
560e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        CharSequence mCurFilterPrefix;
561e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
562e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private Filter mFilter = new Filter() {
563e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
564e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected FilterResults performFiltering(CharSequence constraint) {
565e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> entries
566e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = applyPrefixFilter(constraint, mBaseEntries);
567e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                FilterResults fr = new FilterResults();
568e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.values = entries;
569e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.count = entries.size();
570e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return fr;
571e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            }
572355b32faa924a0b39067dd759ba03e5af97065caSuchi Amalapurapu
573e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
574e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected void publishResults(CharSequence constraint, FilterResults results) {
575e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mCurFilterPrefix = constraint;
576e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values;
577e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                notifyDataSetChanged();
578309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.updateStorageUsage();
579afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
580e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        };
581c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
582309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public ApplicationsAdapter(ApplicationsState state, TabInfo tab, int filterMode) {
583e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mState = state;
584309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mSession = state.newSession(this);
585309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab = tab;
586309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mContext = tab.mOwner.getActivity();
587309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mFilterMode = filterMode;
588c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
589e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
590309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void resume(int sort) {
591e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Resume!  mResumed=" + mResumed);
592e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (!mResumed) {
593e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = true;
594309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mSession.resume();
595e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mLastSortMode = sort;
59619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                rebuild(true);
597e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            } else {
598309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                rebuild(sort);
599c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
600e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project        }
601c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
602e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void pause() {
603e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mResumed) {
604e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = false;
605309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mSession.pause();
606e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
607afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
608b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
609f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su        public void release() {
610f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su            mSession.release();
611f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su        }
612f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su
613309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        public void rebuild(int sort) {
614309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (sort == mLastSortMode) {
615e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return;
616e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
617e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mLastSortMode = sort;
61819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            rebuild(true);
619afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
620afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
62119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        public void rebuild(boolean eraseold) {
622e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Rebuilding app list...");
623e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppFilter filterObj;
624e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            Comparator<AppEntry> comparatorObj;
625bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            boolean emulated = Environment.isExternalStorageEmulated();
626bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            if (emulated) {
627bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mWhichSize = SIZE_TOTAL;
628bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            } else {
629bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                mWhichSize = SIZE_INTERNAL;
630bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            }
631309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            switch (mFilterMode) {
632e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_THIRD_PARTY:
633e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.THIRD_PARTY_FILTER;
634e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
635e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_SDCARD:
636e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.ON_SD_CARD_FILTER;
637bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                    if (!emulated) {
638bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                        mWhichSize = SIZE_EXTERNAL;
639bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn                    }
640e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
64118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                case FILTER_APPS_DISABLED:
64218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                    filterObj = ApplicationsState.DISABLED_FILTER;
64318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                    break;
644e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
64518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                    filterObj = ApplicationsState.ALL_ENABLED_FILTER;
646e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
647e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
648e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            switch (mLastSortMode) {
649e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case SORT_ORDER_SIZE:
650430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                    switch (mWhichSize) {
651430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        case SIZE_INTERNAL:
652430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR;
653430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
654430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        case SIZE_EXTERNAL:
655430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.EXTERNAL_SIZE_COMPARATOR;
656430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
657430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                        default:
658430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            comparatorObj = ApplicationsState.SIZE_COMPARATOR;
659430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                            break;
660430a3d3376cfa2c2a03d6f18d28577c34750102cDianne Hackborn                    }
661e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
662e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
663e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    comparatorObj = ApplicationsState.ALPHA_COMPARATOR;
664e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
665e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
66619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            ArrayList<ApplicationsState.AppEntry> entries
667309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    = mSession.rebuild(filterObj, comparatorObj);
66819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (entries == null && !eraseold) {
66919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                // Don't have new list yet, but can continue using the old one.
67019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                return;
67119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
67219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mBaseEntries = entries;
67319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (mBaseEntries != null) {
67419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
67519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            } else {
67619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mEntries = null;
67719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
678e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            notifyDataSetChanged();
679309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.updateStorageUsage();
68019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
68119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            if (entries == null) {
68219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                mWaitingForData = true;
683309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.setVisibility(View.INVISIBLE);
684309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.setVisibility(View.VISIBLE);
68519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            } else {
686309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.setVisibility(View.VISIBLE);
687309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.setVisibility(View.GONE);
68819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            }
689afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
690afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
691e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix,
692e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> origEntries) {
693e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (prefix == null || prefix.length() == 0) {
694e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return origEntries;
695afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
696e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                String prefixStr = ApplicationsState.normalize(prefix.toString());
697e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                final String spacePrefixStr = " " + prefixStr;
698e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> newEntries
699e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = new ArrayList<ApplicationsState.AppEntry>();
700e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                for (int i=0; i<origEntries.size(); i++) {
701e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    ApplicationsState.AppEntry entry = origEntries.get(i);
702e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    String nlabel = entry.getNormalizedLabel();
703e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) {
704e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        newEntries.add(entry);
705ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                    }
706ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                }
707e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return newEntries;
708afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
709afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
710ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu
711e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
712e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onRunningStateChanged(boolean running) {
713309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mOwner.getActivity().setProgressBarIndeterminateVisibility(running);
714afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
715b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
716e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
71719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        public void onRebuildComplete(ArrayList<AppEntry> apps) {
718309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mTab.mLoadingContainer.getVisibility() == View.VISIBLE) {
719309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
720309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        mContext, android.R.anim.fade_out));
721309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mTab.mListContainer.startAnimation(AnimationUtils.loadAnimation(
722309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        mContext, android.R.anim.fade_in));
7234e4ed14ee2b82cb90a25b3027eb36f190ce2e1e7Dianne Hackborn            }
724309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mListContainer.setVisibility(View.VISIBLE);
725309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.mLoadingContainer.setVisibility(View.GONE);
72619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mWaitingForData = false;
72719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mBaseEntries = apps;
72819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
72919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            notifyDataSetChanged();
730309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTab.updateStorageUsage();
73119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        }
73219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
73319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn        @Override
734e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageListChanged() {
73519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn            rebuild(false);
736afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
737b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
738e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
739e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageIconChanged() {
740e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // We ensure icons are loaded when their item is displayed, so
741e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // don't care about icons loaded in the background.
742afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
743b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
744e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
745e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageSizeChanged(String packageName) {
746e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            for (int i=0; i<mActive.size(); i++) {
747e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag();
748e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (holder.entry.info.packageName.equals(packageName)) {
749e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    synchronized (holder.entry) {
750309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                        holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
751c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
752309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    if (holder.entry.info.packageName.equals(mTab.mOwner.mCurrentPkgName)
753e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                            && mLastSortMode == SORT_ORDER_SIZE) {
754e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // We got the size information for the last app the
755e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // user viewed, and are sorting by size...  they may
756e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // have cleared data, so we immediately want to resort
757e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // the list with the new size to reflect it to the user.
75819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                        rebuild(false);
759c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
760309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    mTab.updateStorageUsage();
761e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    return;
762c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                }
763c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
764c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
765c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
766e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
767e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onAllSizesComputed() {
768e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mLastSortMode == SORT_ORDER_SIZE) {
76919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn                rebuild(false);
770afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
771a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTab.updateStorageUsage();
772afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
773afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
774afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int getCount() {
775e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries != null ? mEntries.size() : 0;
776afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
777afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
778afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public Object getItem(int position) {
779e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
780afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
781afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
782e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public ApplicationsState.AppEntry getAppEntry(int position) {
783e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
784afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
785afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
786afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public long getItemId(int position) {
787e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position).id;
788afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
789afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
790afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
791347c9a0544328e65120582834ce330fb0d473f28Jeff Brown            // A ViewHolder keeps references to children views to avoid unnecessary calls
792afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to findViewById() on each row.
793309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            AppViewHolder holder = AppViewHolder.createOrRecycle(mTab.mInflater, convertView);
7949244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            convertView = holder.rootView;
795afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
796afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Bind the data efficiently with the holder
797e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppEntry entry = mEntries.get(position);
798e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            synchronized (entry) {
799e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                holder.entry = entry;
800e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.label != null) {
801e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appName.setText(entry.label);
802afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
803e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mState.ensureIcon(entry);
804e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.icon != null) {
805e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appIcon.setImageDrawable(entry.icon);
806afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
807309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                holder.updateSizeText(mTab.mInvalidSizeStr, mWhichSize);
8083db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                if ((entry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {
8093db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setVisibility(View.VISIBLE);
8103db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setText(R.string.not_installed);
8113db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                } else if (!entry.info.enabled) {
8123db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setVisibility(View.VISIBLE);
8133db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    holder.disabled.setText(R.string.disabled);
81444178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                } else {
81544178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    holder.disabled.setVisibility(View.GONE);
81644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                }
817309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                if (mFilterMode == FILTER_APPS_SDCARD) {
8186dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setVisibility(View.VISIBLE);
8196dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setChecked((entry.info.flags
8206dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                            & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
8216dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                } else {
8226dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                    holder.checkBox.setVisibility(View.GONE);
8236dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn                }
824afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
825e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(convertView);
826e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.add(convertView);
827afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return convertView;
828afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
829c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
830e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
831c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        public Filter getFilter() {
832e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mFilter;
833c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
834c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
835e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
836e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onMovedToScrapHeap(View view) {
837e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(view);
838728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
839728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
840c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina
841afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
842f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle savedInstanceState) {
843afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
844f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
845f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        setHasOptionsMenu(true);
846f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
847c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        mContext = getActivity();
848f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
849f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        Intent intent = getActivity().getIntent();
850ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        String action = intent.getAction();
8517a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        int defaultListType = LIST_TYPE_DOWNLOADED;
852ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        String className = getArguments() != null
853ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                ? getArguments().getString("classname") : null;
854ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (className == null) {
855ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            className = intent.getComponent().getClassName();
856ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
857af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani        if (className.equals(RunningServicesActivity.class.getName())
858af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || className.endsWith(".RunningServices")) {
8597a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_RUNNING;
8605203bdffe6ce2b829d0fab8c7691fa92aca6e972Amith Yamasani        } else if (className.equals(StorageUseActivity.class.getName())
861af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || Intent.ACTION_MANAGE_PACKAGE_STORAGE.equals(action)
862af9252849fd94c1f2859c56a4010900ea38a607eAmith Yamasani                || className.endsWith(".StorageUse")) {
863afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSortOrder = SORT_ORDER_SIZE;
8647a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_ALL;
865263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio        } else if (android.provider.Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS.equals(action)) {
8667a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            // Select the all-apps list, with the default sorting
8677a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            defaultListType = LIST_TYPE_ALL;
868afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
8697a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
870728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (savedInstanceState != null) {
87102c22131e93e1a506141b1890c7134909ded876fAmith Yamasani            mSortOrder = savedInstanceState.getInt(EXTRA_SORT_ORDER, mSortOrder);
8727a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            int tmp = savedInstanceState.getInt(EXTRA_DEFAULT_LIST_TYPE, -1);
8737a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            if (tmp != -1) defaultListType = tmp;
87402c22131e93e1a506141b1890c7134909ded876fAmith Yamasani            mShowBackground = savedInstanceState.getBoolean(EXTRA_SHOW_BACKGROUND, false);
875728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
8767a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
8777a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        mDefaultListType = defaultListType;
8783b7dbcecf70788df4950340cbf750dbe524dca96Amith Yamasani
87944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        final Intent containerIntent = new Intent().setComponent(
88044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey                StorageMeasurement.DEFAULT_CONTAINER_COMPONENT);
88144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE);
8821337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
883f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
884f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingSizeStr = getActivity().getText(R.string.computing_size);
885f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
886a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        TabInfo tab = new TabInfo(this, mApplicationsState,
887309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_third_party),
888309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_DOWNLOADED, this, savedInstanceState);
889309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
890f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
891309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (!Environment.isExternalStorageEmulated()) {
892a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            tab = new TabInfo(this, mApplicationsState,
893309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    getActivity().getString(R.string.filter_apps_onsdcard),
894309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    LIST_TYPE_SDCARD, this, savedInstanceState);
895309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTabs.add(tab);
896508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
8977a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
898a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        tab = new TabInfo(this, mApplicationsState,
899309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_running),
900309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_RUNNING, this, savedInstanceState);
901309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
9027a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
903a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        tab = new TabInfo(this, mApplicationsState,
904309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                getActivity().getString(R.string.filter_apps_all),
905309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                LIST_TYPE_ALL, this, savedInstanceState);
906309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mTabs.add(tab);
90718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
90818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        tab = new TabInfo(this, mApplicationsState,
90918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                getActivity().getString(R.string.filter_apps_disabled),
91018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                LIST_TYPE_DISABLED, this, savedInstanceState);
91118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        mTabs.add(tab);
91218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
91318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        mNumTabs = mTabs.size();
914c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina
915c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
91680e1f1bfdb814a08fb8b07b2e279285d495042e9Alexandra Gherghina        mProfileSpinnerAdapter = Utils.createUserSpinnerAdapter(um, mContext);
917309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
9187a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
9197a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
920309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    @Override
921309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
922309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // initialize the inflater
923309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mInflater = inflater;
9247a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
925309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        View rootView = mInflater.inflate(R.layout.manage_applications_content,
926309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                container, false);
927309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mContentContainer = container;
928309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mRootView = rootView;
929aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina        mPinnedHeader = (ViewGroup) mRootView.findViewById(R.id.pinned_header);
930aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina        if (mProfileSpinnerAdapter != null) {
931aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina            mSpinner = (Spinner) inflater.inflate(R.layout.spinner_view, null);
932aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina            mSpinner.setAdapter(mProfileSpinnerAdapter);
933aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina            mSpinner.setOnItemSelectedListener(this);
934aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina            mPinnedHeader.addView(mSpinner);
935aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina            mPinnedHeader.setVisibility(View.VISIBLE);
936aadc070a35ca47940e9fa964ba68c5ce817202efAlexandra Gherghina        }
937309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
938309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        MyPagerAdapter adapter = new MyPagerAdapter();
939309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager.setAdapter(adapter);
940309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mViewPager.setOnPageChangeListener(adapter);
941309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs);
942cc22af08117a2f90d879cc360f76de48fd234e0dFabrice Di Meglio        tabs.setTabIndicatorColorResource(R.color.theme_accent);
9437a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
944a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // We have to do this now because PreferenceFrameLayout looks at it
945a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // only when the view is added.
946a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        if (container instanceof PreferenceFrameLayout) {
947a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true;
948a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
949a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
95014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
95114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            buildResetDialog();
95214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
95314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
95413ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn        if (savedInstanceState == null) {
95513ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            // First time init: make sure view pager is showing the correct tab.
956f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina            int extraCurrentListType = getActivity().getIntent().getIntExtra(EXTRA_LIST_TYPE,
957f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina                    LIST_TYPE_MISSING);
958f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina            int currentListType = (extraCurrentListType != LIST_TYPE_MISSING)
959f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina                    ? extraCurrentListType : mDefaultListType;
960f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina            for (int i = 0; i < mNumTabs; i++) {
96113ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                TabInfo tab = mTabs.get(i);
962f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina                if (tab.mListType == currentListType) {
96313ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                    mViewPager.setCurrentItem(i);
96413ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                    break;
96513ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn                }
96613ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn            }
96713ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn        }
96813ba7e655643f664aa134e45362e155f18d42931Dianne Hackborn
969309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        return rootView;
970afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
971f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
972f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    @Override
973728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public void onStart() {
974728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onStart();
975b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu    }
976b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
977afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
978f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onResume() {
979728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onResume();
980728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = true;
981309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        updateCurrentTab(mViewPager.getCurrentItem());
982f5f08628cc0129e92277d6ddfcf6ae680887573dDianne Hackborn        updateNumTabs();
983ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
984afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
985b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
986728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
987f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onSaveInstanceState(Bundle outState) {
988728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onSaveInstanceState(outState);
98902c22131e93e1a506141b1890c7134909ded876fAmith Yamasani        outState.putInt(EXTRA_SORT_ORDER, mSortOrder);
9907a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        if (mDefaultListType != -1) {
9917a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani            outState.putInt(EXTRA_DEFAULT_LIST_TYPE, mDefaultListType);
992f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
99302c22131e93e1a506141b1890c7134909ded876fAmith Yamasani        outState.putBoolean(EXTRA_SHOW_BACKGROUND, mShowBackground);
99414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog != null) {
99514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            outState.putBoolean(EXTRA_RESET_DIALOG, true);
99614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
997728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
998728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
999728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
1000f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onPause() {
1001728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onPause();
1002728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = false;
1003309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
1004309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mTabs.get(i).pause();
1005728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
1006728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
1007728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
1008728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
100914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onStop() {
101014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        super.onStop();
101114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog != null) {
101214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog.dismiss();
101314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = null;
101414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
101514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
101614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
101714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
1018a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    public void onDestroyView() {
1019a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        super.onDestroyView();
1020a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
1021a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // We are going to keep the tab data structures around, but they
1022a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        // are no longer attached to their view hierarchy.
1023a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
1024a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            mTabs.get(i).detachView();
1025f3a9578910050d35fd536c1f9a7b5d629b3c19d8Jun Su            mTabs.get(i).release();
1026a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        }
1027a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    }
1028a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn
1029a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    @Override
1030f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onActivityResult(int requestCode, int resultCode, Intent data) {
1031728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
1032e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mApplicationsState.requestSize(mCurrentPkgName);
1033ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        }
1034afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
10357a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
1036c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    @Override
1037c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
1038c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        UserHandle selectedUser = mProfileSpinnerAdapter.getUserHandle(position);
1039c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        if (selectedUser.getIdentifier() != UserHandle.myUserId()) {
1040c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina            Intent intent = new Intent(Settings.ACTION_APPLICATION_SETTINGS);
1041c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
104256645002b2729c1f7696529e530164a031fb7978Alexandra Gherghina            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
1043f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina            int currentTab = mViewPager.getCurrentItem();
1044f276e75f2d1705221a68597ec1c145e6dda63238Alexandra Gherghina            intent.putExtra(EXTRA_LIST_TYPE, mTabs.get(currentTab).mListType);
1045c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina            mContext.startActivityAsUser(intent, selectedUser);
104606cd50177a4eddf6e8fc86a5b935f6985d8d82c9Alexandra Gherghina            // Go back to default selection, which is the first one; this makes sure that pressing
104706cd50177a4eddf6e8fc86a5b935f6985d8d82c9Alexandra Gherghina            // the back button takes you into a consistent state
104806cd50177a4eddf6e8fc86a5b935f6985d8d82c9Alexandra Gherghina            mSpinner.setSelection(0);
1049c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        }
1050c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    }
1051c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina
1052c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    @Override
1053c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    public void onNothingSelected(AdapterView<?> parent) {
1054c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina        // Nothing to do
1055c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina    }
1056c8a1db191207e38b7ad0acdfd276651e4911e812Alexandra Gherghina
105718b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    private void updateNumTabs() {
105818b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        int newNum = mApplicationsState.haveDisabledApps() ? mTabs.size() : (mTabs.size()-1);
105918b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        if (newNum != mNumTabs) {
106018b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            mNumTabs = newNum;
106118b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            if (mViewPager != null) {
106218b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn                mViewPager.getAdapter().notifyDataSetChanged();
106318b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn            }
106418b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn        }
106518b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn    }
106618b64f446cd7b9043909b0cd42d1ab364392da24Dianne Hackborn
1067309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    TabInfo tabForType(int type) {
1068309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i = 0; i < mTabs.size(); i++) {
1069309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = mTabs.get(i);
1070309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (tab.mListType == type) {
1071309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                return tab;
1072309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
10737a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani        }
1074309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        return null;
10757a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani    }
10767a3221bb95efd2e38e2aea243bcb13577bb276b3Amith Yamasani
1077afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // utility method used to start sub activity
1078afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void startApplicationDetailsActivity() {
1079f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        // start new fragment to display extended information
1080f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        Bundle args = new Bundle();
1081f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mCurrentPkgName);
1082f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
1083263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio        SettingsActivity sa = (SettingsActivity) getActivity();
1084263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio        sa.startPreferencePanel(InstalledAppDetails.class.getName(), args,
1085ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                R.string.application_info_label, null, this, INSTALLED_APP_DETAILS);
1086afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1087afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1088afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1089f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
1090ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mOptionsMenu = menu;
10910385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn        // note: icons removed for now because the cause the new action
10920385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn        // bar UI to be very confusing.
1093afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
10940385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn                //.setIcon(android.R.drawable.ic_menu_sort_alphabetically)
1095348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1096afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
10970385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn                //.setIcon(android.R.drawable.ic_menu_sort_by_size)
1098348b62e6e9568166a17b1304296e0f08aee97cf5Gilles Debunne                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1099ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services)
1100ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
1101ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes)
1102ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
110314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        menu.add(0, RESET_APP_PREFERENCES, 4, R.string.reset_app_preferences)
110414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
1105ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1109f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onPrepareOptionsMenu(Menu menu) {
1110ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1111ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
1112ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
1113ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    @Override
1114ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onDestroyOptionsMenu() {
1115ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mOptionsMenu = null;
1116ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
111744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
111844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    @Override
111944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    public void onDestroy() {
112044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        getActivity().unbindService(mContainerConnection);
112144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        super.onDestroy();
112244dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    }
112344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
1124ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    void updateOptionsMenu() {
1125ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (mOptionsMenu == null) {
1126ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return;
1127ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
1128ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
1129673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root        /*
1130673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         * The running processes screen doesn't use the mApplicationsAdapter
1131673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         * so bringing up this menu in that case doesn't make any sense.
1132673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root         */
1133309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (mCurTab != null && mCurTab.mListType == LIST_TYPE_RUNNING) {
1134309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo tab = tabForType(LIST_TYPE_RUNNING);
1135309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            boolean showingBackground = tab != null && tab.mRunningProcessesView != null
1136309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                    ? tab.mRunningProcessesView.mAdapter.getShowBackground() : false;
1137ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false);
1138ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false);
1139ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground);
1140ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground);
114114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false);
1142eca1fc2cadb9c1f15ab042e2080a8b8eb40ab6faThiago Vinícius Freire de Araújo Ribeiro            mShowBackground = showingBackground;
11431337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else {
1144ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
1145ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
1146ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false);
1147ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false);
114814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(true);
114914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
115014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
115114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
115214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    void buildResetDialog() {
115314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == null) {
115414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
115514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setTitle(R.string.reset_app_preferences_title);
115614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setMessage(R.string.reset_app_preferences_desc);
115714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setPositiveButton(R.string.reset_app_preferences_button, this);
115814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            builder.setNegativeButton(R.string.cancel, null);
115914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = builder.show();
116014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog.setOnDismissListener(this);
116114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
116214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
116314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
116414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
116514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onDismiss(DialogInterface dialog) {
116614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == dialog) {
116714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            mResetDialog = null;
116814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        }
116914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    }
117014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
117114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn
117214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    @Override
117314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn    public void onClick(DialogInterface dialog, int which) {
117414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        if (mResetDialog == dialog) {
117514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final PackageManager pm = getActivity().getPackageManager();
1176596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn            final IPackageManager mIPm = IPackageManager.Stub.asInterface(
1177a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn                    ServiceManager.getService("package"));
117814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final INotificationManager nm = INotificationManager.Stub.asInterface(
117914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    ServiceManager.getService(Context.NOTIFICATION_SERVICE));
118014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final NetworkPolicyManager npm = NetworkPolicyManager.from(getActivity());
1181a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn            final AppOpsManager aom = (AppOpsManager)getActivity().getSystemService(
1182a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn                    Context.APP_OPS_SERVICE);
118314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            final Handler handler = new Handler(getActivity().getMainLooper());
118414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            (new AsyncTask<Void, Void, Void>() {
118514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                @Override protected Void doInBackground(Void... params) {
118614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    List<ApplicationInfo> apps = pm.getInstalledApplications(
118714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            PackageManager.GET_DISABLED_COMPONENTS);
118814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    for (int i=0; i<apps.size(); i++) {
118914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        ApplicationInfo app = apps.get(i);
119014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        try {
119114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName);
1192df3f6d6c4722a7acc8189e47d0499aaf618969f9Daniel Sandler                            nm.setNotificationsEnabledForPackage(app.packageName, app.uid, true);
119314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        } catch (android.os.RemoteException ex) {
119414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
119514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        if (!app.enabled) {
119614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName);
119714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (pm.getApplicationEnabledSetting(app.packageName)
119814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                    == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
119914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                pm.setApplicationEnabledSetting(app.packageName,
120014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                        PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
120114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                        PackageManager.DONT_KILL_APP);
120214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            }
120314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
120414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
1205596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn                    try {
1206596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn                        mIPm.resetPreferredActivities(UserHandle.myUserId());
1207596f0cfb4654a18b863f7e6a9dd6742bd57c2b96Dianne Hackborn                    } catch (RemoteException e) {
120814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
1209a6683e0f4af75005ab5a1742d30df4bee071f725Dianne Hackborn                    aom.resetAllModes();
121038305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    final int[] restrictedUids = npm.getUidsWithPolicy(
121114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            POLICY_REJECT_METERED_BACKGROUND);
121238305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    final int currentUserId = ActivityManager.getCurrentUser();
121338305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                    for (int uid : restrictedUids) {
121438305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        // Only reset for current user
121538305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        if (UserHandle.getUserId(uid) == currentUserId) {
121638305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                            if (DEBUG) Log.v(TAG, "Clearing data policy: " + uid);
121738305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                            npm.setUidPolicy(uid, POLICY_NONE);
121838305fb1777147cbcb86774c466e88434daff141Jeff Sharkey                        }
121914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    }
122014d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    handler.post(new Runnable() {
122114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        @Override public void run() {
122214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (DEBUG) Log.v(TAG, "Done clearing");
122314d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            if (getActivity() != null && mActivityResumed) {
122414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                                if (DEBUG) Log.v(TAG, "Updating UI!");
1225309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                for (int i=0; i<mTabs.size(); i++) {
1226309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    TabInfo tab = mTabs.get(i);
1227309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    if (tab.mApplications != null) {
1228309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                        tab.mApplications.pause();
1229309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    }
1230309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                }
1231309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                if (mCurTab != null) {
1232309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                    mCurTab.resume(mSortOrder);
1233309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                                }
123414d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                            }
123514d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                        }
123614d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    });
123714d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                    return null;
123814d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn                }
123914d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            }).execute();
1240673085af9e5e040eb0109138e9cb6916fa4b88f0Kenny Root        }
1241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
1244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
1245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int menuId = item.getItemId();
1246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) {
1247e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mSortOrder = menuId;
1248309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mApplications != null) {
1249309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mApplications.rebuild(mSortOrder);
12501337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            }
12511337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else if (menuId == SHOW_RUNNING_SERVICES) {
12520385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn            mShowBackground = false;
1253309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
1254309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(false);
1255309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
12561337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else if (menuId == SHOW_BACKGROUND_PROCESSES) {
12570385cf14a1b02fafc3d1a094ccfee45de4e9b03aDianne Hackborn            mShowBackground = true;
1258309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (mCurTab != null && mCurTab.mRunningProcessesView != null) {
1259309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                mCurTab.mRunningProcessesView.mAdapter.setShowBackground(true);
1260309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
126114d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn        } else if (menuId == RESET_APP_PREFERENCES) {
126214d5714a8238b244b974e4e62fe688398ab45dcbDianne Hackborn            buildResetDialog();
1263f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani        } else {
1264f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani            // Handle the home button
1265f0b05de3e06ad319a32fc1784d1b5cef48521f81Amith Yamasani            return false;
1266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1267ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        updateOptionsMenu();
1268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return true;
1269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1270d2be882d8f2e5acd8a5806c649ba4640249cf4baDianne Hackborn
1271a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn    public void onItemClick(TabInfo tab, AdapterView<?> parent, View view, int position,
1272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long id) {
1273a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn        if (tab.mApplications != null && tab.mApplications.getCount() > position) {
1274a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            ApplicationsState.AppEntry entry = tab.mApplications.getAppEntry(position);
1275309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurrentPkgName = entry.info.packageName;
1276309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            startApplicationDetailsActivity();
12771337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
1278309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    }
12791337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
1280309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    public void updateCurrentTab(int position) {
1281309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        TabInfo tab = mTabs.get(position);
1282309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mCurTab = tab;
128344dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
1284309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        // Put things in the correct paused/resumed state.
1285309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        if (mActivityResumed) {
1286309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.build(mInflater, mContentContainer, mRootView);
1287309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.resume(mSortOrder);
12881337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        } else {
1289309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            mCurTab.pause();
12901337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
1291309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        for (int i=0; i<mTabs.size(); i++) {
1292309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            TabInfo t = mTabs.get(i);
1293309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            if (t != mCurTab) {
1294309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn                t.pause();
12951337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            }
12961337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        }
12971337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
1298309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mCurTab.updateStorageUsage();
1299309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        updateOptionsMenu();
1300a31be80ef056add00e0d239414f80f932978277fAdam Powell        final Activity host = getActivity();
1301a31be80ef056add00e0d239414f80f932978277fAdam Powell        if (host != null) {
1302a31be80ef056add00e0d239414f80f932978277fAdam Powell            host.invalidateOptionsMenu();
1303a31be80ef056add00e0d239414f80f932978277fAdam Powell        }
1304e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    }
1305e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
130644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    private volatile IMediaContainerService mContainerService;
130744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
130844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    private final ServiceConnection mContainerConnection = new ServiceConnection() {
130944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        @Override
131044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        public void onServiceConnected(ComponentName name, IBinder service) {
131144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey            mContainerService = IMediaContainerService.Stub.asInterface(service);
1312a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn            for (int i=0; i<mTabs.size(); i++) {
1313a4af18755e0a344c628e4ddc4ece793d3401e6fbDianne Hackborn                mTabs.get(i).setContainerService(mContainerService);
1314309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn            }
131544dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        }
131644dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey
131744dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        @Override
131844dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        public void onServiceDisconnected(ComponentName name) {
131944dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey            mContainerService = null;
132044dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey        }
132144dda2d7f52007d2ef33b9e9b9b9b1ec84c5582eJeff Sharkey    };
1322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1323