InstalledAppDetails.java revision 861c04fbd4841253a02299b7498a8cf609e8874d
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
19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R;
2019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport com.android.settings.applications.ApplicationsState.AppEntry;
21728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
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;
26f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.DialogFragment;
27f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment;
28cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver;
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;
409d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.hardware.usb.IUsbManager;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri;
429db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.os.AsyncTask;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
44ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.os.Environment;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler;
469d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.os.IBinder;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message;
4850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException;
499d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.os.ServiceManager;
50ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.preference.PreferenceActivity;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
539db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
549db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport java.lang.ref.WeakReference;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName;
58f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.LayoutInflater;
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
60f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.ViewGroup;
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
76f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class InstalledAppDetails extends Fragment
770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        implements View.OnClickListener, ApplicationsState.Callbacks {
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
7944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn    static final boolean SUPPORT_DISABLE_APPS = false;
802f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn    private static final boolean localLOGV = false;
810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
82f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static final String ARG_PACKAGE_NAME = "package";
83f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
840f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageManager mPm;
859d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood    private IUsbManager mUsbManager;
860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState mState;
870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState.AppEntry mAppEntry;
880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageInfo mPackageInfo;
896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    private CanBeOnSdCardChecker mCanBeOnSdCardChecker;
90f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private View mRootView;
9142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mUninstallButton;
92de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private boolean mMoveInProgress = false;
9342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private boolean mUpdatedSysApp = false;
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
952f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn    private boolean mCanClearData = true;
9650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private TextView mAppVersion;
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
100424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root    private TextView mExternalSize;
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
10742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mClearDataButton;
10842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mMoveAppButton;
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
110ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private PackageMoveObserver mPackageMoveObserver;
111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private boolean mHaveSizes = false;
1130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCodeSize = -1;
1140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastDataSize = -1;
115424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root    private long mLastExternalSize = -1;
1160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCacheSize = -1;
1170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastTotalSize = -1;
1180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
124ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private static final int PACKAGE_MOVE = 4;
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
13450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
13550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
13650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
13750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
13850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
13950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
14042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private static final int DLG_FORCE_STOP = DLG_BASE + 5;
1415cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private static final int DLG_MOVE_FAILED = DLG_BASE + 6;
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
145f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            // If the fragment is gone, don't process any more messages.
146f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (getView() == null) {
14707f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn                return;
14807f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            }
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
1550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    mState.requestSize(mAppEntry.info.packageName);
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
157ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                case PACKAGE_MOVE:
158ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    processMoveMsg(msg);
159ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    break;
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
177ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
181ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
182ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    class PackageMoveObserver extends IPackageMoveObserver.Stub {
183ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        public void packageMoved(String packageName, int returnCode) throws RemoteException {
184ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            final Message msg = mHandler.obtainMessage(PACKAGE_MOVE);
185ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = returnCode;
186ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mHandler.sendMessage(msg);
187ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
188ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
194f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return Formatter.formatFileSize(getActivity(), size);
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
19742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initDataButtons() {
1982f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn        if ((mAppEntry.info.flags&(ApplicationInfo.FLAG_SYSTEM
1992f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                | ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA))
2002f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                == ApplicationInfo.FLAG_SYSTEM) {
20142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.clear_user_data_text);
2022f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setEnabled(false);
2032f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mCanClearData = false;
2042f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn        } else {
2052f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
2062f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.manage_space_text);
2072f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            } else {
2082f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.clear_user_data_text);
2092f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            }
2102f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setOnClickListener(this);
21142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
212ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
213ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
2145cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private CharSequence getMoveErrMsg(int errCode) {
2155cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        switch (errCode) {
2165cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
217f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.insufficient_storage);
2185cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_DOESNT_EXIST:
219f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.does_not_exist);
2205cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_FORWARD_LOCKED:
221f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.app_forward_locked);
2225cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INVALID_LOCATION:
223f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.invalid_location);
2245cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE:
225f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.system_package);
2269a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INTERNAL_ERROR:
2279a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu                return "";
2285cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        }
2299a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu        return "";
2305cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    }
2315cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
232ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void initMoveButton() {
233ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (Environment.isExternalStorageEmulated()) {
234ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mMoveAppButton.setVisibility(View.INVISIBLE);
235ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return;
236ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
23742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean dataOnly = false;
2380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        dataOnly = (mPackageInfo == null) && (mAppEntry != null);
239ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        boolean moveDisable = true;
24042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (dataOnly) {
24142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app);
2420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
24342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_internal);
2444056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu            // Always let apps move to internal storage from sdcard.
245ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = false;
24642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
24742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_sdcard);
2486dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            mCanBeOnSdCardChecker.init();
2496dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            moveDisable = !mCanBeOnSdCardChecker.check(mAppEntry.info);
250730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu        }
251ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if (moveDisable) {
252ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
253ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
254ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setOnClickListener(this);
255ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(true);
256ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
25742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
25842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
259de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void initUninstallButtons() {
2600f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
26142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean enabled = true;
26242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mUpdatedSysApp) {
26342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.app_factory_reset);
26442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
2650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
266b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu                enabled = false;
26744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                if (SUPPORT_DISABLE_APPS) {
26844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    try {
26944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        // Try to prevent the user from bricking their phone
27044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        // by not allowing disabling of apps signed with the
27144178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        // system cert and any launcher app in the system.
27244178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        PackageInfo sys = mPm.getPackageInfo("android",
27344178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                                PackageManager.GET_SIGNATURES);
27444178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        Intent intent = new Intent(Intent.ACTION_MAIN);
27544178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        intent.addCategory(Intent.CATEGORY_HOME);
27644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        intent.setPackage(mAppEntry.info.packageName);
27744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        List<ResolveInfo> homes = mPm.queryIntentActivities(intent, 0);
27844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        if ((homes != null && homes.size() > 0) ||
27944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                                (mPackageInfo != null &&
28044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                                        sys.signatures[0].equals(mPackageInfo.signatures[0]))) {
28144178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            // Disable button for core system applications.
28244178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            mUninstallButton.setText(R.string.disable_text);
28344178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        } else if (mAppEntry.info.enabled) {
28444178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            mUninstallButton.setText(R.string.disable_text);
28544178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            enabled = true;
28644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        } else {
28744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            mUninstallButton.setText(R.string.enable_text);
28844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            enabled = true;
28944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        }
29044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
29144178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        Log.w(TAG, "Unable to get package info", e);
2929db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                    }
2939db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
2949db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            } else {
2959db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                mUninstallButton.setText(R.string.uninstall_text);
296b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu            }
29742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
29842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
29942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
30042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
30142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
30242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
30342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
30442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
307f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle icicle) {
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
309b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
310f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mState = ApplicationsState.getInstance(getActivity().getApplication());
311f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mPm = getActivity().getPackageManager();
3129d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        IBinder b = ServiceManager.getService(Context.USB_SERVICE);
3139d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        mUsbManager = IUsbManager.Stub.asInterface(b);
3149d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood
3156dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mCanBeOnSdCardChecker = new CanBeOnSdCardChecker();
316f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    }
317f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
318f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    @Override
319f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
320f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View view = mRootView = inflater.inflate(R.layout.installed_app_details, null);
3216dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
322f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingStr = getActivity().getText(R.string.computing_size);
323b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
32450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
325f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mTotalSize = (TextView)view.findViewById(R.id.total_size_text);
326f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mAppSize = (TextView)view.findViewById(R.id.application_size_text);
327f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mDataSize = (TextView)view.findViewById(R.id.data_size_text);
328424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root        mExternalSize = (TextView)view.findViewById(R.id.external_size_text);
329b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
33042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
331f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View btnPanel = view.findViewById(R.id.control_buttons_panel);
33242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
33342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
33442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
335cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
336b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
33742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
338f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View data_buttons_panel = view.findViewById(R.id.data_buttons_panel);
33942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
34042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
341b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
3420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Cache section
343f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mCacheSize = (TextView) view.findViewById(R.id.cache_size_text);
344f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mClearCacheButton = (Button) view.findViewById(R.id.clear_cache_button);
345f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
346f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mActivitiesButton = (Button)view.findViewById(R.id.clear_activities_button);
3470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
348f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return view;
349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
350f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
35150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set applicaiton label and icon.
352f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    private void setAppLabelAndIcon(PackageInfo pkgInfo) {
353f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View appSnippet = mRootView.findViewById(R.id.app_snippet);
354f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
3550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.ensureIcon(mAppEntry);
3560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        icon.setImageDrawable(mAppEntry.icon);
357f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        // Set application name.
358f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
3590f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        label.setText(mAppEntry.label);
36050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
361f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size);
362f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
363f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        if (pkgInfo != null && pkgInfo.versionName != null) {
36450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
365f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            mAppVersion.setText(getActivity().getString(R.string.version_text,
3668e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
36750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
368f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu            mAppVersion.setVisibility(View.INVISIBLE);
36950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
37050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
37150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
37250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
37342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
37442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
375b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
3760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.resume(this);
3770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!refreshUi()) {
378b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            setIntentAndFinish(true, true);
379b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
3800f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
3810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
3820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
3830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPause() {
3840f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        super.onPause();
3850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.pause();
3860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
3870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
3880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
3890f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onAllSizesComputed() {
3900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
3910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
3920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
3930f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageIconChanged() {
3940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
3950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
3960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
3970f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageListChanged() {
3980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
3990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
40219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    public void onRebuildComplete(ArrayList<AppEntry> apps) {
40319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    }
40419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
40519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    @Override
4060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageSizeChanged(String packageName) {
4070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (packageName.equals(mAppEntry.info.packageName)) {
4080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            refreshSizeInfo();
4090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
4100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
4130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onRunningStateChanged(boolean running) {
4140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private boolean refreshUi() {
4170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mMoveInProgress) {
4180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return true;
4190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
4200c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        final Bundle args = getArguments();
4210c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        String packageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null;
422f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        if (packageName == null) {
4230c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy            Intent intent = (args == null) ?
4240c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy                    getActivity().getIntent() : (Intent) args.getParcelable("intent");
425f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (intent != null) {
426f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                packageName = intent.getData().getSchemeSpecificPart();
427f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
428f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
4290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mAppEntry = mState.getEntry(packageName);
4300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry == null) {
4320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
433b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
434b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
43550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application info again to refresh changed properties of application
43650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        try {
4370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
4380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_DISABLED_COMPONENTS |
4390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_UNINSTALLED_PACKAGES |
4400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_SIGNATURES);
44150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } catch (NameNotFoundException e) {
4420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
4430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
44450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
445b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Get list of preferred activities
4470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<ComponentName> prefActList = new ArrayList<ComponentName>();
448b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Intent list cannot be null. so pass empty list
4500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<IntentFilter> intentList = new ArrayList<IntentFilter>();
4510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mPm.getPreferredActivities(intentList, prefActList, packageName);
4520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
4539d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        boolean hasUsbDefaults = false;
4549d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        try {
4559d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            hasUsbDefaults = mUsbManager.hasDefaults(packageName, mAppEntry.info.uid);
4569d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        } catch (RemoteException e) {
4579d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            Log.e(TAG, "mUsbManager.hasDefaults", e);
4589d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        }
459f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        TextView autoLaunchView = (TextView)mRootView.findViewById(R.id.auto_launch);
4609d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        if (prefActList.size() <= 0 && !hasUsbDefaults) {
4610f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            // Disable clear activities button
4620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            autoLaunchView.setText(R.string.auto_launch_disable_text);
4630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setEnabled(false);
4640f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else {
4650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            autoLaunchView.setText(R.string.auto_launch_enable_text);
4660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setEnabled(true);
4670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setOnClickListener(this);
4680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
4690f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Security permissions section
471f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        LinearLayout permsView = (LinearLayout) mRootView.findViewById(R.id.permissions_section);
472f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        AppSecurityPermissions asp = new AppSecurityPermissions(getActivity(), packageName);
4730f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (asp.getPermissionCount() > 0) {
4740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            permsView.setVisibility(View.VISIBLE);
4750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            // Make the security sections header visible
4760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            LinearLayout securityList = (LinearLayout) permsView.findViewById(
4770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    R.id.security_settings_list);
4780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.removeAllViews();
4790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.addView(asp.getPermissionsView());
4800f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else {
4810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            permsView.setVisibility(View.GONE);
482de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
4830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4840f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        checkForceStop();
4850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        setAppLabelAndIcon(mPackageInfo);
4860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshButtons();
4870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshSizeInfo();
4880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        return true;
489afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
4900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
491afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
492afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
493afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
494afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
495ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        PreferenceActivity pa = (PreferenceActivity)getActivity();
496ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        pa.finishPreferencePanel(this, Activity.RESULT_OK, intent);
497afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
498afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private void refreshSizeInfo() {
5000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry.size == ApplicationsState.SIZE_INVALID
5010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) {
5020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1;
5030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (!mHaveSizes) {
5040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mAppSize.setText(mComputingStr);
5050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mDataSize.setText(mComputingStr);
5060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mCacheSize.setText(mComputingStr);
5070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(mComputingStr);
5080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
5090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearDataButton.setEnabled(false);
5100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearCacheButton.setEnabled(false);
5110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
512afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
5130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mHaveSizes = true;
5140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastCodeSize != mAppEntry.codeSize) {
5150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastCodeSize = mAppEntry.codeSize;
5160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mAppSize.setText(getSizeStr(mAppEntry.codeSize));
517afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
5180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastDataSize != mAppEntry.dataSize) {
5190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastDataSize = mAppEntry.dataSize;
5200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mDataSize.setText(getSizeStr(mAppEntry.dataSize));
521afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
522424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root            if (mLastExternalSize != mAppEntry.externalSize) {
523424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root                mLastExternalSize = mAppEntry.externalSize;
524424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root                mExternalSize.setText(getSizeStr(mAppEntry.externalSize));
525424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root            }
5260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastCacheSize != mAppEntry.cacheSize) {
5270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastCacheSize = mAppEntry.cacheSize;
5280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mCacheSize.setText(getSizeStr(mAppEntry.cacheSize));
529afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
5300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastTotalSize != mAppEntry.size) {
5310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastTotalSize = mAppEntry.size;
5320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(getSizeStr(mAppEntry.size));
533afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
5340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5352f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            if (mAppEntry.dataSize <= 0 || !mCanClearData) {
5360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(false);
5370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
5380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(true);
5390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setOnClickListener(this);
5400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
5410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mAppEntry.cacheSize <= 0) {
5420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(false);
5430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
5440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(true);
5450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setOnClickListener(this);
546afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
547afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
548afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
549afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
550afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
551afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
552afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
553afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
554afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
555afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
5560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
55742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
558afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
55942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
5600f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
561afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
56242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
563afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
5649db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        checkForceStop();
565afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
566ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
567de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void refreshButtons() {
568de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        if (!mMoveInProgress) {
569de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initUninstallButtons();
570de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initDataButtons();
571de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initMoveButton();
572de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        } else {
573de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
574de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setEnabled(false);
575de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mUninstallButton.setEnabled(false);
576de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
577de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    }
578de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu
579ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
580ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
5810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
582de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        // Refresh the button attributes.
583de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        mMoveInProgress = false;
5840f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (result == PackageManager.MOVE_SUCCEEDED) {
585ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
586de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            // Refresh size information again.
5870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
588ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
589f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_MOVE_FAILED, result);
590ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
5910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
592ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
5935cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
594afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
595afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
596afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
597afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
59842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
59942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
60042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
6010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
60242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
6030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mClearDataObserver == null) {
604afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
605afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
606f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)
607f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
608afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
6090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!res) {
61050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
611afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
612f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_CANNOT_CLEAR_DATA, 0);
613afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
61442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
615afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
616afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
617afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
618f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private void showDialogInner(int id, int moveErrorCode) {
619f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        DialogFragment newFragment = MyAlertDialogFragment.newInstance(id, moveErrorCode);
620f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.setTargetFragment(this, 0);
621f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.show(getFragmentManager(), "dialog " + id);
62250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
62350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
624f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static class MyAlertDialogFragment extends DialogFragment {
625f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
626f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public static MyAlertDialogFragment newInstance(int id, int moveErrorCode) {
627f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            MyAlertDialogFragment frag = new MyAlertDialogFragment();
628f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            Bundle args = new Bundle();
629f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("id", id);
630f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("moveError", moveErrorCode);
631f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            frag.setArguments(args);
632f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return frag;
633f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
634f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
635f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        InstalledAppDetails getOwner() {
636f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return (InstalledAppDetails)getTargetFragment();
637f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
638f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
639f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        @Override
640f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public Dialog onCreateDialog(Bundle savedInstanceState) {
641f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int id = getArguments().getInt("id");
642f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int moveErrorCode = getArguments().getInt("moveError");
643f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            switch (id) {
644f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CLEAR_DATA:
645f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
646f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_data_dlg_title))
647f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setIcon(android.R.drawable.ic_dialog_alert)
648f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_data_dlg_text))
649f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
650f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
651f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
652f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
653f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().initiateClearUserData();
654f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
655f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
656f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
657f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
658f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FACTORY_RESET:
659f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
660f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title))
661f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setIcon(android.R.drawable.ic_dialog_alert)
662f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text))
663f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
664f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
665f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
666f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
667f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName);
668f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
669f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
670f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
671f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
672f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_APP_NOT_FOUND:
673f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
674f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_not_found_dlg_title))
675f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setIcon(android.R.drawable.ic_dialog_alert)
676f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_not_found_dlg_title))
677f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(getActivity().getText(R.string.dlg_ok),
678f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
679f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
680f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
681f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(true, true);
682f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
683f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
684f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
685f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CANNOT_CLEAR_DATA:
686f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
687f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_failed_dlg_title))
688f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setIcon(android.R.drawable.ic_dialog_alert)
689f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_failed_dlg_text))
690f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok,
691f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
692f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
693f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().mClearDataButton.setEnabled(false);
694f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
695f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(false, false);
696f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
697f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
698f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
699f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FORCE_STOP:
700f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
701f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.force_stop_dlg_title))
702f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setIcon(android.R.drawable.ic_dialog_alert)
703f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.force_stop_dlg_text))
704f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
705f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        new DialogInterface.OnClickListener() {
706f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
707f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Force stop
708f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().forceStopPackage(getOwner().mAppEntry.info.packageName);
709f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
710f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
711f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
712f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
713f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_MOVE_FAILED:
714f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    CharSequence msg = getActivity().getString(R.string.move_app_failed_dlg_text,
715f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().getMoveErrMsg(moveErrorCode));
716f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
717f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title))
718f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setIcon(android.R.drawable.ic_dialog_alert)
719f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(msg)
720f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok, null)
721f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
722f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
723f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            throw new IllegalArgumentException("unknown id " + id);
724f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
72550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
72650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
72750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void uninstallPkg(String packageName) {
72850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
72950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
73050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
73150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        startActivity(uninstallIntent);
73250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setIntentAndFinish(true, true);
73350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
73450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
73542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
736f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)getActivity().getSystemService(
73742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
73842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
739cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
74042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
74142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
742cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
743cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
744cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
745861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED);
746cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
747cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
748861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn
749861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    private void updateForceStopButton(boolean enabled) {
750861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setEnabled(enabled);
751861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setOnClickListener(InstalledAppDetails.this);
752861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    }
753cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
754cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
755cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
7560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                Uri.fromParts("package", mAppEntry.info.packageName, null));
7570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
7580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
759861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
760861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // If the app isn't explicitly stopped, then always show the
761861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // force stop button.
762861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(true);
763861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        } else {
764861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
765861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn                    Activity.RESULT_CANCELED, null, null);
766861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        }
767cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
768cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
7699db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    static class DisableChanger extends AsyncTask<Object, Object, Object> {
7709db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final PackageManager mPm;
7719db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final WeakReference<InstalledAppDetails> mActivity;
7729db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final ApplicationInfo mInfo;
7739db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final int mState;
7749db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
7759db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) {
7769db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm = activity.mPm;
7779db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mActivity = new WeakReference<InstalledAppDetails>(activity);
7789db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mInfo = info;
7799db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mState = state;
7809db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
7819db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
7829db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        @Override
7839db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        protected Object doInBackground(Object... params) {
7849db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0);
7859db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            return null;
7869db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
7879db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    }
7889db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
789afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
790afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
791afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
792afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
793afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
7940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
79542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
79642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
797f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_FACTORY_RESET, 0);
79842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
7990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
8000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    new DisableChanger(this, mAppEntry.info, mAppEntry.info.enabled ?
8019db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                            PackageManager.COMPONENT_ENABLED_STATE_DISABLED
8029db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                            : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT).execute((Object)null);
8039db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                } else {
8049db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                    uninstallPkg(packageName);
8059db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
806afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
807afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
808afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
8099d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            try {
8109d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood                mUsbManager.clearDefaults(packageName, mAppEntry.info.uid);
8119d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            } catch (RemoteException e) {
8129d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood                Log.e(TAG, "mUsbManager.clearDefaults", e);
8139d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            }
814afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mActivitiesButton.setEnabled(false);
81542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
8160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
81742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Intent intent = new Intent(Intent.ACTION_DEFAULT);
8180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                intent.setClassName(mAppEntry.info.packageName,
8190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                        mAppEntry.info.manageSpaceActivityName);
82042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                startActivityForResult(intent, -1);
82142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
822f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_CLEAR_DATA, 0);
82342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
824afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
825afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
826afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
827afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
828afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
829afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
830afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
831f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_FORCE_STOP, 0);
8329db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            //forceStopPackage(mAppInfo.packageName);
833ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
834ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
835ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
836ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
8370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ?
838ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
839de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveInProgress = true;
840de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            refreshButtons();
8410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags);
842afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
843afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
844afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
845afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
846