InstalledAppDetails.java revision f4c4b59f13a0cadd55832004e56ff7b6d827f7f0
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * use this file except in compliance with the License. You may obtain a copy
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * of the License at
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * License for the specific language governing permissions and limitations
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * under the License.
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings;
20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R;
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.ActivityManager;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog;
2550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.app.Dialog;
26cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver;
33ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageStatsObserver;
3550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageStats;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message;
4350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
6542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapupublic class InstalledAppDetails extends Activity implements View.OnClickListener {
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int _UNKNOWN_APP=R.string.unknown;
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ApplicationInfo mAppInfo;
6942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mUninstallButton;
7042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private boolean mUpdatedSysApp = false;
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
7250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private boolean localLOGV = false;
7350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private TextView mAppVersion;
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PkgSizeObserver mSizeObserver;
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
8442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mClearDataButton;
8542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mMoveAppButton;
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    PackageStats mSizeInfo;
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PackageManager mPm;
89ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private PackageMoveObserver mPackageMoveObserver;
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int GET_PKG_SIZE = 2;
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
97ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private static final int PACKAGE_MOVE = 4;
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String ATTR_PACKAGE_STATS="PackageStats";
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
10850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
10950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
11050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
11150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
11250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
11350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
11442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private static final int DLG_FORCE_STOP = DLG_BASE + 5;
115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case GET_PKG_SIZE:
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    refreshSizeInfo(msg);
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
129ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                case PACKAGE_MOVE:
130ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    processMoveMsg(msg);
131ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    break;
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class PkgSizeObserver extends IPackageStatsObserver.Stub {
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) {
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Message msg = mHandler.obtainMessage(GET_PKG_SIZE);
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Bundle data = new Bundle();
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             data.putParcelable(ATTR_PACKAGE_STATS, pStats);
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             msg.setData(data);
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mHandler.sendMessage(msg);
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
15650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
160ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
164ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
165ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    class PackageMoveObserver extends IPackageMoveObserver.Stub {
166ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        public void packageMoved(String packageName, int returnCode) throws RemoteException {
167ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            final Message msg = mHandler.obtainMessage(PACKAGE_MOVE);
168ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = returnCode;
169ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mHandler.sendMessage(msg);
170ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
171ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return Formatter.formatFileSize(this, size);
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
18042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initDataButtons() {
18142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mAppInfo.manageSpaceActivityName != null) {
18242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.manage_space_text);
18342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
18442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.clear_user_data_text);
18542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
18642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setOnClickListener(this);
187ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        initMoveButton();
188ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
189ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
190ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void initMoveButton() {
19142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        String pkgName = mAppInfo.packageName;
19242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean dataOnly = false;
19342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        ApplicationInfo info1 = null;
19442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
19542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        try {
19642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            info1 = mPm.getApplicationInfo(pkgName, 0);
19742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } catch (NameNotFoundException e) {
19842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
19942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        dataOnly = (info1 == null) && (mAppInfo != null);
200ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        boolean moveDisable = true;
20142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (dataOnly) {
20242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app);
20342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if ((mAppInfo.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0) {
20442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_internal);
205ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = false;
20642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
207ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = (mAppInfo.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0 ||
208ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
20942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_sdcard);
21042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
211ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if (moveDisable) {
212ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
213ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
214ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setOnClickListener(this);
215ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(true);
216ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
21742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
21842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
21942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initControlButtons() {
22042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUpdatedSysApp = (mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
22142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean enabled = true;
22242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mUpdatedSysApp) {
22342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.app_factory_reset);
22442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0){
22542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.uninstall_text);
22642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
22742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Disable uninstall for system apps
22842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            enabled = false;
22942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
23042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
23142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
23242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
23342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
23442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
23542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
23642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
24150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get package manager
242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPm = getPackageManager();
24350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application's name from intent
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = getIntent();
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME);
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mComputingStr = getText(R.string.computing_size);
247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Try retrieving package stats again
248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        CharSequence totalSizeStr, appSizeStr, dataSizeStr;
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        totalSizeStr = appSizeStr = dataSizeStr = mComputingStr;
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "Have to compute package sizes");
251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mSizeObserver = new PkgSizeObserver();
252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppInfo = mPm.getApplicationInfo(packageName,
254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    PackageManager.GET_UNINSTALLED_PACKAGES);
255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (NameNotFoundException e) {
256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.e(TAG, "Exception when retrieving package:"+packageName, e);
25750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_APP_NOT_FOUND);
25850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return;
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
26050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setContentView(R.layout.installed_app_details);
261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //TODO download str and download url
26250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize = (TextView)findViewById(R.id.total_size_text);
264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize.setText(totalSizeStr);
265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize = (TextView)findViewById(R.id.application_size_text);
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize.setText(appSizeStr);
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize = (TextView)findViewById(R.id.data_size_text);
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize.setText(dataSizeStr);
26942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
27042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        View btnPanel = findViewById(R.id.control_buttons_panel);
27142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
27242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
27342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
274cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
27542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        initControlButtons();
27642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
27742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        View data_buttons_panel = findViewById(R.id.data_buttons_panel);
27842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
27942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         // Cache section
281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize = (TextView) findViewById(R.id.cache_size_text);
282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize.setText(mComputingStr);
283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mClearCacheButton = (Button) findViewById(R.id.clear_cache_button);
28442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
28550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Get list of preferred activities
286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mActivitiesButton = (Button)findViewById(R.id.clear_activities_button);
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<ComponentName> prefActList = new ArrayList<ComponentName>();
28850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Intent list cannot be null. so pass empty list
289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<IntentFilter> intentList = new ArrayList<IntentFilter>();
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mPm.getPreferredActivities(intentList,  prefActList, packageName);
291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch);
293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(prefActList.size() <= 0) {
29450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu             // Disable clear activities button
295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_disable_text);
296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setEnabled(false);
297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_enable_text);
299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setOnClickListener(this);
300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
30250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Security permissions section
303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section);
304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName);
305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(asp.getPermissionCount() > 0) {
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.VISIBLE);
307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             // Make the security sections header visible
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             LinearLayout securityList = (LinearLayout) permsView.findViewById(
309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                     R.id.security_settings_list);
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             securityList.addView(asp.getPermissionsView());
311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.GONE);
313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
31650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void refreshAppAttributes(PackageInfo pkgInfo) {
317f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        setAppLabelAndIcon(pkgInfo);
31842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        initControlButtons();
31942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        initDataButtons();
32050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Refresh size info
321a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu        if (mAppInfo != null && mAppInfo.packageName != null) {
322a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu            mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
323a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu        }
324a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu    }
325f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
32650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set applicaiton label and icon.
327f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    private void setAppLabelAndIcon(PackageInfo pkgInfo) {
328f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        View appSnippet = findViewById(R.id.app_snippet);
329f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
330f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        icon.setImageDrawable(mAppInfo.loadIcon(mPm));
331f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        // Set application name.
332f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
333f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        label.setText(mAppInfo.loadLabel(mPm));
33450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
335f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size);
336f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
337f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        if (pkgInfo != null && pkgInfo.versionName != null) {
33850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
33950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setText(getString(R.string.version_text,
3408e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
34150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
342f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu            mAppVersion.setVisibility(View.INVISIBLE);
34350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
34450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
34550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
34650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
34742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
34842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
34950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        PackageInfo pkgInfo;
35050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application info again to refresh changed properties of application
35150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        try {
35250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppInfo = mPm.getApplicationInfo(mAppInfo.packageName,
35350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    PackageManager.GET_UNINSTALLED_PACKAGES);
3549f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn            pkgInfo = mPm.getPackageInfo(mAppInfo.packageName,
3559f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn                    PackageManager.GET_UNINSTALLED_PACKAGES);
35650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } catch (NameNotFoundException e) {
35750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            Log.e(TAG, "Exception when retrieving package:" + mAppInfo.packageName, e);
35850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_APP_NOT_FOUND);
35950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return;
36050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
361cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
36250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        refreshAppAttributes(pkgInfo);
363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
36442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
366afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
368afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        setResult(ManageApplications.RESULT_OK, intent);
370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(finish) {
371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            finish();
372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
373afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
375afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
376afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle get size info notification from observer when
377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete. The current user data
378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * info has to be refreshed in the manage applications screen as well as the current screen.
379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshSizeInfo(Message msg) {
381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean changed = false;
382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS);
383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize;
384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mSizeInfo == null) {
385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSizeInfo = newPs;
386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            String str = getSizeStr(newTot);
387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mTotalSize.setText(str);
388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppSize.setText(getSizeStr(newPs.codeSize));
389afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDataSize.setText(getSizeStr(newPs.dataSize));
390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mCacheSize.setText(getSizeStr(newPs.cacheSize));
391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize;
393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newTot != oldTot) {
394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String str = getSizeStr(newTot);
395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mTotalSize.setText(str);
396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.codeSize != mSizeInfo.codeSize) {
399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppSize.setText(getSizeStr(newPs.codeSize));
400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.dataSize != mSizeInfo.dataSize) {
403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mDataSize.setText(getSizeStr(newPs.dataSize));
404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.cacheSize != mSizeInfo.cacheSize) {
407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mCacheSize.setText(getSizeStr(newPs.cacheSize));
408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(changed) {
411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mSizeInfo = newPs;
412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
41442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // If data size is zero disable clear data button
41542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (newPs.dataSize == 0) {
41642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(false);
417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
41842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        long data = mSizeInfo.dataSize;
419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        refreshCacheInfo(newPs.cacheSize);
420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshCacheInfo(long cacheSize) {
423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Set cache info
424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mCacheSize.setText(getSizeStr(cacheSize));
425afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (cacheSize <= 0) {
426afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setEnabled(false);
427afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setOnClickListener(this);
429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
43942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
44142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.getPackageSizeInfo(packageName, mSizeObserver);
443afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
44442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
445afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
447ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
448ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
449ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
450ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        String packageName = mAppInfo.packageName;
451ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if(result == PackageManager.MOVE_SUCCEEDED) {
452ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
453ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            try {
454ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                // Reset flags
455ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mAppInfo = mPm.getApplicationInfo(packageName,
456ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                        PackageManager.GET_UNINSTALLED_PACKAGES);
457ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                initMoveButton();
458ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            } catch (NameNotFoundException e) {
459ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                // TODO error handling
460ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
461ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
462ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            // TODO Present a dialog indicating failure.
463ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
464ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
465afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
466afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
469afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
47042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
47142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
47242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
473afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
47442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
475afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mClearDataObserver == null) {
476afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
477afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
478afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
479afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
480afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(!res) {
48150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
482afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
48350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_CANNOT_CLEAR_DATA);
484afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
48542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
486afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
487afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
488afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
48950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void showDialogInner(int id) {
49050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        //removeDialog(id);
49150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        showDialog(id);
49250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
49350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
49450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
49542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public Dialog onCreateDialog(int id, Bundle args) {
49650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        switch (id) {
49750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CLEAR_DATA:
49850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
49950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_data_dlg_title))
50050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
50150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_data_dlg_text))
50242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setPositiveButton(R.string.dlg_ok,
50342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
50442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
50542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Clear user data here
50642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    initiateClearUserData();
50742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
50842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
50942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
51050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
51150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_FACTORY_RESET:
51250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
51350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_factory_reset_dlg_title))
51450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
51550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_factory_reset_dlg_text))
51642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setPositiveButton(R.string.dlg_ok,
51742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
51842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
51942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Clear user data here
52042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    uninstallPkg(mAppInfo.packageName);
52142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
52242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
52342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
52450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
52550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_APP_NOT_FOUND:
52650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
52750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_not_found_dlg_title))
52850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
52950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_not_found_dlg_title))
53050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(getString(R.string.dlg_ok),
53150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
53250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
53350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
53450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(true, true);
53550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
53650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
53750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
53850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CANNOT_CLEAR_DATA:
53950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
54050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_failed_dlg_title))
54150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
54250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_failed_dlg_text))
54350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(R.string.dlg_ok,
54450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
54550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
54642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    mClearDataButton.setEnabled(false);
54750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
54850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(false, false);
54950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
55050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
55150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
55242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            case DLG_FORCE_STOP:
55342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                return new AlertDialog.Builder(this)
55442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setTitle(getString(R.string.force_stop_dlg_title))
55542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setIcon(android.R.drawable.ic_dialog_alert)
55642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setMessage(getString(R.string.force_stop_dlg_text))
55742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                .setPositiveButton(R.string.dlg_ok,
55842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
55942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
56042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Force stop
56142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    forceStopPackage(mAppInfo.packageName);
56242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
56342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
56442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
56542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .create();
56650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
56750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        return null;
56850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
56950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
57050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void uninstallPkg(String packageName) {
57150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
57250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
57350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
57450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        startActivity(uninstallIntent);
57550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setIntentAndFinish(true, true);
57650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
57750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
57842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
57942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        ActivityManager am = (ActivityManager)getSystemService(
58042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
58142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
582cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
58342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
58442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
585cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
586cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
587cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
588cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            mForceStopButton.setEnabled(getResultCode() != RESULT_CANCELED);
58997de6bccfe81655a16feb988da1d208f95a8d6e3Dianne Hackborn            mForceStopButton.setOnClickListener(InstalledAppDetails.this);
590cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
591cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
592cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
593cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
594cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
595cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                Uri.fromParts("package", mAppInfo.packageName, null));
596cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppInfo.packageName });
597cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        intent.putExtra(Intent.EXTRA_UID, mAppInfo.uid);
598cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
599cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                Activity.RESULT_CANCELED, null, null);
600cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
601cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
602afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
603afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
604afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
605afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
606afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
607afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
60842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
60942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
61050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                showDialogInner(DLG_FACTORY_RESET);
61142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
61250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                uninstallPkg(packageName);
613afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
614afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
615afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
616afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mActivitiesButton.setEnabled(false);
61742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
61842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mAppInfo.manageSpaceActivityName != null) {
61942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Intent intent = new Intent(Intent.ACTION_DEFAULT);
62042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName);
62142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                startActivityForResult(intent, -1);
62242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
62342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                showDialogInner(DLG_CLEAR_DATA);
62442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
625afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
626afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
627afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
628afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
629afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
630afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
631afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
63242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            forceStopPackage(mAppInfo.packageName);
633ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
634ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
635ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
636ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
637ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            int moveFlags = (mAppInfo.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0 ?
638ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
639ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
640ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
641ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mPm.movePackage(mAppInfo.packageName, mPackageMoveObserver, moveFlags);
642afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
643afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
644afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
645afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
646