InstalledAppDetails.java revision ad1482712de6e7cac803ed02abcdc2efb47d43ba
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;
2642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapuimport android.app.ActivityManager.RunningAppProcessInfo;
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;
3350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.IPackageDeleteObserver;
34ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageStatsObserver;
3650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager;
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.Config;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
6742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapupublic class InstalledAppDetails extends Activity implements View.OnClickListener {
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int _UNKNOWN_APP=R.string.unknown;
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ApplicationInfo mAppInfo;
7142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mUninstallButton;
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;
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    PackageStats mSizeInfo;
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PackageManager mPm;
91ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private PackageMoveObserver mPackageMoveObserver;
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int GET_PKG_SIZE = 2;
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
99ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private static final int PACKAGE_MOVE = 4;
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String ATTR_PACKAGE_STATS="PackageStats";
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
11050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
11150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
11250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
11350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
11450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
11550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
11642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private static final int DLG_FORCE_STOP = DLG_BASE + 5;
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case GET_PKG_SIZE:
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    refreshSizeInfo(msg);
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
131ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                case PACKAGE_MOVE:
132ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    processMoveMsg(msg);
133ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    break;
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class PkgSizeObserver extends IPackageStatsObserver.Stub {
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) {
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Message msg = mHandler.obtainMessage(GET_PKG_SIZE);
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Bundle data = new Bundle();
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             data.putParcelable(ATTR_PACKAGE_STATS, pStats);
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             msg.setData(data);
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mHandler.sendMessage(msg);
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
15850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
162ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
166ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
167ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    class PackageMoveObserver extends IPackageMoveObserver.Stub {
168ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        public void packageMoved(String packageName, int returnCode) throws RemoteException {
169ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            final Message msg = mHandler.obtainMessage(PACKAGE_MOVE);
170ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = returnCode;
171ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mHandler.sendMessage(msg);
172ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
173ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return Formatter.formatFileSize(this, size);
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
18242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initDataButtons() {
18342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mAppInfo.manageSpaceActivityName != null) {
18442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.manage_space_text);
18542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
18642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.clear_user_data_text);
18742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
18842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setOnClickListener(this);
189ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        initMoveButton();
190ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
191ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
192ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void initMoveButton() {
19342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        String pkgName = mAppInfo.packageName;
19442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean dataOnly = false;
19542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        ApplicationInfo info1 = null;
19642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
19742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        try {
19842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            info1 = mPm.getApplicationInfo(pkgName, 0);
19942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } catch (NameNotFoundException e) {
20042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
20142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        dataOnly = (info1 == null) && (mAppInfo != null);
202ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        boolean moveDisable = true;
20342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (dataOnly) {
20442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app);
20542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if ((mAppInfo.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0) {
20642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_internal);
207ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = false;
20842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
209ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = (mAppInfo.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0 ||
210ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
21142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_sdcard);
21242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
213ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if (moveDisable) {
214ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
215ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
216ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setOnClickListener(this);
217ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(true);
218ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
21942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
22042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
22142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initControlButtons() {
22242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUpdatedSysApp = (mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
22342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean enabled = true;
22442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mUpdatedSysApp) {
22542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.app_factory_reset);
22642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0){
22742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.uninstall_text);
22842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
22942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Disable uninstall for system apps
23042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            enabled = false;
23142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
23242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
23342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
23442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
23542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
23642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
23742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
23842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        List<RunningAppProcessInfo> rList = am.getRunningAppProcesses();
23942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean running = false;
24042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (rList != null) {
24142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            for (RunningAppProcessInfo info : rList) {
24242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                if (info.pkgList != null) {
24342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    for (String rpkg : info.pkgList) {
24442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                        if (rpkg.equals(mAppInfo.packageName)) {
24542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                            running = true;
24642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                            break;
24742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                        }
24842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    }
24942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
25042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
25142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
25242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setEnabled(running);
25342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (running) {
25442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mForceStopButton.setOnClickListener(this);
25542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
25642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
25742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
26250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get package manager
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPm = getPackageManager();
26450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application's name from intent
265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = getIntent();
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME);
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mComputingStr = getText(R.string.computing_size);
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Try retrieving package stats again
269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        CharSequence totalSizeStr, appSizeStr, dataSizeStr;
270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        totalSizeStr = appSizeStr = dataSizeStr = mComputingStr;
271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "Have to compute package sizes");
272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mSizeObserver = new PkgSizeObserver();
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppInfo = mPm.getApplicationInfo(packageName,
275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    PackageManager.GET_UNINSTALLED_PACKAGES);
276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (NameNotFoundException e) {
277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.e(TAG, "Exception when retrieving package:"+packageName, e);
27850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_APP_NOT_FOUND);
27950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return;
280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
28150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setContentView(R.layout.installed_app_details);
282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //TODO download str and download url
28350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize = (TextView)findViewById(R.id.total_size_text);
285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize.setText(totalSizeStr);
286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize = (TextView)findViewById(R.id.application_size_text);
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize.setText(appSizeStr);
288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize = (TextView)findViewById(R.id.data_size_text);
289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize.setText(dataSizeStr);
29042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
29142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        View btnPanel = findViewById(R.id.control_buttons_panel);
29242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
29342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
29442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
29542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        initControlButtons();
29642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
29742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        View data_buttons_panel = findViewById(R.id.data_buttons_panel);
29842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
29942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         // Cache section
301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize = (TextView) findViewById(R.id.cache_size_text);
302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize.setText(mComputingStr);
303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mClearCacheButton = (Button) findViewById(R.id.clear_cache_button);
30442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
30550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Get list of preferred activities
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mActivitiesButton = (Button)findViewById(R.id.clear_activities_button);
307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<ComponentName> prefActList = new ArrayList<ComponentName>();
30850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Intent list cannot be null. so pass empty list
309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<IntentFilter> intentList = new ArrayList<IntentFilter>();
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mPm.getPreferredActivities(intentList,  prefActList, packageName);
311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch);
313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(prefActList.size() <= 0) {
31450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu             // Disable clear activities button
315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_disable_text);
316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setEnabled(false);
317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_enable_text);
319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setOnClickListener(this);
320afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
32250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Security permissions section
323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section);
324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName);
325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(asp.getPermissionCount() > 0) {
326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.VISIBLE);
327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             // Make the security sections header visible
328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             LinearLayout securityList = (LinearLayout) permsView.findViewById(
329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                     R.id.security_settings_list);
330afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             securityList.addView(asp.getPermissionsView());
331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
332afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.GONE);
333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
33650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void refreshAppAttributes(PackageInfo pkgInfo) {
33750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setAppLabelAndIcon();
33842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        initControlButtons();
33942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        initDataButtons();
34050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
34150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setAppVersion(pkgInfo);
34250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Refresh size info
343a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu        if (mAppInfo != null && mAppInfo.packageName != null) {
344a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu            mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
345a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu        }
346a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu    }
347a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu
34850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set applicaiton label and icon.
34950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void setAppLabelAndIcon() {
35050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        ((ImageView)findViewById(R.id.app_icon)).setImageDrawable(mAppInfo.loadIcon(mPm));
35150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        //set application name TODO version
35250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        CharSequence appName = mAppInfo.loadLabel(mPm);
35350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        if(appName == null) {
35450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            appName = getString(_UNKNOWN_APP);
35550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
35650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        ((TextView)findViewById(R.id.app_name)).setText(appName);
35750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
35850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
35950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set application version
36050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void setAppVersion(PackageInfo pkgInfo) {
36150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
36250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        mAppVersion = ((TextView)findViewById(R.id.app_version));
36350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        if (pkgInfo != null) {
36450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
36550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setText(getString(R.string.version_text,
3668e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
36750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
36850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.GONE);
36950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
37050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
37150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
37250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
37342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
37442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
37550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        PackageInfo pkgInfo;
37650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application info again to refresh changed properties of application
37750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        try {
37850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppInfo = mPm.getApplicationInfo(mAppInfo.packageName,
37950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    PackageManager.GET_UNINSTALLED_PACKAGES);
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        }
38750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        refreshAppAttributes(pkgInfo);
388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
38942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        setResult(ManageApplications.RESULT_OK, intent);
395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(finish) {
396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            finish();
397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle get size info notification from observer when
402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete. The current user data
403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * info has to be refreshed in the manage applications screen as well as the current screen.
404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshSizeInfo(Message msg) {
406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean changed = false;
407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS);
408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize;
409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mSizeInfo == null) {
410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSizeInfo = newPs;
411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            String str = getSizeStr(newTot);
412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mTotalSize.setText(str);
413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppSize.setText(getSizeStr(newPs.codeSize));
414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDataSize.setText(getSizeStr(newPs.dataSize));
415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mCacheSize.setText(getSizeStr(newPs.cacheSize));
416afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize;
418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newTot != oldTot) {
419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String str = getSizeStr(newTot);
420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mTotalSize.setText(str);
421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.codeSize != mSizeInfo.codeSize) {
424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppSize.setText(getSizeStr(newPs.codeSize));
425afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
426afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
427afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.dataSize != mSizeInfo.dataSize) {
428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mDataSize.setText(getSizeStr(newPs.dataSize));
429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.cacheSize != mSizeInfo.cacheSize) {
432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mCacheSize.setText(getSizeStr(newPs.cacheSize));
433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(changed) {
436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mSizeInfo = newPs;
437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
43942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // If data size is zero disable clear data button
44042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (newPs.dataSize == 0) {
44142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(false);
442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
44342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        long data = mSizeInfo.dataSize;
444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        refreshCacheInfo(newPs.cacheSize);
445afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
447afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshCacheInfo(long cacheSize) {
448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Set cache info
449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mCacheSize.setText(getSizeStr(cacheSize));
450afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (cacheSize <= 0) {
451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setEnabled(false);
452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
453afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setOnClickListener(this);
454afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
455afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
456afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
457afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
458afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
459afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
460afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
461afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
462afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
463afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
46442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
465afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
46642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.getPackageSizeInfo(packageName, mSizeObserver);
468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
46942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
470afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
471afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
472ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
473ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
474ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
475ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        String packageName = mAppInfo.packageName;
476ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if(result == PackageManager.MOVE_SUCCEEDED) {
477ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
478ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            try {
479ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                // Reset flags
480ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mAppInfo = mPm.getApplicationInfo(packageName,
481ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                        PackageManager.GET_UNINSTALLED_PACKAGES);
482ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                initMoveButton();
483ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            } catch (NameNotFoundException e) {
484ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                // TODO error handling
485ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
486ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
487ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            // TODO Present a dialog indicating failure.
488ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
489ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
490afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
491afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
492afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
493afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
494afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
49542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
49642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
49742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
498afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
49942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
500afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mClearDataObserver == null) {
501afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
502afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
503afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
504afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
505afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(!res) {
50650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
507afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
50850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_CANNOT_CLEAR_DATA);
509afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
51042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
511afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
512afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
513afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
51450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void showDialogInner(int id) {
51550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        //removeDialog(id);
51650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        showDialog(id);
51750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
51850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
51950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
52042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public Dialog onCreateDialog(int id, Bundle args) {
52150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        switch (id) {
52250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CLEAR_DATA:
52350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
52450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_data_dlg_title))
52550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
52650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_data_dlg_text))
52742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setPositiveButton(R.string.dlg_ok,
52842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
52942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
53042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Clear user data here
53142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    initiateClearUserData();
53242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
53342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
53442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
53550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
53650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_FACTORY_RESET:
53750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
53850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_factory_reset_dlg_title))
53950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
54050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_factory_reset_dlg_text))
54142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setPositiveButton(R.string.dlg_ok,
54242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
54342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
54442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Clear user data here
54542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    uninstallPkg(mAppInfo.packageName);
54642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
54742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
54842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
54950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
55050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_APP_NOT_FOUND:
55150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
55250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_not_found_dlg_title))
55350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
55450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_not_found_dlg_title))
55550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(getString(R.string.dlg_ok),
55650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
55750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
55850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
55950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(true, true);
56050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
56150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
56250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
56350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CANNOT_CLEAR_DATA:
56450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
56550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_failed_dlg_title))
56650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
56750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_failed_dlg_text))
56850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(R.string.dlg_ok,
56950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
57050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
57142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    mClearDataButton.setEnabled(false);
57250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
57350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(false, false);
57450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
57550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
57650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
57742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            case DLG_FORCE_STOP:
57842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                return new AlertDialog.Builder(this)
57942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setTitle(getString(R.string.force_stop_dlg_title))
58042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setIcon(android.R.drawable.ic_dialog_alert)
58142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setMessage(getString(R.string.force_stop_dlg_text))
58242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setPositiveButton(R.string.dlg_ok,
58342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
58442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
58542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Force stop
58642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    forceStopPackage(mAppInfo.packageName);
58742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
58842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
58942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
59042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .create();
59150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
59250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        return null;
59350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
59450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
59550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void uninstallPkg(String packageName) {
59650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
59750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
59850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
59950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        startActivity(uninstallIntent);
60050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setIntentAndFinish(true, true);
60150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
60250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
60342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
60442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        ActivityManager am = (ActivityManager)getSystemService(
60542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
60642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
60742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
60842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
609afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
610afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
611afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
612afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
613afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
614afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
61542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
61642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
61750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                showDialogInner(DLG_FACTORY_RESET);
61842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
61950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                uninstallPkg(packageName);
620afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
621afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
622afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
623afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mActivitiesButton.setEnabled(false);
62442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
62542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mAppInfo.manageSpaceActivityName != null) {
62642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Intent intent = new Intent(Intent.ACTION_DEFAULT);
62742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName);
62842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                startActivityForResult(intent, -1);
62942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
63042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                showDialogInner(DLG_CLEAR_DATA);
63142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
632afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
633afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
634afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
635afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
636afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
637afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
638afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
63942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // TODO Once framework supports a pre-broadcast to
64042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // actually find out if an application will be restarted right
64142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // after its killed, there is no way we can determine if
64242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // a force stop will really kill the app. So just ignore
64342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // the dialog for now and force stop the package. Please note
64442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // that the button cannot be enabled or disabled since
64542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // we do not have this info for now.
64642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            forceStopPackage(mAppInfo.packageName);
647ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
648ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
649ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
650ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
651ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            int moveFlags = (mAppInfo.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0 ?
652ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
653ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
654ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
655ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mPm.movePackage(mAppInfo.packageName, mPackageMoveObserver, moveFlags);
656afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
657afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
658afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
659afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
660