InstalledAppDetails.java revision cb497546ba55ef98fb561dd9a07c7a485a918f4b
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * use this file except in compliance with the License. You may obtain a copy
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * of the License at
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * License for the specific language governing permissions and limitations
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * under the License.
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings;
20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R;
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.ActivityManager;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog;
2550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.app.Dialog;
26cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver;
33ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageStatsObserver;
3550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageStats;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message;
4350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
6542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapupublic class InstalledAppDetails extends Activity implements View.OnClickListener {
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int _UNKNOWN_APP=R.string.unknown;
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ApplicationInfo mAppInfo;
6942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mUninstallButton;
7042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private boolean mUpdatedSysApp = false;
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
7250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private boolean localLOGV = false;
7350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private TextView mAppVersion;
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PkgSizeObserver mSizeObserver;
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
8442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mClearDataButton;
8542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mMoveAppButton;
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    PackageStats mSizeInfo;
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PackageManager mPm;
89ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private PackageMoveObserver mPackageMoveObserver;
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int GET_PKG_SIZE = 2;
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
97ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private static final int PACKAGE_MOVE = 4;
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String ATTR_PACKAGE_STATS="PackageStats";
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
10850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
10950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
11050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
11150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
11250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
11350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
11442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private static final int DLG_FORCE_STOP = DLG_BASE + 5;
115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case GET_PKG_SIZE:
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    refreshSizeInfo(msg);
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
129ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                case PACKAGE_MOVE:
130ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    processMoveMsg(msg);
131ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    break;
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class PkgSizeObserver extends IPackageStatsObserver.Stub {
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) {
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Message msg = mHandler.obtainMessage(GET_PKG_SIZE);
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Bundle data = new Bundle();
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             data.putParcelable(ATTR_PACKAGE_STATS, pStats);
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             msg.setData(data);
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mHandler.sendMessage(msg);
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
15650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
160ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
164ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
165ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    class PackageMoveObserver extends IPackageMoveObserver.Stub {
166ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        public void packageMoved(String packageName, int returnCode) throws RemoteException {
167ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            final Message msg = mHandler.obtainMessage(PACKAGE_MOVE);
168ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = returnCode;
169ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mHandler.sendMessage(msg);
170ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
171ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return Formatter.formatFileSize(this, size);
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
18042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initDataButtons() {
18142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mAppInfo.manageSpaceActivityName != null) {
18242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.manage_space_text);
18342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
18442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.clear_user_data_text);
18542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
18642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setOnClickListener(this);
187ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        initMoveButton();
188ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
189ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
190ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void initMoveButton() {
19142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        String pkgName = mAppInfo.packageName;
19242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean dataOnly = false;
19342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        ApplicationInfo info1 = null;
19442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
19542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        try {
19642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            info1 = mPm.getApplicationInfo(pkgName, 0);
19742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } catch (NameNotFoundException e) {
19842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
19942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        dataOnly = (info1 == null) && (mAppInfo != null);
200ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        boolean moveDisable = true;
20142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (dataOnly) {
20242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app);
20342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if ((mAppInfo.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0) {
20442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_internal);
205ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = false;
20642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
207ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = (mAppInfo.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0 ||
208ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
20942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_sdcard);
21042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
211ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if (moveDisable) {
212ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
213ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
214ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setOnClickListener(this);
215ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(true);
216ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
21742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
21842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
21942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initControlButtons() {
22042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUpdatedSysApp = (mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
22142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean enabled = true;
22242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mUpdatedSysApp) {
22342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.app_factory_reset);
22442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0){
22542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.uninstall_text);
22642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
22742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Disable uninstall for system apps
22842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            enabled = false;
22942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
23042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
23142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
23242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
23342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
23442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
23542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
23642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
24150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get package manager
242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPm = getPackageManager();
24350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application's name from intent
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = getIntent();
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME);
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mComputingStr = getText(R.string.computing_size);
247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Try retrieving package stats again
248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        CharSequence totalSizeStr, appSizeStr, dataSizeStr;
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        totalSizeStr = appSizeStr = dataSizeStr = mComputingStr;
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "Have to compute package sizes");
251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mSizeObserver = new PkgSizeObserver();
252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppInfo = mPm.getApplicationInfo(packageName,
254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    PackageManager.GET_UNINSTALLED_PACKAGES);
255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (NameNotFoundException e) {
256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.e(TAG, "Exception when retrieving package:"+packageName, e);
25750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_APP_NOT_FOUND);
25850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return;
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
26050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setContentView(R.layout.installed_app_details);
261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //TODO download str and download url
26250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize = (TextView)findViewById(R.id.total_size_text);
264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize.setText(totalSizeStr);
265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize = (TextView)findViewById(R.id.application_size_text);
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize.setText(appSizeStr);
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize = (TextView)findViewById(R.id.data_size_text);
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize.setText(dataSizeStr);
26942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
27042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        View btnPanel = findViewById(R.id.control_buttons_panel);
27142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
27242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
27342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
274cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
27542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        initControlButtons();
27642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
27742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        View data_buttons_panel = findViewById(R.id.data_buttons_panel);
27842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
27942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         // Cache section
281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize = (TextView) findViewById(R.id.cache_size_text);
282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize.setText(mComputingStr);
283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mClearCacheButton = (Button) findViewById(R.id.clear_cache_button);
28442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
28550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Get list of preferred activities
286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mActivitiesButton = (Button)findViewById(R.id.clear_activities_button);
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<ComponentName> prefActList = new ArrayList<ComponentName>();
28850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Intent list cannot be null. so pass empty list
289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<IntentFilter> intentList = new ArrayList<IntentFilter>();
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mPm.getPreferredActivities(intentList,  prefActList, packageName);
291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch);
293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(prefActList.size() <= 0) {
29450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu             // Disable clear activities button
295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_disable_text);
296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setEnabled(false);
297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_enable_text);
299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setOnClickListener(this);
300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
30250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Security permissions section
303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section);
304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName);
305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(asp.getPermissionCount() > 0) {
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.VISIBLE);
307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             // Make the security sections header visible
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             LinearLayout securityList = (LinearLayout) permsView.findViewById(
309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                     R.id.security_settings_list);
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             securityList.addView(asp.getPermissionsView());
311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.GONE);
313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
31650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void refreshAppAttributes(PackageInfo pkgInfo) {
31750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setAppLabelAndIcon();
31842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        initControlButtons();
31942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        initDataButtons();
32050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
32150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setAppVersion(pkgInfo);
32250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Refresh size info
323a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu        if (mAppInfo != null && mAppInfo.packageName != null) {
324a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu            mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
325a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu        }
326a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu    }
327a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu
32850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set applicaiton label and icon.
32950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void setAppLabelAndIcon() {
33050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        ((ImageView)findViewById(R.id.app_icon)).setImageDrawable(mAppInfo.loadIcon(mPm));
33150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        //set application name TODO version
33250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        CharSequence appName = mAppInfo.loadLabel(mPm);
33350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        if(appName == null) {
33450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            appName = getString(_UNKNOWN_APP);
33550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
33650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        ((TextView)findViewById(R.id.app_name)).setText(appName);
33750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
33850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
33950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set application version
34050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void setAppVersion(PackageInfo pkgInfo) {
34150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
34250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        mAppVersion = ((TextView)findViewById(R.id.app_version));
34350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        if (pkgInfo != null) {
34450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
34550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setText(getString(R.string.version_text,
3468e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
34750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
34850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.GONE);
34950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
35050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
35150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
35250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
35342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
35442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
35550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        PackageInfo pkgInfo;
35650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application info again to refresh changed properties of application
35750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        try {
35850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppInfo = mPm.getApplicationInfo(mAppInfo.packageName,
35950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    PackageManager.GET_UNINSTALLED_PACKAGES);
3609f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn            pkgInfo = mPm.getPackageInfo(mAppInfo.packageName,
3619f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn                    PackageManager.GET_UNINSTALLED_PACKAGES);
36250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } catch (NameNotFoundException e) {
36350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            Log.e(TAG, "Exception when retrieving package:" + mAppInfo.packageName, e);
36450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_APP_NOT_FOUND);
36550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return;
36650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
367cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
36850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        refreshAppAttributes(pkgInfo);
369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
37042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
373afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
375afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        setResult(ManageApplications.RESULT_OK, intent);
376afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(finish) {
377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            finish();
378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle get size info notification from observer when
383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete. The current user data
384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * info has to be refreshed in the manage applications screen as well as the current screen.
385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshSizeInfo(Message msg) {
387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean changed = false;
388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS);
389afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize;
390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mSizeInfo == null) {
391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSizeInfo = newPs;
392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            String str = getSizeStr(newTot);
393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mTotalSize.setText(str);
394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppSize.setText(getSizeStr(newPs.codeSize));
395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDataSize.setText(getSizeStr(newPs.dataSize));
396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mCacheSize.setText(getSizeStr(newPs.cacheSize));
397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize;
399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newTot != oldTot) {
400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String str = getSizeStr(newTot);
401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mTotalSize.setText(str);
402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.codeSize != mSizeInfo.codeSize) {
405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppSize.setText(getSizeStr(newPs.codeSize));
406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.dataSize != mSizeInfo.dataSize) {
409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mDataSize.setText(getSizeStr(newPs.dataSize));
410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.cacheSize != mSizeInfo.cacheSize) {
413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mCacheSize.setText(getSizeStr(newPs.cacheSize));
414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
416afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(changed) {
417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mSizeInfo = newPs;
418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
42042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // If data size is zero disable clear data button
42142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (newPs.dataSize == 0) {
42242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(false);
423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
42442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        long data = mSizeInfo.dataSize;
425afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        refreshCacheInfo(newPs.cacheSize);
426afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
427afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshCacheInfo(long cacheSize) {
429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Set cache info
430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mCacheSize.setText(getSizeStr(cacheSize));
431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (cacheSize <= 0) {
432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setEnabled(false);
433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setOnClickListener(this);
435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
439afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
441afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
443afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
44542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
44742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.getPackageSizeInfo(packageName, mSizeObserver);
449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
45042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
453ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
454ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
455ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
456ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        String packageName = mAppInfo.packageName;
457ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if(result == PackageManager.MOVE_SUCCEEDED) {
458ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
459ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            try {
460ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                // Reset flags
461ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mAppInfo = mPm.getApplicationInfo(packageName,
462ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                        PackageManager.GET_UNINSTALLED_PACKAGES);
463ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                initMoveButton();
464ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            } catch (NameNotFoundException e) {
465ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                // TODO error handling
466ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
467ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
468ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            // TODO Present a dialog indicating failure.
469ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
470ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
471afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
472afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
473afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
474afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
475afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
47642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
47742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
47842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
479afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
48042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
481afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mClearDataObserver == null) {
482afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
483afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
484afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
485afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
486afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(!res) {
48750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
488afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
48950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_CANNOT_CLEAR_DATA);
490afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
49142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
492afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
493afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
494afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
49550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void showDialogInner(int id) {
49650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        //removeDialog(id);
49750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        showDialog(id);
49850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
49950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
50050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
50142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public Dialog onCreateDialog(int id, Bundle args) {
50250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        switch (id) {
50350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CLEAR_DATA:
50450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
50550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_data_dlg_title))
50650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
50750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_data_dlg_text))
50842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setPositiveButton(R.string.dlg_ok,
50942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
51042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
51142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Clear user data here
51242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    initiateClearUserData();
51342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
51442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
51542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
51650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
51750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_FACTORY_RESET:
51850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
51950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_factory_reset_dlg_title))
52050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
52150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_factory_reset_dlg_text))
52242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setPositiveButton(R.string.dlg_ok,
52342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
52442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
52542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Clear user data here
52642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    uninstallPkg(mAppInfo.packageName);
52742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
52842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
52942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
53050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
53150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_APP_NOT_FOUND:
53250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
53350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_not_found_dlg_title))
53450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
53550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_not_found_dlg_title))
53650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(getString(R.string.dlg_ok),
53750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
53850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
53950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
54050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(true, true);
54150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
54250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
54350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
54450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CANNOT_CLEAR_DATA:
54550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
54650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_failed_dlg_title))
54750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
54850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_failed_dlg_text))
54950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(R.string.dlg_ok,
55050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
55150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
55242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    mClearDataButton.setEnabled(false);
55350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
55450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(false, false);
55550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
55650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
55750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
55842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            case DLG_FORCE_STOP:
55942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                return new AlertDialog.Builder(this)
56042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setTitle(getString(R.string.force_stop_dlg_title))
56142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setIcon(android.R.drawable.ic_dialog_alert)
56242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setMessage(getString(R.string.force_stop_dlg_text))
56342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setPositiveButton(R.string.dlg_ok,
56442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
56542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
56642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Force stop
56742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    forceStopPackage(mAppInfo.packageName);
56842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
56942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
57042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
57142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .create();
57250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
57350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        return null;
57450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
57550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
57650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void uninstallPkg(String packageName) {
57750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
57850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
57950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
58050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        startActivity(uninstallIntent);
58150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setIntentAndFinish(true, true);
58250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
58350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
58442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
58542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        ActivityManager am = (ActivityManager)getSystemService(
58642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
58742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
588cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
58942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
59042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
591cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
592cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
593cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
594cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            mForceStopButton.setEnabled(getResultCode() != RESULT_CANCELED);
595cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
596cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
597cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
598cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
599cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
600cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                Uri.fromParts("package", mAppInfo.packageName, null));
601cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppInfo.packageName });
602cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        intent.putExtra(Intent.EXTRA_UID, mAppInfo.uid);
603cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
604cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                Activity.RESULT_CANCELED, null, null);
605cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
606cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
607afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
608afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
609afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
610afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
611afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
612afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
61342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
61442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
61550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                showDialogInner(DLG_FACTORY_RESET);
61642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
61750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                uninstallPkg(packageName);
618afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
619afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
620afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
621afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mActivitiesButton.setEnabled(false);
62242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
62342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mAppInfo.manageSpaceActivityName != null) {
62442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Intent intent = new Intent(Intent.ACTION_DEFAULT);
62542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName);
62642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                startActivityForResult(intent, -1);
62742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
62842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                showDialogInner(DLG_CLEAR_DATA);
62942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
630afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
631afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
632afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
633afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
634afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
635afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
636afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
63742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // TODO Once framework supports a pre-broadcast to
63842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // actually find out if an application will be restarted right
63942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // after its killed, there is no way we can determine if
64042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // a force stop will really kill the app. So just ignore
64142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // the dialog for now and force stop the package. Please note
64242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // that the button cannot be enabled or disabled since
64342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // we do not have this info for now.
64442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            forceStopPackage(mAppInfo.packageName);
645ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
646ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
647ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
648ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
649ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            int moveFlags = (mAppInfo.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0 ?
650ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
651ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
652ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
653ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mPm.movePackage(mAppInfo.packageName, mPackageMoveObserver, moveFlags);
654afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
655afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
656afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
657afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
658