InstalledAppDetails.java revision 728ac35373028b79205a788c526ef4b495518ec1
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
19728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications;
20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
214056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapuimport com.android.internal.content.PackageHelper;
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R;
23728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport com.android.settings.R.id;
24728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport com.android.settings.R.layout;
25728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport com.android.settings.R.string;
26728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.ActivityManager;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog;
3050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.app.Dialog;
31cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver;
384056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapuimport android.content.pm.IPackageManager;
39ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageStatsObserver;
4150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager;
43730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapuimport android.content.pm.PackageParser;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageStats;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler;
494056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapuimport android.os.IBinder;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message;
5150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException;
524056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapuimport android.os.ServiceManager;
534056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapuimport android.os.storage.IMountService;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName;
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
7542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapupublic class InstalledAppDetails extends Activity implements View.OnClickListener {
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int _UNKNOWN_APP=R.string.unknown;
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ApplicationInfo mAppInfo;
7942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mUninstallButton;
80de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private boolean mMoveInProgress = false;
8142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private boolean mUpdatedSysApp = false;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
8350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private boolean localLOGV = false;
8450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private TextView mAppVersion;
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PkgSizeObserver mSizeObserver;
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
9542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mClearDataButton;
9642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mMoveAppButton;
975cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private int mMoveErrorCode;
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    PackageStats mSizeInfo;
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PackageManager mPm;
101ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private PackageMoveObserver mPackageMoveObserver;
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int GET_PKG_SIZE = 2;
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
109ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private static final int PACKAGE_MOVE = 4;
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String ATTR_PACKAGE_STATS="PackageStats";
111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
12050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
12150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
12250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
12350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
12450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
12550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
12642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private static final int DLG_FORCE_STOP = DLG_BASE + 5;
1275cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private static final int DLG_MOVE_FAILED = DLG_BASE + 6;
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
13107f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            // If the activity is gone, don't process any more messages.
13207f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            if (isFinishing()) {
13307f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn                return;
13407f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            }
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case GET_PKG_SIZE:
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    refreshSizeInfo(msg);
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
146ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                case PACKAGE_MOVE:
147ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    processMoveMsg(msg);
148ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    break;
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class PkgSizeObserver extends IPackageStatsObserver.Stub {
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) {
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Message msg = mHandler.obtainMessage(GET_PKG_SIZE);
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Bundle data = new Bundle();
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             data.putParcelable(ATTR_PACKAGE_STATS, pStats);
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             msg.setData(data);
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mHandler.sendMessage(msg);
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
17350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
177ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
181ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
182ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    class PackageMoveObserver extends IPackageMoveObserver.Stub {
183ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        public void packageMoved(String packageName, int returnCode) throws RemoteException {
184ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            final Message msg = mHandler.obtainMessage(PACKAGE_MOVE);
185ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = returnCode;
186ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mHandler.sendMessage(msg);
187ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
188ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return Formatter.formatFileSize(this, size);
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
19742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initDataButtons() {
19842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mAppInfo.manageSpaceActivityName != null) {
19942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.manage_space_text);
20042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
20142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.clear_user_data_text);
20242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
20342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setOnClickListener(this);
204ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
205ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
2065cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private CharSequence getMoveErrMsg(int errCode) {
2075cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        switch (errCode) {
2085cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
2095cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.insufficient_storage);
2105cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_DOESNT_EXIST:
2115cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.does_not_exist);
2125cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_FORWARD_LOCKED:
2135cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.app_forward_locked);
2145cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INVALID_LOCATION:
2155cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.invalid_location);
2165cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE:
2175cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.system_package);
2189a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INTERNAL_ERROR:
2199a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu                return "";
2205cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        }
2219a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu        return "";
2225cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    }
2235cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
224ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void initMoveButton() {
22542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        String pkgName = mAppInfo.packageName;
22642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean dataOnly = false;
22742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        ApplicationInfo info1 = null;
228730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu        PackageInfo pkgInfo = null;
22942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
23042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        try {
23142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            info1 = mPm.getApplicationInfo(pkgName, 0);
232730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu            pkgInfo = mPm.getPackageInfo(mAppInfo.packageName,
233730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu                    PackageManager.GET_UNINSTALLED_PACKAGES);
23442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } catch (NameNotFoundException e) {
23542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
23642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        dataOnly = (info1 == null) && (mAppInfo != null);
237ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        boolean moveDisable = true;
23842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (dataOnly) {
23942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app);
240d2b8efa494288ad01b1deb4449e39279bcd0d7fbSuchi Amalapurapu        } else if ((mAppInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
24142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_internal);
2424056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu            // Always let apps move to internal storage from sdcard.
243ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = false;
24442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
24542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_sdcard);
24630de84777b715a586f85d7665227342e6b67d373Suchi Amalapurapu            if ((mAppInfo.flags & ApplicationInfo.FLAG_FORWARD_LOCK) == 0 &&
24730de84777b715a586f85d7665227342e6b67d373Suchi Amalapurapu                    (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0 &&
24830de84777b715a586f85d7665227342e6b67d373Suchi Amalapurapu                    pkgInfo != null) {
249a3683a51faab316c1577cd13c708a41938bcc646Suchi Amalapurapu                if (pkgInfo.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL ||
250a3683a51faab316c1577cd13c708a41938bcc646Suchi Amalapurapu                        pkgInfo.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
25130de84777b715a586f85d7665227342e6b67d373Suchi Amalapurapu                    moveDisable = false;
2524056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                } else if (pkgInfo.installLocation == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) {
2534056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    IPackageManager ipm  = IPackageManager.Stub.asInterface(
2544056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                            ServiceManager.getService("package"));
2554056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    int loc;
2564056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    try {
2574056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                        loc = ipm.getInstallLocation();
2584056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    } catch (RemoteException e) {
2594056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                        Log.e(TAG, "Is Pakage Manager running?");
2604056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                        return;
2614056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    }
2624056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    if (loc == PackageHelper.APP_INSTALL_EXTERNAL) {
2634056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                        // For apps with no preference and the default value set
2644056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                        // to install on sdcard.
2654056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                        moveDisable = false;
2664056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    }
2674056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                }
2684056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu            }
269730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu        }
270ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if (moveDisable) {
271ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
272ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
273ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setOnClickListener(this);
274ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(true);
275ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
27642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
27742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
278de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void initUninstallButtons() {
27942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUpdatedSysApp = (mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
28042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean enabled = true;
28142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mUpdatedSysApp) {
28242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.app_factory_reset);
28342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
284b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu            if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0){
285b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu                // Disable button for system applications.
286b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu                enabled = false;
287b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu            }
288b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu            mUninstallButton.setText(R.string.uninstall_text);
28942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
29042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
29142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
29242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
29342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
29442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
29542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
29642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
297b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown    private boolean initAppInfo(String packageName) {
298de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        try {
299de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mAppInfo = mPm.getApplicationInfo(packageName,
300de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu                    PackageManager.GET_UNINSTALLED_PACKAGES);
301b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            return true;
302de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        } catch (NameNotFoundException e) {
303de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            Log.e(TAG, "Exception when retrieving package: " + packageName, e);
304de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            showDialogInner(DLG_APP_NOT_FOUND);
305b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            return false;
306de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
307de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    }
308de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu
309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
313b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
31450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get package manager
315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPm = getPackageManager();
316b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
31750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application's name from intent
318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = getIntent();
319728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        final String packageName = intent.getData().getSchemeSpecificPart();
320b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        if (! initAppInfo(packageName)) {
321b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            return; // could not find package, finish called
322b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
323b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Try retrieving package stats again
325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        CharSequence totalSizeStr, appSizeStr, dataSizeStr;
326b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        mComputingStr = getText(R.string.computing_size);
327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        totalSizeStr = appSizeStr = dataSizeStr = mComputingStr;
328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "Have to compute package sizes");
329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mSizeObserver = new PkgSizeObserver();
33050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setContentView(R.layout.installed_app_details);
331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //TODO download str and download url
332b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
33350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize = (TextView)findViewById(R.id.total_size_text);
335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize.setText(totalSizeStr);
336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize = (TextView)findViewById(R.id.application_size_text);
337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize.setText(appSizeStr);
338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize = (TextView)findViewById(R.id.data_size_text);
339afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize.setText(dataSizeStr);
340b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
34142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
34242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        View btnPanel = findViewById(R.id.control_buttons_panel);
34342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
34442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
34542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
346cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
347b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
34842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
34942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        View data_buttons_panel = findViewById(R.id.data_buttons_panel);
35042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
35142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
352b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
353afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         // Cache section
354afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize = (TextView) findViewById(R.id.cache_size_text);
355afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize.setText(mComputingStr);
356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mClearCacheButton = (Button) findViewById(R.id.clear_cache_button);
35742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
35850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Get list of preferred activities
359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mActivitiesButton = (Button)findViewById(R.id.clear_activities_button);
360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<ComponentName> prefActList = new ArrayList<ComponentName>();
361b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
36250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Intent list cannot be null. so pass empty list
363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<IntentFilter> intentList = new ArrayList<IntentFilter>();
364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mPm.getPreferredActivities(intentList,  prefActList, packageName);
365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
366afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch);
367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(prefActList.size() <= 0) {
36850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu             // Disable clear activities button
369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_disable_text);
370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setEnabled(false);
371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_enable_text);
373afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setOnClickListener(this);
374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
375afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
37650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Security permissions section
377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section);
378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName);
379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(asp.getPermissionCount() > 0) {
380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.VISIBLE);
381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             // Make the security sections header visible
382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             LinearLayout securityList = (LinearLayout) permsView.findViewById(
383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                     R.id.security_settings_list);
384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             securityList.addView(asp.getPermissionsView());
385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.GONE);
387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
389f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
39050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set applicaiton label and icon.
391f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    private void setAppLabelAndIcon(PackageInfo pkgInfo) {
392f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        View appSnippet = findViewById(R.id.app_snippet);
393f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
394f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        icon.setImageDrawable(mAppInfo.loadIcon(mPm));
395f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        // Set application name.
396f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
397f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        label.setText(mAppInfo.loadLabel(mPm));
39850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
399f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size);
400f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
401f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        if (pkgInfo != null && pkgInfo.versionName != null) {
40250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
40350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setText(getString(R.string.version_text,
4048e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
40550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
406f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu            mAppVersion.setVisibility(View.INVISIBLE);
40750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
40850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
40950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
41050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
41142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
41242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
413b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
414b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        if (mAppInfo == null) {
415b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            setIntentAndFinish(true, true);
416b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            return; // onCreate must have failed, make sure to exit
417b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
418b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        if (! initAppInfo(mAppInfo.packageName)) {
419b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            return; // could not find package, finish called
420b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
421b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
422de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        PackageInfo pkgInfo = null;
42350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application info again to refresh changed properties of application
42450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        try {
4259f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn            pkgInfo = mPm.getPackageInfo(mAppInfo.packageName,
4269f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn                    PackageManager.GET_UNINSTALLED_PACKAGES);
42750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } catch (NameNotFoundException e) {
42850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            Log.e(TAG, "Exception when retrieving package:" + mAppInfo.packageName, e);
42950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_APP_NOT_FOUND);
430b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            return; // could not find package, finish called
43150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
432b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
433cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
434de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        setAppLabelAndIcon(pkgInfo);
435de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        refreshButtons();
436b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
437de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        // Refresh size info
438de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        if (mAppInfo != null && mAppInfo.packageName != null) {
439de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
440de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
441afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
44242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
443afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
445afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
447afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        setResult(ManageApplications.RESULT_OK, intent);
448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(finish) {
449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            finish();
450afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
453afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
454afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle get size info notification from observer when
455afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete. The current user data
456afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * info has to be refreshed in the manage applications screen as well as the current screen.
457afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
458afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshSizeInfo(Message msg) {
459afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean changed = false;
460afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS);
461afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize;
462afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mSizeInfo == null) {
463afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSizeInfo = newPs;
464afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            String str = getSizeStr(newTot);
465afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mTotalSize.setText(str);
466afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppSize.setText(getSizeStr(newPs.codeSize));
467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDataSize.setText(getSizeStr(newPs.dataSize));
468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mCacheSize.setText(getSizeStr(newPs.cacheSize));
469afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
470afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize;
471afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newTot != oldTot) {
472afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String str = getSizeStr(newTot);
473afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mTotalSize.setText(str);
474afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
475afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
476afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.codeSize != mSizeInfo.codeSize) {
477afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppSize.setText(getSizeStr(newPs.codeSize));
478afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
479afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
480afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.dataSize != mSizeInfo.dataSize) {
481afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mDataSize.setText(getSizeStr(newPs.dataSize));
482afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
483afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
484afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.cacheSize != mSizeInfo.cacheSize) {
485afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mCacheSize.setText(getSizeStr(newPs.cacheSize));
486afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
487afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
488afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(changed) {
489afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mSizeInfo = newPs;
490afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
491afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
49242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // If data size is zero disable clear data button
49342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (newPs.dataSize == 0) {
49442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(false);
495afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
49642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        long data = mSizeInfo.dataSize;
497afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        refreshCacheInfo(newPs.cacheSize);
498afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
499afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
500afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshCacheInfo(long cacheSize) {
501afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Set cache info
502afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mCacheSize.setText(getSizeStr(cacheSize));
503afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (cacheSize <= 0) {
504afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setEnabled(false);
505afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
506afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setOnClickListener(this);
507afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
508afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
509afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
510afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
511afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
512afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
513afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
514afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
515afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
516afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
51742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
518afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
51942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
520afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.getPackageSizeInfo(packageName, mSizeObserver);
521afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
52242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
523afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
524afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
525ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
526de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void refreshButtons() {
527de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        if (!mMoveInProgress) {
528de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initUninstallButtons();
529de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initDataButtons();
530de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initMoveButton();
531de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        } else {
532de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
533de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setEnabled(false);
534de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mUninstallButton.setEnabled(false);
535de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
536de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    }
537de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu
538ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
539ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
540ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        String packageName = mAppInfo.packageName;
541de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        // Refresh the button attributes.
542de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        mMoveInProgress = false;
543ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if(result == PackageManager.MOVE_SUCCEEDED) {
544ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
545de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            // Refresh size information again.
546b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            mPm.getPackageSizeInfo(packageName, mSizeObserver);
547ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
5485cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            mMoveErrorCode = result;
5495cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            showDialogInner(DLG_MOVE_FAILED);
550ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
551b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
552b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        if (! initAppInfo(packageName)) {
553b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            return; // could not find package, finish called
554b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
555b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
556b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        refreshButtons();
557ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
5585cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
559afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
560afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
561afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
562afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
56342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
56442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
56542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
566afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
56742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
568afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mClearDataObserver == null) {
569afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
570afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
571afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
572afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
573afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(!res) {
57450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
575afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
57650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_CANNOT_CLEAR_DATA);
577afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
57842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
579afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
580afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
581afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
58250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void showDialogInner(int id) {
58350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        //removeDialog(id);
58450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        showDialog(id);
58550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
58650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
58750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
58842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public Dialog onCreateDialog(int id, Bundle args) {
58950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        switch (id) {
59050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CLEAR_DATA:
59150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
59250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_data_dlg_title))
59350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
59450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_data_dlg_text))
59542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setPositiveButton(R.string.dlg_ok,
59642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
59742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
59842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Clear user data here
59942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    initiateClearUserData();
60042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
60142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
60242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
60350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
60450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_FACTORY_RESET:
60550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
60650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_factory_reset_dlg_title))
60750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
60850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_factory_reset_dlg_text))
60942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setPositiveButton(R.string.dlg_ok,
61042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
61142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
61242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Clear user data here
61342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    uninstallPkg(mAppInfo.packageName);
61442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
61542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
61642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
61750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
61850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_APP_NOT_FOUND:
61950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
62050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_not_found_dlg_title))
62150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
62250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_not_found_dlg_title))
62350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(getString(R.string.dlg_ok),
62450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
62550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
62650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
62750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(true, true);
62850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
62950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
63050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
63150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CANNOT_CLEAR_DATA:
63250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
63350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_failed_dlg_title))
63450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
63550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_failed_dlg_text))
63650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(R.string.dlg_ok,
63750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
63850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
63942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    mClearDataButton.setEnabled(false);
64050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
64150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(false, false);
64250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
64350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
64450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
64542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            case DLG_FORCE_STOP:
64642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                return new AlertDialog.Builder(this)
64742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setTitle(getString(R.string.force_stop_dlg_title))
64842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setIcon(android.R.drawable.ic_dialog_alert)
64942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setMessage(getString(R.string.force_stop_dlg_text))
65042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setPositiveButton(R.string.dlg_ok,
65142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
65242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
65342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Force stop
65442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    forceStopPackage(mAppInfo.packageName);
65542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
65642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
65742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
65842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .create();
6595cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case DLG_MOVE_FAILED:
6605cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                CharSequence msg = getString(R.string.move_app_failed_dlg_text,
6615cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                        getMoveErrMsg(mMoveErrorCode));
6625cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return new AlertDialog.Builder(this)
6635cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                .setTitle(getString(R.string.move_app_failed_dlg_title))
6645cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                .setIcon(android.R.drawable.ic_dialog_alert)
6655cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                .setMessage(msg)
6665cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                .setNeutralButton(R.string.dlg_ok, null)
6675cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                .create();
66850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
66950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        return null;
67050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
67150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
67250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void uninstallPkg(String packageName) {
67350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
67450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
67550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
67650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        startActivity(uninstallIntent);
67750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setIntentAndFinish(true, true);
67850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
67950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
68042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
68142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        ActivityManager am = (ActivityManager)getSystemService(
68242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
68342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
684cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
68542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
68642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
687cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
688cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
689cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
690cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            mForceStopButton.setEnabled(getResultCode() != RESULT_CANCELED);
69197de6bccfe81655a16feb988da1d208f95a8d6e3Dianne Hackborn            mForceStopButton.setOnClickListener(InstalledAppDetails.this);
692cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
693cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
694cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
695cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
696cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
697cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                Uri.fromParts("package", mAppInfo.packageName, null));
698cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppInfo.packageName });
699cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        intent.putExtra(Intent.EXTRA_UID, mAppInfo.uid);
700cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
701cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                Activity.RESULT_CANCELED, null, null);
702cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
703cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
704afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
705afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
706afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
707afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
708afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
709afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
71042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
71142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
71250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                showDialogInner(DLG_FACTORY_RESET);
71342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
71450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                uninstallPkg(packageName);
715afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
716afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
717afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
718afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mActivitiesButton.setEnabled(false);
71942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
72042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mAppInfo.manageSpaceActivityName != null) {
72142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Intent intent = new Intent(Intent.ACTION_DEFAULT);
72242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName);
72342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                startActivityForResult(intent, -1);
72442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
72542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                showDialogInner(DLG_CLEAR_DATA);
72642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
727afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
728afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
729afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
730afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
731afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
732afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
733afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
73442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            forceStopPackage(mAppInfo.packageName);
735ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
736ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
737ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
738ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
739d2b8efa494288ad01b1deb4449e39279bcd0d7fbSuchi Amalapurapu            int moveFlags = (mAppInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ?
740ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
741de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveInProgress = true;
742de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            refreshButtons();
743ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mPm.movePackage(mAppInfo.packageName, mPackageMoveObserver, moveFlags);
744afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
745afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
746afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
747afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
748