InstalledAppDetails.java revision 07f636059a2fb45f2d8284fedbbbba2c78b05157
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;
37730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapuimport android.content.pm.PackageParser;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageStats;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message;
4450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
6642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapupublic class InstalledAppDetails extends Activity implements View.OnClickListener {
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int _UNKNOWN_APP=R.string.unknown;
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ApplicationInfo mAppInfo;
7042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mUninstallButton;
71de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private boolean mMoveInProgress = false;
7242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private boolean mUpdatedSysApp = false;
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
7450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private boolean localLOGV = false;
7550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private TextView mAppVersion;
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PkgSizeObserver mSizeObserver;
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
8642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mClearDataButton;
8742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mMoveAppButton;
885cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private int mMoveErrorCode;
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    PackageStats mSizeInfo;
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PackageManager mPm;
92ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private PackageMoveObserver mPackageMoveObserver;
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int GET_PKG_SIZE = 2;
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
100ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private static final int PACKAGE_MOVE = 4;
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String ATTR_PACKAGE_STATS="PackageStats";
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
11150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
11250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
11350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
11450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
11550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
11650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
11742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private static final int DLG_FORCE_STOP = DLG_BASE + 5;
1185cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private static final int DLG_MOVE_FAILED = DLG_BASE + 6;
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
12207f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            // If the activity is gone, don't process any more messages.
12307f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            if (isFinishing()) {
12407f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn                return;
12507f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            }
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case GET_PKG_SIZE:
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    refreshSizeInfo(msg);
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
137ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                case PACKAGE_MOVE:
138ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    processMoveMsg(msg);
139ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    break;
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class PkgSizeObserver extends IPackageStatsObserver.Stub {
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) {
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Message msg = mHandler.obtainMessage(GET_PKG_SIZE);
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Bundle data = new Bundle();
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             data.putParcelable(ATTR_PACKAGE_STATS, pStats);
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             msg.setData(data);
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mHandler.sendMessage(msg);
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
16450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
168ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
172ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
173ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    class PackageMoveObserver extends IPackageMoveObserver.Stub {
174ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        public void packageMoved(String packageName, int returnCode) throws RemoteException {
175ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            final Message msg = mHandler.obtainMessage(PACKAGE_MOVE);
176ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = returnCode;
177ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mHandler.sendMessage(msg);
178ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
179ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return Formatter.formatFileSize(this, size);
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
18842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initDataButtons() {
18942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mAppInfo.manageSpaceActivityName != null) {
19042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.manage_space_text);
19142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
19242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.clear_user_data_text);
19342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
19442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setOnClickListener(this);
195ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
196ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
1975cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private CharSequence getMoveErrMsg(int errCode) {
1985cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        switch (errCode) {
1995cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
2005cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.insufficient_storage);
2015cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_DOESNT_EXIST:
2025cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.does_not_exist);
2035cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_FORWARD_LOCKED:
2045cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.app_forward_locked);
2055cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INVALID_LOCATION:
2065cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.invalid_location);
2075cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE:
2085cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.system_package);
2099a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INTERNAL_ERROR:
2109a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu                return "";
2115cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        }
2129a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu        return "";
2135cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    }
2145cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
215ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void initMoveButton() {
21642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        String pkgName = mAppInfo.packageName;
21742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean dataOnly = false;
21842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        ApplicationInfo info1 = null;
219730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu        PackageInfo pkgInfo = null;
22042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
22142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        try {
22242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            info1 = mPm.getApplicationInfo(pkgName, 0);
223730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu            pkgInfo = mPm.getPackageInfo(mAppInfo.packageName,
224730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu                    PackageManager.GET_UNINSTALLED_PACKAGES);
22542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } catch (NameNotFoundException e) {
22642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
22742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        dataOnly = (info1 == null) && (mAppInfo != null);
228ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        boolean moveDisable = true;
22942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (dataOnly) {
23042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app);
231d2b8efa494288ad01b1deb4449e39279bcd0d7fbSuchi Amalapurapu        } else if ((mAppInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
23242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_internal);
233ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = false;
23442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
235ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = (mAppInfo.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0 ||
236ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
23742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_sdcard);
23842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
239730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu        if (pkgInfo != null && pkgInfo.installLocation ==
240730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu            PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) {
241730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu            // If an application explicitly specifies install location
242730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu            // consider that
243730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu            moveDisable = true;
244730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu        }
245ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if (moveDisable) {
246ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
247ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
248ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setOnClickListener(this);
249ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(true);
250ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
25142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
25242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
253de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void initUninstallButtons() {
25442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUpdatedSysApp = (mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
25542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean enabled = true;
25642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mUpdatedSysApp) {
25742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.app_factory_reset);
25842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0){
25942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.uninstall_text);
26042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
26142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Disable uninstall for system apps
26242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            enabled = false;
26342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
26442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
26542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
26642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
26742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
26842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
26942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
27042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
271de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void initAppInfo(String packageName) {
272de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        try {
273de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mAppInfo = mPm.getApplicationInfo(packageName,
274de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu                    PackageManager.GET_UNINSTALLED_PACKAGES);
275de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        } catch (NameNotFoundException e) {
276de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            Log.e(TAG, "Exception when retrieving package: " + packageName, e);
277de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            showDialogInner(DLG_APP_NOT_FOUND);
278de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            return;
279de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
280de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    }
281de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu
282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
28650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get package manager
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPm = getPackageManager();
28850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application's name from intent
289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = getIntent();
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME);
291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mComputingStr = getText(R.string.computing_size);
292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Try retrieving package stats again
293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        CharSequence totalSizeStr, appSizeStr, dataSizeStr;
294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        totalSizeStr = appSizeStr = dataSizeStr = mComputingStr;
295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "Have to compute package sizes");
296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mSizeObserver = new PkgSizeObserver();
297de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        initAppInfo(packageName);
29850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setContentView(R.layout.installed_app_details);
299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //TODO download str and download url
30050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize = (TextView)findViewById(R.id.total_size_text);
302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize.setText(totalSizeStr);
303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize = (TextView)findViewById(R.id.application_size_text);
304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize.setText(appSizeStr);
305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize = (TextView)findViewById(R.id.data_size_text);
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize.setText(dataSizeStr);
30742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
30842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        View btnPanel = findViewById(R.id.control_buttons_panel);
30942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
31042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
31142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
312cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
31342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
31442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        View data_buttons_panel = findViewById(R.id.data_buttons_panel);
31542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
31642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         // Cache section
318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize = (TextView) findViewById(R.id.cache_size_text);
319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize.setText(mComputingStr);
320afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mClearCacheButton = (Button) findViewById(R.id.clear_cache_button);
32142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
32250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Get list of preferred activities
323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mActivitiesButton = (Button)findViewById(R.id.clear_activities_button);
324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<ComponentName> prefActList = new ArrayList<ComponentName>();
32550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Intent list cannot be null. so pass empty list
326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<IntentFilter> intentList = new ArrayList<IntentFilter>();
327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mPm.getPreferredActivities(intentList,  prefActList, packageName);
328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch);
330afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(prefActList.size() <= 0) {
33150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu             // Disable clear activities button
332afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_disable_text);
333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setEnabled(false);
334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_enable_text);
336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setOnClickListener(this);
337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
33950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Security permissions section
340afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section);
341afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName);
342afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(asp.getPermissionCount() > 0) {
343afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.VISIBLE);
344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             // Make the security sections header visible
345afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             LinearLayout securityList = (LinearLayout) permsView.findViewById(
346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                     R.id.security_settings_list);
347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             securityList.addView(asp.getPermissionsView());
348afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.GONE);
350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
352f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
35350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set applicaiton label and icon.
354f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    private void setAppLabelAndIcon(PackageInfo pkgInfo) {
355f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        View appSnippet = findViewById(R.id.app_snippet);
356f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
357f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        icon.setImageDrawable(mAppInfo.loadIcon(mPm));
358f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        // Set application name.
359f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
360f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        label.setText(mAppInfo.loadLabel(mPm));
36150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
362f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size);
363f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
364f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        if (pkgInfo != null && pkgInfo.versionName != null) {
36550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
36650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setText(getString(R.string.version_text,
3678e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
36850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
369f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu            mAppVersion.setVisibility(View.INVISIBLE);
37050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
37150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
37250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
37350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
37442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
37542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
376de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        initAppInfo(mAppInfo.packageName);
377de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        PackageInfo pkgInfo = null;
37850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application info again to refresh changed properties of application
37950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        try {
3809f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn            pkgInfo = mPm.getPackageInfo(mAppInfo.packageName,
3819f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn                    PackageManager.GET_UNINSTALLED_PACKAGES);
38250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } catch (NameNotFoundException e) {
38350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            Log.e(TAG, "Exception when retrieving package:" + mAppInfo.packageName, e);
38450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_APP_NOT_FOUND);
38550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return;
38650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
387cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
388de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        setAppLabelAndIcon(pkgInfo);
389de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        refreshButtons();
390de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        // Refresh size info
391de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        if (mAppInfo != null && mAppInfo.packageName != null) {
392de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
393de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
39542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        setResult(ManageApplications.RESULT_OK, intent);
401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(finish) {
402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            finish();
403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle get size info notification from observer when
408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete. The current user data
409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * info has to be refreshed in the manage applications screen as well as the current screen.
410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshSizeInfo(Message msg) {
412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean changed = false;
413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS);
414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize;
415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mSizeInfo == null) {
416afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSizeInfo = newPs;
417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            String str = getSizeStr(newTot);
418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mTotalSize.setText(str);
419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppSize.setText(getSizeStr(newPs.codeSize));
420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDataSize.setText(getSizeStr(newPs.dataSize));
421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mCacheSize.setText(getSizeStr(newPs.cacheSize));
422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize;
424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newTot != oldTot) {
425afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String str = getSizeStr(newTot);
426afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mTotalSize.setText(str);
427afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.codeSize != mSizeInfo.codeSize) {
430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppSize.setText(getSizeStr(newPs.codeSize));
431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.dataSize != mSizeInfo.dataSize) {
434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mDataSize.setText(getSizeStr(newPs.dataSize));
435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.cacheSize != mSizeInfo.cacheSize) {
438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mCacheSize.setText(getSizeStr(newPs.cacheSize));
439afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
441afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(changed) {
442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mSizeInfo = newPs;
443afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
44542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // If data size is zero disable clear data button
44642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (newPs.dataSize == 0) {
44742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(false);
448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
44942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        long data = mSizeInfo.dataSize;
450afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        refreshCacheInfo(newPs.cacheSize);
451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
453afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshCacheInfo(long cacheSize) {
454afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Set cache info
455afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mCacheSize.setText(getSizeStr(cacheSize));
456afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (cacheSize <= 0) {
457afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setEnabled(false);
458afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
459afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setOnClickListener(this);
460afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
461afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
462afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
463afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
464afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
465afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
466afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
469afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
47042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
471afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
47242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
473afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.getPackageSizeInfo(packageName, mSizeObserver);
474afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
47542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
476afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
477afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
478ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
479de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void refreshButtons() {
480de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        if (!mMoveInProgress) {
481de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            // Refresh application information again.
482de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initAppInfo(mAppInfo.packageName);
483de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initUninstallButtons();
484de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initDataButtons();
485de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initMoveButton();
486de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        } else {
487de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
488de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setEnabled(false);
489de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mUninstallButton.setEnabled(false);
490de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
491de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    }
492de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu
493ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
494ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
495ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        String packageName = mAppInfo.packageName;
496de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        // Refresh the button attributes.
497de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        mMoveInProgress = false;
498de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        refreshButtons();
499ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if(result == PackageManager.MOVE_SUCCEEDED) {
500ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
501de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            // Refresh size information again.
502de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
503ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
5045cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            mMoveErrorCode = result;
5055cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            showDialogInner(DLG_MOVE_FAILED);
506ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
507ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
5085cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
509afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
510afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
511afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
512afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
51342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
51442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
51542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
516afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
51742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
518afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mClearDataObserver == null) {
519afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
520afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
521afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
522afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
523afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(!res) {
52450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
525afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
52650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_CANNOT_CLEAR_DATA);
527afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
52842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
529afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
530afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
531afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
53250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void showDialogInner(int id) {
53350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        //removeDialog(id);
53450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        showDialog(id);
53550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
53650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
53750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
53842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public Dialog onCreateDialog(int id, Bundle args) {
53950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        switch (id) {
54050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CLEAR_DATA:
54150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
54250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_data_dlg_title))
54350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
54450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_data_dlg_text))
54542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setPositiveButton(R.string.dlg_ok,
54642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
54742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
54842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Clear user data here
54942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    initiateClearUserData();
55042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
55142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
55242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
55350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
55450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_FACTORY_RESET:
55550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
55650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_factory_reset_dlg_title))
55750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
55850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_factory_reset_dlg_text))
55942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setPositiveButton(R.string.dlg_ok,
56042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
56142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
56242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Clear user data here
56342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    uninstallPkg(mAppInfo.packageName);
56442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
56542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
56642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
56750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
56850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_APP_NOT_FOUND:
56950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
57050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_not_found_dlg_title))
57150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
57250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_not_found_dlg_title))
57350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(getString(R.string.dlg_ok),
57450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
57550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
57650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
57750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(true, true);
57850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
57950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
58050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
58150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CANNOT_CLEAR_DATA:
58250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
58350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_failed_dlg_title))
58450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
58550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_failed_dlg_text))
58650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(R.string.dlg_ok,
58750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
58850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
58942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    mClearDataButton.setEnabled(false);
59050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
59150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(false, false);
59250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
59350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
59450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
59542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            case DLG_FORCE_STOP:
59642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                return new AlertDialog.Builder(this)
59742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setTitle(getString(R.string.force_stop_dlg_title))
59842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setIcon(android.R.drawable.ic_dialog_alert)
59942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setMessage(getString(R.string.force_stop_dlg_text))
60042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setPositiveButton(R.string.dlg_ok,
60142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
60242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
60342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Force stop
60442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    forceStopPackage(mAppInfo.packageName);
60542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
60642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
60742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
60842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .create();
6095cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case DLG_MOVE_FAILED:
6105cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                CharSequence msg = getString(R.string.move_app_failed_dlg_text,
6115cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                        getMoveErrMsg(mMoveErrorCode));
6125cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return new AlertDialog.Builder(this)
6135cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                .setTitle(getString(R.string.move_app_failed_dlg_title))
6145cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                .setIcon(android.R.drawable.ic_dialog_alert)
6155cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                .setMessage(msg)
6165cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                .setNeutralButton(R.string.dlg_ok, null)
6175cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                .create();
61850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
61950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        return null;
62050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
62150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
62250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void uninstallPkg(String packageName) {
62350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
62450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
62550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
62650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        startActivity(uninstallIntent);
62750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setIntentAndFinish(true, true);
62850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
62950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
63042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
63142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        ActivityManager am = (ActivityManager)getSystemService(
63242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
63342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
634cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
63542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
63642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
637cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
638cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
639cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
640cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            mForceStopButton.setEnabled(getResultCode() != RESULT_CANCELED);
64197de6bccfe81655a16feb988da1d208f95a8d6e3Dianne Hackborn            mForceStopButton.setOnClickListener(InstalledAppDetails.this);
642cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
643cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
644cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
645cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
646cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
647cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                Uri.fromParts("package", mAppInfo.packageName, null));
648cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppInfo.packageName });
649cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        intent.putExtra(Intent.EXTRA_UID, mAppInfo.uid);
650cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
651cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                Activity.RESULT_CANCELED, null, null);
652cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
653cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
654afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
655afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
656afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
657afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
658afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
659afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
66042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
66142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
66250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                showDialogInner(DLG_FACTORY_RESET);
66342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
66450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                uninstallPkg(packageName);
665afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
666afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
667afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
668afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mActivitiesButton.setEnabled(false);
66942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
67042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mAppInfo.manageSpaceActivityName != null) {
67142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Intent intent = new Intent(Intent.ACTION_DEFAULT);
67242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName);
67342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                startActivityForResult(intent, -1);
67442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
67542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                showDialogInner(DLG_CLEAR_DATA);
67642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
677afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
678afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
679afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
680afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
681afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
682afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
683afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
68442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            forceStopPackage(mAppInfo.packageName);
685ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
686ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
687ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
688ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
689d2b8efa494288ad01b1deb4449e39279bcd0d7fbSuchi Amalapurapu            int moveFlags = (mAppInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ?
690ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
691de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveInProgress = true;
692de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            refreshButtons();
693ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mPm.movePackage(mAppInfo.packageName, mPackageMoveObserver, moveFlags);
694afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
695afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
696afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
697afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
698