InstalledAppDetails.java revision 19df79af269c4a2354b0989cebfcfe949aea42c4
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * use this file except in compliance with the License. You may obtain a copy
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * License for the specific language governing permissions and limitations
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
194056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapuimport com.android.internal.content.PackageHelper;
20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R;
2119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport com.android.settings.applications.ApplicationsState.AppEntry;
22728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.ActivityManager;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog;
2650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.app.Dialog;
27cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver;
344056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapuimport android.content.pm.IPackageManager;
35ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver;
3650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager;
389db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.content.pm.ResolveInfo;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri;
419db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.os.AsyncTask;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message;
4550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException;
464056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapuimport android.os.ServiceManager;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
499db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
509db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport java.lang.ref.WeakReference;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackbornpublic class InstalledAppDetails extends Activity
710f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        implements View.OnClickListener, ApplicationsState.Callbacks {
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
7344178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn    static final boolean SUPPORT_DISABLE_APPS = false;
740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageManager mPm;
760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState mState;
770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState.AppEntry mAppEntry;
780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageInfo mPackageInfo;
7942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mUninstallButton;
80de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private boolean mMoveInProgress = false;
8142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private boolean mUpdatedSysApp = false;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
8350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private boolean localLOGV = false;
8450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private TextView mAppVersion;
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
9442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mClearDataButton;
9542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mMoveAppButton;
965cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private int mMoveErrorCode;
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
98ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private PackageMoveObserver mPackageMoveObserver;
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private boolean mHaveSizes = false;
1010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCodeSize = -1;
1020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastDataSize = -1;
1030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCacheSize = -1;
1040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastTotalSize = -1;
1050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
111ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private static final int PACKAGE_MOVE = 4;
112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
12150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
12250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
12350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
12450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
12550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
12650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
12742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private static final int DLG_FORCE_STOP = DLG_BASE + 5;
1285cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private static final int DLG_MOVE_FAILED = DLG_BASE + 6;
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
13207f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            // If the activity is gone, don't process any more messages.
13307f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            if (isFinishing()) {
13407f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn                return;
13507f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            }
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
1420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    mState.requestSize(mAppEntry.info.packageName);
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
144ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                case PACKAGE_MOVE:
145ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    processMoveMsg(msg);
146ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    break;
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
164ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
168ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
169ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    class PackageMoveObserver extends IPackageMoveObserver.Stub {
170ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        public void packageMoved(String packageName, int returnCode) throws RemoteException {
171ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            final Message msg = mHandler.obtainMessage(PACKAGE_MOVE);
172ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = returnCode;
173ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mHandler.sendMessage(msg);
174ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
175ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return Formatter.formatFileSize(this, size);
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
18442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initDataButtons() {
1850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry.info.manageSpaceActivityName != null) {
18642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.manage_space_text);
18742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
18842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.clear_user_data_text);
18942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
19042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setOnClickListener(this);
191ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
192ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
1935cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private CharSequence getMoveErrMsg(int errCode) {
1945cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        switch (errCode) {
1955cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
1965cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.insufficient_storage);
1975cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_DOESNT_EXIST:
1985cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.does_not_exist);
1995cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_FORWARD_LOCKED:
2005cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.app_forward_locked);
2015cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INVALID_LOCATION:
2025cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.invalid_location);
2035cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE:
2045cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu                return getString(R.string.system_package);
2059a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INTERNAL_ERROR:
2069a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu                return "";
2075cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        }
2089a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu        return "";
2095cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    }
2105cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
211ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void initMoveButton() {
21242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean dataOnly = false;
2130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        dataOnly = (mPackageInfo == null) && (mAppEntry != null);
214ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        boolean moveDisable = true;
21542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (dataOnly) {
21642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app);
2170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
21842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_internal);
2194056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu            // Always let apps move to internal storage from sdcard.
220ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = false;
22142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
22242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_sdcard);
2230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if ((mAppEntry.info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) == 0 &&
2240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    (mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0 &&
2250f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    mPackageInfo != null) {
2260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                if (mPackageInfo.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL ||
2270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                        mPackageInfo.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
22830de84777b715a586f85d7665227342e6b67d373Suchi Amalapurapu                    moveDisable = false;
2290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                } else if (mPackageInfo.installLocation
2300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                        == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) {
2314056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    IPackageManager ipm  = IPackageManager.Stub.asInterface(
2324056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                            ServiceManager.getService("package"));
2334056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    int loc;
2344056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    try {
2354056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                        loc = ipm.getInstallLocation();
2364056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    } catch (RemoteException e) {
2374056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                        Log.e(TAG, "Is Pakage Manager running?");
2384056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                        return;
2394056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    }
2404056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    if (loc == PackageHelper.APP_INSTALL_EXTERNAL) {
2414056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                        // For apps with no preference and the default value set
2424056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                        // to install on sdcard.
2434056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                        moveDisable = false;
2444056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                    }
2454056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu                }
2464056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu            }
247730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu        }
248ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if (moveDisable) {
249ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
250ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
251ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setOnClickListener(this);
252ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(true);
253ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
25442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
25542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
256de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void initUninstallButtons() {
2570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
25842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean enabled = true;
25942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mUpdatedSysApp) {
26042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.app_factory_reset);
26142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
2620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
263b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu                enabled = false;
26444178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                if (SUPPORT_DISABLE_APPS) {
26544178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    try {
26644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        // Try to prevent the user from bricking their phone
26744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        // by not allowing disabling of apps signed with the
26844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        // system cert and any launcher app in the system.
26944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        PackageInfo sys = mPm.getPackageInfo("android",
27044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                                PackageManager.GET_SIGNATURES);
27144178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        Intent intent = new Intent(Intent.ACTION_MAIN);
27244178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        intent.addCategory(Intent.CATEGORY_HOME);
27344178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        intent.setPackage(mAppEntry.info.packageName);
27444178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        List<ResolveInfo> homes = mPm.queryIntentActivities(intent, 0);
27544178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        if ((homes != null && homes.size() > 0) ||
27644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                                (mPackageInfo != null &&
27744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                                        sys.signatures[0].equals(mPackageInfo.signatures[0]))) {
27844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            // Disable button for core system applications.
27944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            mUninstallButton.setText(R.string.disable_text);
28044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        } else if (mAppEntry.info.enabled) {
28144178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            mUninstallButton.setText(R.string.disable_text);
28244178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            enabled = true;
28344178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        } else {
28444178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            mUninstallButton.setText(R.string.enable_text);
28544178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            enabled = true;
28644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        }
28744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
28844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        Log.w(TAG, "Unable to get package info", e);
2899db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                    }
2909db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
2919db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            } else {
2929db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                mUninstallButton.setText(R.string.uninstall_text);
293b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu            }
29442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
29542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
29642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
29742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
29842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
29942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
30042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
30142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
306b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
3070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState = ApplicationsState.getInstance(getApplication());
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPm = getPackageManager();
309b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
3100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        setContentView(R.layout.installed_app_details);
311b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
312b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        mComputingStr = getText(R.string.computing_size);
313b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
31450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize = (TextView)findViewById(R.id.total_size_text);
316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize = (TextView)findViewById(R.id.application_size_text);
317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize = (TextView)findViewById(R.id.data_size_text);
318b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
31942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
32042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        View btnPanel = findViewById(R.id.control_buttons_panel);
32142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
32242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
32342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
324cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
325b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
32642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
32742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        View data_buttons_panel = findViewById(R.id.data_buttons_panel);
32842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
32942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
330b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
3310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Cache section
3320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mCacheSize = (TextView) findViewById(R.id.cache_size_text);
3330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mClearCacheButton = (Button) findViewById(R.id.clear_cache_button);
3340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
3350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mActivitiesButton = (Button)findViewById(R.id.clear_activities_button);
336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
337f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
33850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set applicaiton label and icon.
339f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    private void setAppLabelAndIcon(PackageInfo pkgInfo) {
340f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        View appSnippet = findViewById(R.id.app_snippet);
341f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
3420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.ensureIcon(mAppEntry);
3430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        icon.setImageDrawable(mAppEntry.icon);
344f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        // Set application name.
345f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
3460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        label.setText(mAppEntry.label);
34750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
348f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size);
349f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
350f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        if (pkgInfo != null && pkgInfo.versionName != null) {
35150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
35250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setText(getString(R.string.version_text,
3538e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
35450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
355f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu            mAppVersion.setVisibility(View.INVISIBLE);
35650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
35750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
35850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
35950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
36042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
36142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
362b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
3630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.resume(this);
3640f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!refreshUi()) {
365b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            setIntentAndFinish(true, true);
366b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
3670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
3680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
3690f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
3700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPause() {
3710f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        super.onPause();
3720f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.pause();
3730f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
3740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
3750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
3760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onAllSizesComputed() {
3770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
3780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
3790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
3800f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageIconChanged() {
3810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
3820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
3830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
3840f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageListChanged() {
3850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
3860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
3870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
3880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
38919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    public void onRebuildComplete(ArrayList<AppEntry> apps) {
39019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    }
39119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
39219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    @Override
3930f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageSizeChanged(String packageName) {
3940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (packageName.equals(mAppEntry.info.packageName)) {
3950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            refreshSizeInfo();
3960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
3970f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
3980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
3990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
4000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onRunningStateChanged(boolean running) {
4010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private boolean refreshUi() {
4040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mMoveInProgress) {
4050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return true;
4060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
4070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        Intent intent = getIntent();
4090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        final String packageName = intent.getData().getSchemeSpecificPart();
4100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mAppEntry = mState.getEntry(packageName);
4110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry == null) {
4130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
414b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
415b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
41650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application info again to refresh changed properties of application
41750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        try {
4180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
4190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_DISABLED_COMPONENTS |
4200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_UNINSTALLED_PACKAGES |
4210f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_SIGNATURES);
42250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } catch (NameNotFoundException e) {
4230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
4240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
42550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
426b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Get list of preferred activities
4280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<ComponentName> prefActList = new ArrayList<ComponentName>();
429b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Intent list cannot be null. so pass empty list
4310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<IntentFilter> intentList = new ArrayList<IntentFilter>();
4320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mPm.getPreferredActivities(intentList, prefActList, packageName);
4330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
4340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch);
4350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (prefActList.size() <= 0) {
4360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            // Disable clear activities button
4370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            autoLaunchView.setText(R.string.auto_launch_disable_text);
4380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setEnabled(false);
4390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else {
4400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            autoLaunchView.setText(R.string.auto_launch_enable_text);
4410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setEnabled(true);
4420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setOnClickListener(this);
4430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
4440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Security permissions section
4460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section);
4470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName);
4480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (asp.getPermissionCount() > 0) {
4490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            permsView.setVisibility(View.VISIBLE);
4500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            // Make the security sections header visible
4510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            LinearLayout securityList = (LinearLayout) permsView.findViewById(
4520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    R.id.security_settings_list);
4530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.removeAllViews();
4540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.addView(asp.getPermissionsView());
4550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else {
4560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            permsView.setVisibility(View.GONE);
457de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
4580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4590f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        checkForceStop();
4600f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        setAppLabelAndIcon(mPackageInfo);
4610f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshButtons();
4620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshSizeInfo();
4630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        return true;
464afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
4650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
466afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
469afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
470afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        setResult(ManageApplications.RESULT_OK, intent);
471afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(finish) {
472afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            finish();
473afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
474afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
475afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private void refreshSizeInfo() {
4770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry.size == ApplicationsState.SIZE_INVALID
4780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) {
4790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1;
4800f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (!mHaveSizes) {
4810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mAppSize.setText(mComputingStr);
4820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mDataSize.setText(mComputingStr);
4830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mCacheSize.setText(mComputingStr);
4840f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(mComputingStr);
4850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
4860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearDataButton.setEnabled(false);
4870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearCacheButton.setEnabled(false);
4880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
489afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
4900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mHaveSizes = true;
4910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastCodeSize != mAppEntry.codeSize) {
4920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastCodeSize = mAppEntry.codeSize;
4930f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mAppSize.setText(getSizeStr(mAppEntry.codeSize));
494afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
4950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastDataSize != mAppEntry.dataSize) {
4960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastDataSize = mAppEntry.dataSize;
4970f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mDataSize.setText(getSizeStr(mAppEntry.dataSize));
498afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
4990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastCacheSize != mAppEntry.cacheSize) {
5000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastCacheSize = mAppEntry.cacheSize;
5010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mCacheSize.setText(getSizeStr(mAppEntry.cacheSize));
502afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
5030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastTotalSize != mAppEntry.size) {
5040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastTotalSize = mAppEntry.size;
5050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(getSizeStr(mAppEntry.size));
506afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
5070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mAppEntry.dataSize <= 0) {
5090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(false);
5100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
5110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(true);
5120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setOnClickListener(this);
5130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
5140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mAppEntry.cacheSize <= 0) {
5150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(false);
5160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
5170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(true);
5180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setOnClickListener(this);
519afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
520afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
521afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
522afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
523afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
524afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
525afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
526afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
527afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
528afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
5290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
53042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
531afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
53242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
5330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
534afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
53542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
536afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
5379db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        checkForceStop();
538afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
539ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
540de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void refreshButtons() {
541de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        if (!mMoveInProgress) {
542de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initUninstallButtons();
543de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initDataButtons();
544de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initMoveButton();
545de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        } else {
546de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
547de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setEnabled(false);
548de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mUninstallButton.setEnabled(false);
549de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
550de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    }
551de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu
552ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
553ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
5540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
555de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        // Refresh the button attributes.
556de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        mMoveInProgress = false;
5570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (result == PackageManager.MOVE_SUCCEEDED) {
558ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
559de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            // Refresh size information again.
5600f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
561ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
5625cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            mMoveErrorCode = result;
5635cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            showDialogInner(DLG_MOVE_FAILED);
564ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
5650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
566ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
5675cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
568afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
569afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
570afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
571afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
57242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
57342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
57442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
5750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
57642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
5770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mClearDataObserver == null) {
578afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
579afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
580afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
581afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
5820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!res) {
58350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
584afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
58550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_CANNOT_CLEAR_DATA);
586afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
58742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
588afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
589afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
590afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
59150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void showDialogInner(int id) {
59250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        //removeDialog(id);
59350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        showDialog(id);
59450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
59550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
59650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
59742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public Dialog onCreateDialog(int id, Bundle args) {
59850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        switch (id) {
59950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CLEAR_DATA:
60050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
60150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_data_dlg_title))
60250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
60350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_data_dlg_text))
60442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setPositiveButton(R.string.dlg_ok,
60542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
60642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
60742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Clear user data here
60842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    initiateClearUserData();
60942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
61042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
61142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
61250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
61350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_FACTORY_RESET:
61450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
61550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_factory_reset_dlg_title))
61650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
61750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_factory_reset_dlg_text))
61842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setPositiveButton(R.string.dlg_ok,
61942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    new DialogInterface.OnClickListener() {
62042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
62142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Clear user data here
6220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    uninstallPkg(mAppEntry.info.packageName);
62342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
62442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
62542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
62650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
62750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_APP_NOT_FOUND:
62850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
62950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_not_found_dlg_title))
63050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
63150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_not_found_dlg_title))
63250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(getString(R.string.dlg_ok),
63350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
63450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
63550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
63650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(true, true);
63750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
63850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
63950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
64050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CANNOT_CLEAR_DATA:
64150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
64250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_failed_dlg_title))
64350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
64450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_failed_dlg_text))
64550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(R.string.dlg_ok,
64650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
64750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
64842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    mClearDataButton.setEnabled(false);
64950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
65050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(false, false);
65150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
65250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
65350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
6549db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        case DLG_FORCE_STOP:
6559db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            return new AlertDialog.Builder(this)
6569db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            .setTitle(getString(R.string.force_stop_dlg_title))
6579db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            .setIcon(android.R.drawable.ic_dialog_alert)
6589db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            .setMessage(getString(R.string.force_stop_dlg_text))
6599db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            .setPositiveButton(R.string.dlg_ok,
6609db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                new DialogInterface.OnClickListener() {
66142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
66242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                    // Force stop
6630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    forceStopPackage(mAppEntry.info.packageName);
66442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                }
66542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            })
66642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, null)
66742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            .create();
6689db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        case DLG_MOVE_FAILED:
6699db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            CharSequence msg = getString(R.string.move_app_failed_dlg_text,
6709db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                    getMoveErrMsg(mMoveErrorCode));
6719db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            return new AlertDialog.Builder(this)
6729db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            .setTitle(getString(R.string.move_app_failed_dlg_title))
6739db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            .setIcon(android.R.drawable.ic_dialog_alert)
6749db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            .setMessage(msg)
6759db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            .setNeutralButton(R.string.dlg_ok, null)
6769db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            .create();
67750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
67850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        return null;
67950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
68050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
68150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void uninstallPkg(String packageName) {
68250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
68350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
68450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
68550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        startActivity(uninstallIntent);
68650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setIntentAndFinish(true, true);
68750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
68850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
68942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
69042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        ActivityManager am = (ActivityManager)getSystemService(
69142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
69242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
693cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
69442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
69542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
696cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
697cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
698cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
699cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            mForceStopButton.setEnabled(getResultCode() != RESULT_CANCELED);
70097de6bccfe81655a16feb988da1d208f95a8d6e3Dianne Hackborn            mForceStopButton.setOnClickListener(InstalledAppDetails.this);
701cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
702cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
703cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
704cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
705cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
7060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                Uri.fromParts("package", mAppEntry.info.packageName, null));
7070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
7080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
709cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
710cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                Activity.RESULT_CANCELED, null, null);
711cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
712cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
7139db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    static class DisableChanger extends AsyncTask<Object, Object, Object> {
7149db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final PackageManager mPm;
7159db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final WeakReference<InstalledAppDetails> mActivity;
7169db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final ApplicationInfo mInfo;
7179db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final int mState;
7189db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
7199db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) {
7209db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm = activity.mPm;
7219db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mActivity = new WeakReference<InstalledAppDetails>(activity);
7229db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mInfo = info;
7239db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mState = state;
7249db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
7259db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
7269db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        @Override
7279db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        protected Object doInBackground(Object... params) {
7289db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0);
7299db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            return null;
7309db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
7319db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    }
7329db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
733afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
734afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
735afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
736afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
737afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
7380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
73942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
74042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
74150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                showDialogInner(DLG_FACTORY_RESET);
74242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
7430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
7440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    new DisableChanger(this, mAppEntry.info, mAppEntry.info.enabled ?
7459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                            PackageManager.COMPONENT_ENABLED_STATE_DISABLED
7469db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                            : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT).execute((Object)null);
7479db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                } else {
7489db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                    uninstallPkg(packageName);
7499db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
750afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
751afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
752afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
753afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mActivitiesButton.setEnabled(false);
75442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
7550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
75642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Intent intent = new Intent(Intent.ACTION_DEFAULT);
7570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                intent.setClassName(mAppEntry.info.packageName,
7580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                        mAppEntry.info.manageSpaceActivityName);
75942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                startActivityForResult(intent, -1);
76042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
76142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                showDialogInner(DLG_CLEAR_DATA);
76242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
763afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
764afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
765afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
766afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
767afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
768afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
769afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
7709db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            showDialogInner(DLG_FORCE_STOP);
7719db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            //forceStopPackage(mAppInfo.packageName);
772ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
773ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
774ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
775ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
7760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ?
777ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
778de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveInProgress = true;
779de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            refreshButtons();
7800f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags);
781afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
782afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
783afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
784afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
785