ManageApplications.java revision e7623f775cb37a8de049dae8c03b5b396526fdd1
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
19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R;
20e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport com.android.settings.applications.ApplicationsState.AppEntry;
2138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu
2238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapuimport android.app.TabActivity;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
28728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.provider.Settings;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Window;
36e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackbornimport android.widget.AbsListView;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter;
39c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filter;
40c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapuimport android.widget.Filterable;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView;
4338b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapuimport android.widget.TabHost;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView.OnItemClickListener;
46b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Comparator;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to pick an application that will be used to display installation information and
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * options to uninstall/delete user data for system applications. This activity
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * intent.
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
5638b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapupublic class ManageApplications extends TabActivity implements
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        OnItemClickListener, DialogInterface.OnCancelListener,
58e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        TabHost.TabContentFactory, TabHost.OnTabChangeListener {
59e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final String TAG = "ManageApplications";
60e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final boolean DEBUG = false;
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // attributes used as keys when passing values to InstalledAppDetails activity
6338b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu    public static final String APP_CHG = "chg";
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // constant value that can be used to check return code from sub activity.
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int INSTALLED_APP_DETAILS = 1;
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order that can be changed through the menu can be sorted alphabetically
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // or size(descending)
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int MENU_OPTIONS_BASE = 0;
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Filter options used for displayed list of applications
726cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0;
73728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1;
74728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2;
75747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu
766cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4;
776cf44dbe90e3215715c713874c357d0bd26b8102Suchi Amalapurapu    public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5;
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // sort order
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private int mSortOrder = SORT_ORDER_ALPHA;
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Filter value
81fe4a2bc43f45b14db62c67d7c2531a3d7f1b8590Suchi Amalapurapu    private int mFilterApps = FILTER_APPS_THIRD_PARTY;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
83e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    private ApplicationsState mApplicationsState;
84e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    private ApplicationsAdapter mApplicationsAdapter;
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Size resource used for packages whose size computation failed for some reason
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingSizeStr;
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // layout inflater object used to inflate views
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LayoutInflater mInflater;
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
93de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private String mCurrentPkgName;
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // ListView used to display list
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ListView mListView;
97728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    // Custom view used to display running processes
98728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    private RunningProcessesView mRunningProcessesView;
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
100728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    // These are for keeping track of activity and tab switch state.
101728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    private int mCurView;
102728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    private boolean mCreatedRunning;
103728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
104728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    private boolean mResumedRunning;
105728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    private boolean mActivityResumed;
106728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    private Object mNonConfigInstance;
107728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
108e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    // View Holder used when displaying views
109e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static class AppViewHolder {
110e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        ApplicationsState.AppEntry entry;
111e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        TextView appName;
112e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        ImageView appIcon;
113e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        TextView appSize;
114e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        TextView disabled;
115ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu
116e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        void updateSizeText(ManageApplications ma) {
117e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "updateSizeText of " + entry.label + " " + entry
118e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    + ": " + entry.sizeStr);
119e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (entry.sizeStr != null) {
120e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                appSize.setText(entry.sizeStr);
121e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            } else if (entry.size == ApplicationsState.SIZE_INVALID) {
122e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                appSize.setText(ma.mInvalidSizeStr);
123ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu            }
124ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        }
125ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu    }
126ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu
127e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project    /*
128e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * Custom adapter implementation for the ListView
129e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * This adapter maintains a map for each displayed application and its properties
130e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * An index value on each AppInfo object indicates the correct position or index
131e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * in the list. If the list gets updated dynamically when the user is viewing the list of
132e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * applications, we need to return the correct index of position. This is done by mapping
133e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * the getId methods via the package name into the internal maps and indices.
134e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn     * The order of applications in the list is mirrored in mAppLocalList
135e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project     */
136e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    class ApplicationsAdapter extends BaseAdapter implements Filterable,
137e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.Callbacks, AbsListView.RecyclerListener {
138e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ApplicationsState mState;
139e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private final ArrayList<View> mActive = new ArrayList<View>();
140e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mBaseEntries;
141e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private ArrayList<ApplicationsState.AppEntry> mEntries;
142e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private boolean mResumed;
143e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private int mLastFilterMode=-1, mLastSortMode=-1;
144e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        CharSequence mCurFilterPrefix;
145e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
146e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        private Filter mFilter = new Filter() {
147e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
148e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected FilterResults performFiltering(CharSequence constraint) {
149e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> entries
150e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = applyPrefixFilter(constraint, mBaseEntries);
151e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                FilterResults fr = new FilterResults();
152e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.values = entries;
153e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                fr.count = entries.size();
154e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return fr;
155e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            }
156355b32faa924a0b39067dd759ba03e5af97065caSuchi Amalapurapu
157e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            @Override
158e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            protected void publishResults(CharSequence constraint, FilterResults results) {
159e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mCurFilterPrefix = constraint;
160e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values;
161e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                notifyDataSetChanged();
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
163e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        };
164c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
165e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public ApplicationsAdapter(ApplicationsState state) {
166e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mState = state;
167c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
168e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
169e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void resume(int filter, int sort) {
170e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Resume!  mResumed=" + mResumed);
171e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (!mResumed) {
172e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = true;
173e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mState.resume(this);
174e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mLastFilterMode = filter;
175e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mLastSortMode = sort;
176e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                rebuild();
177e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            } else {
178e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                rebuild(filter, sort);
179c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
180e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project        }
181c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
182e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void pause() {
183e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mResumed) {
184e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumed = false;
185e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mState.pause();
186e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
188b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
189e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void rebuild(int filter, int sort) {
190e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (filter == mLastFilterMode && sort == mLastSortMode) {
191e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return;
192e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
193e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mLastFilterMode = filter;
194e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mLastSortMode = sort;
195e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            rebuild();
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
198e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void rebuild() {
199e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (DEBUG) Log.i(TAG, "Rebuilding app list...");
200e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppFilter filterObj;
201e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            Comparator<AppEntry> comparatorObj;
202e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            switch (mLastFilterMode) {
203e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_THIRD_PARTY:
204e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.THIRD_PARTY_FILTER;
205e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
206e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case FILTER_APPS_SDCARD:
207e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = ApplicationsState.ON_SD_CARD_FILTER;
208e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
209e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
210e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    filterObj = null;
211e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
212e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
213e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            switch (mLastSortMode) {
214e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                case SORT_ORDER_SIZE:
215e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    comparatorObj = ApplicationsState.SIZE_COMPARATOR;
216e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
217e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                default:
218e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    comparatorObj = ApplicationsState.ALPHA_COMPARATOR;
219e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    break;
220e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
221e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mBaseEntries = mState.rebuild(filterObj, comparatorObj);
222e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
223e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            notifyDataSetChanged();
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
226e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix,
227e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> origEntries) {
228e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (prefix == null || prefix.length() == 0) {
229e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return origEntries;
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
231e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                String prefixStr = ApplicationsState.normalize(prefix.toString());
232e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                final String spacePrefixStr = " " + prefixStr;
233e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                ArrayList<ApplicationsState.AppEntry> newEntries
234e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        = new ArrayList<ApplicationsState.AppEntry>();
235e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                for (int i=0; i<origEntries.size(); i++) {
236e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    ApplicationsState.AppEntry entry = origEntries.get(i);
237e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    String nlabel = entry.getNormalizedLabel();
238e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) {
239e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        newEntries.add(entry);
240ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                    }
241ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu                }
242e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                return newEntries;
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
245ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu
246e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
247e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onRunningStateChanged(boolean running) {
248e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            setProgressBarIndeterminateVisibility(running);
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
250b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
251e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
252e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageListChanged() {
253e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            rebuild();
254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
255b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
256e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
257e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageIconChanged() {
258e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // We ensure icons are loaded when their item is displayed, so
259e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            // don't care about icons loaded in the background.
260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
261b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
262e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
263e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onPackageSizeChanged(String packageName) {
264e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            for (int i=0; i<mActive.size(); i++) {
265e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag();
266e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (holder.entry.info.packageName.equals(packageName)) {
267e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    synchronized (holder.entry) {
268e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        holder.updateSizeText(ManageApplications.this);
269c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
270e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    if (holder.entry.info.packageName.equals(mCurrentPkgName)
271e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                            && mLastSortMode == SORT_ORDER_SIZE) {
272e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // We got the size information for the last app the
273e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // user viewed, and are sorting by size...  they may
274e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // have cleared data, so we immediately want to resort
275e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        // the list with the new size to reflect it to the user.
276e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                        rebuild();
277c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                    }
278e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    return;
279c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu                }
280c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu            }
281c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
282c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
283e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
284e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onAllSizesComputed() {
285e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mLastSortMode == SORT_ORDER_SIZE) {
286e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                rebuild();
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int getCount() {
291e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries != null ? mEntries.size() : 0;
292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public Object getItem(int position) {
295e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
298e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public ApplicationsState.AppEntry getAppEntry(int position) {
299e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position);
300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public long getItemId(int position) {
303e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mEntries.get(position).id;
304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
307347c9a0544328e65120582834ce330fb0d473f28Jeff Brown            // A ViewHolder keeps references to children views to avoid unnecessary calls
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to findViewById() on each row.
309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            AppViewHolder holder;
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // When convertView is not null, we can reuse it directly, there is no need
312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to reinflate it. We only inflate a new View when the convertView supplied
313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // by ListView is null.
314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (convertView == null) {
315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                convertView = mInflater.inflate(R.layout.manage_applications_item, null);
316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // Creates a ViewHolder and store references to the two children views
318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // we want to bind data to.
319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder = new AppViewHolder();
320afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder.appName = (TextView) convertView.findViewById(R.id.app_name);
321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder.appIcon = (ImageView) convertView.findViewById(R.id.app_icon);
322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder.appSize = (TextView) convertView.findViewById(R.id.app_size);
3239db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                holder.disabled = (TextView) convertView.findViewById(R.id.app_disabled);
324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                convertView.setTag(holder);
325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // Get the ViewHolder back to get fast access to the TextView
327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // and the ImageView.
328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder = (AppViewHolder) convertView.getTag();
329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
330afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Bind the data efficiently with the holder
332e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            ApplicationsState.AppEntry entry = mEntries.get(position);
333e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            synchronized (entry) {
334e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                holder.entry = entry;
335e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.label != null) {
336e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appName.setText(entry.label);
3379db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                    holder.appName.setTextColor(getResources().getColorStateList(
338e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                            entry.info.enabled ? android.R.color.primary_text_dark
3399db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                                    : android.R.color.secondary_text_dark));
340afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
341e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mState.ensureIcon(entry);
342e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                if (entry.icon != null) {
343e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                    holder.appIcon.setImageDrawable(entry.icon);
344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
345e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                holder.updateSizeText(ManageApplications.this);
346e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                holder.disabled.setVisibility(entry.info.enabled ? View.GONE : View.VISIBLE);
347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
348e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(convertView);
349e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.add(convertView);
350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return convertView;
351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
352c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
353e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
354c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        public Filter getFilter() {
355e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            return mFilter;
356c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        }
357c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu
358e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        @Override
359e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        public void onMovedToScrapHeap(View view) {
360e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mActive.remove(view);
361728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
362728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
363728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
36438b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu    static final String TAB_DOWNLOADED = "Downloaded";
36538b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu    static final String TAB_RUNNING = "Running";
36638b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu    static final String TAB_ALL = "All";
367747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu    static final String TAB_SDCARD = "OnSdCard";
36838b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu    private View mRootView;
369728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
373e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        mApplicationsState = ApplicationsState.getInstance(getApplication());
374e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        mApplicationsAdapter = new ApplicationsAdapter(mApplicationsState);
375ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        Intent intent = getIntent();
376ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        String action = intent.getAction();
37738b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu        String defaultTabTag = TAB_DOWNLOADED;
378728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (intent.getComponent().getClassName().equals(
379728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                "com.android.settings.RunningServices")) {
380728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            defaultTabTag = TAB_RUNNING;
381728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (action.equals(Intent.ACTION_MANAGE_PACKAGE_STORAGE)) {
383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSortOrder = SORT_ORDER_SIZE;
384fe4a2bc43f45b14db62c67d7c2531a3d7f1b8590Suchi Amalapurapu            mFilterApps = FILTER_APPS_ALL;
38538b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu            defaultTabTag = TAB_ALL;
386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
387728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
388728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (savedInstanceState != null) {
389728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mSortOrder = savedInstanceState.getInt("sortOrder", mSortOrder);
390728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mFilterApps = savedInstanceState.getInt("filterApps", mFilterApps);
391728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            String tmp = savedInstanceState.getString("defaultTabTag");
392728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (tmp != null) defaultTabTag = tmp;
393728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
394728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
395728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mNonConfigInstance = getLastNonConfigurationInstance();
396728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // initialize some window features
398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        requestWindowFeature(Window.FEATURE_RIGHT_ICON);
399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mInvalidSizeStr = getText(R.string.invalid_size_value);
401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mComputingSizeStr = getText(R.string.computing_size);
402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // initialize the inflater
403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
40438b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu        mRootView = mInflater.inflate(R.layout.compute_sizes, null);
405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Create adapter and list view here
40638b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu        ListView lv = (ListView) mRootView.findViewById(android.R.id.list);
407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        lv.setOnItemClickListener(this);
408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        lv.setSaveEnabled(true);
409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        lv.setItemsCanFocus(true);
410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        lv.setOnItemClickListener(this);
411c0b23d3f0bb42b26950512590d5ebd6d3373032dSuchi Amalapurapu        lv.setTextFilterEnabled(true);
412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mListView = lv;
413e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        lv.setRecyclerListener(mApplicationsAdapter);
414e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        mListView.setAdapter(mApplicationsAdapter);
415728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mRunningProcessesView = (RunningProcessesView)mRootView.findViewById(
416728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                R.id.running_processes);
417f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
41838b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu        final TabHost tabHost = getTabHost();
41938b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu        tabHost.addTab(tabHost.newTabSpec(TAB_DOWNLOADED)
420f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu                .setIndicator(getString(R.string.filter_apps_third_party),
421f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu                        getResources().getDrawable(R.drawable.ic_tab_download))
42238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu                .setContent(this));
42338b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu        tabHost.addTab(tabHost.newTabSpec(TAB_ALL)
424f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu                .setIndicator(getString(R.string.filter_apps_all),
425f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu                        getResources().getDrawable(R.drawable.ic_tab_all))
42638b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu                .setContent(this));
427747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu        tabHost.addTab(tabHost.newTabSpec(TAB_SDCARD)
428f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu                .setIndicator(getString(R.string.filter_apps_onsdcard),
429f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu                        getResources().getDrawable(R.drawable.ic_tab_sdcard))
430747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu                .setContent(this));
431728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        tabHost.addTab(tabHost.newTabSpec(TAB_RUNNING)
432728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                .setIndicator(getString(R.string.filter_apps_running),
433728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        getResources().getDrawable(R.drawable.ic_tab_running))
434728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                .setContent(this));
43538b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu        tabHost.setCurrentTabByTag(defaultTabTag);
43638b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu        tabHost.setOnTabChangedListener(this);
437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
439f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    @Override
440728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public void onStart() {
441728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onStart();
442b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu    }
443b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
445728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onResume() {
446728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onResume();
447728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = true;
448e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        showCurrentTab();
449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
450b285593cafacc58ecfdf97be395dc8f5a7493051Suchi Amalapurapu
451728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
452728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onSaveInstanceState(Bundle outState) {
453728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onSaveInstanceState(outState);
454728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        outState.putInt("sortOrder", mSortOrder);
455728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        outState.putInt("filterApps", mFilterApps);
456728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        outState.putString("defautTabTag", getTabHost().getCurrentTabTag());
457728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
458728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
459728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
460728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public Object onRetainNonConfigurationInstance() {
461728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        return mRunningProcessesView.doRetainNonConfigurationInstance();
462728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
463728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
464728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
465728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onPause() {
466728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onPause();
467728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActivityResumed = false;
468e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        mApplicationsAdapter.pause();
469728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mResumedRunning) {
470728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mRunningProcessesView.doPause();
471728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mResumedRunning = false;
472728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
473728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
474728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
475728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
476728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onActivityResult(int requestCode, int resultCode,
477728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            Intent data) {
478728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
479e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mApplicationsState.requestSize(mCurrentPkgName);
480ff271ce1b70d6a8c59f3ea8904ef2025061e73f1Suchi Amalapurapu        }
481afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
482afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
483afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // utility method used to start sub activity
484afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void startApplicationDetailsActivity() {
485afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Create intent to start new activity
486728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
487728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                Uri.fromParts("package", mCurrentPkgName, null));
488afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // start new activity to display extended information
489afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        startActivityForResult(intent, INSTALLED_APP_DETAILS);
490afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
491afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
492afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
493afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
494afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
495afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .setIcon(android.R.drawable.ic_menu_sort_alphabetically);
496afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
497afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .setIcon(android.R.drawable.ic_menu_sort_by_size);
498afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return true;
499afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
500afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
501afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
502afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onPrepareOptionsMenu(Menu menu) {
503e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        menu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
504e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        menu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
505e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        return true;
506afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
507afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
508afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
509afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
510afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int menuId = item.getItemId();
511afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) {
512e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mSortOrder = menuId;
513e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mApplicationsAdapter.rebuild(mFilterApps, mSortOrder);
514afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
515afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return true;
516afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
517afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
518afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onItemClick(AdapterView<?> parent, View view, int position,
519afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long id) {
520e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        ApplicationsState.AppEntry entry = mApplicationsAdapter.getAppEntry(position);
521e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        mCurrentPkgName = entry.info.packageName;
522afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        startApplicationDetailsActivity();
523afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
524afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
525afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Finish the activity if the user presses the back button to cancel the activity
526afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onCancel(DialogInterface dialog) {
527afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        finish();
528afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
529afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
53038b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu    public View createTabContent(String tag) {
53138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu        return mRootView;
53238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu    }
53338b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu
534e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final int VIEW_NOTHING = 0;
535e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final int VIEW_LIST = 1;
536e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    static final int VIEW_RUNNING = 2;
537e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
538e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    private void selectView(int which) {
539e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        if (which == VIEW_LIST) {
540e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mResumedRunning) {
541e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mRunningProcessesView.doPause();
542e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumedRunning = false;
543e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
544e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mCurView != which) {
545e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mRunningProcessesView.setVisibility(View.GONE);
546e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mListView.setVisibility(View.VISIBLE);
547e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
548e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mActivityResumed) {
549e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mApplicationsAdapter.resume(mFilterApps, mSortOrder);
550e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
551e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        } else if (which == VIEW_RUNNING) {
552e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (!mCreatedRunning) {
553e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mRunningProcessesView.doCreate(null, mNonConfigInstance);
554e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mCreatedRunning = true;
555e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
556e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mActivityResumed && !mResumedRunning) {
557e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mRunningProcessesView.doResume();
558e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mResumedRunning = true;
559e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
560e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            mApplicationsAdapter.pause();
561e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            if (mCurView != which) {
562e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mRunningProcessesView.setVisibility(View.VISIBLE);
563e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn                mListView.setVisibility(View.GONE);
564e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn            }
565e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        }
566e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        mCurView = which;
567e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    }
568e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
569e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    public void showCurrentTab() {
570e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        String tabId = getTabHost().getCurrentTabTag();
571afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int newOption;
57238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu        if (TAB_DOWNLOADED.equalsIgnoreCase(tabId)) {
57338b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu            newOption = FILTER_APPS_THIRD_PARTY;
57438b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu        } else if (TAB_ALL.equalsIgnoreCase(tabId)) {
57538b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu            newOption = FILTER_APPS_ALL;
576747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu        } else if (TAB_SDCARD.equalsIgnoreCase(tabId)) {
577747ea55fce48c23b51fe6f6df8c4236effd91e37Suchi Amalapurapu            newOption = FILTER_APPS_SDCARD;
578728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        } else if (TAB_RUNNING.equalsIgnoreCase(tabId)) {
579728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            selectView(VIEW_RUNNING);
580728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return;
58138b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu        } else {
58238b89707068a4ef344f0a734c6c38e175de349e8Suchi Amalapurapu            // Invalid option. Do nothing
583afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return;
584afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
585728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
586e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        mFilterApps = newOption;
587728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        selectView(VIEW_LIST);
588e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    }
589e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn
590e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn    public void onTabChanged(String tabId) {
591e7623f775cb37a8de049dae8c03b5b396526fdd1Dianne Hackborn        showCurrentTab();
592afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
593afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
594