InstalledAppDetails.java revision 2e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0
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;
203fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasaniimport com.android.settings.Utils;
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;
27f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.DialogFragment;
28f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment;
294a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandlerimport android.app.INotificationManager;
305c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackbornimport android.app.admin.DevicePolicyManager;
31c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.appwidget.AppWidgetManager;
32cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver;
33c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.content.ComponentName;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver;
40ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver;
4150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager;
439db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.content.pm.ResolveInfo;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
45e458832c765ed5c3de836384338c7626c80b5686Dianne Hackbornimport android.content.res.Resources;
469d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.hardware.usb.IUsbManager;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri;
489db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.os.AsyncTask;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
50ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.os.Environment;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler;
529d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.os.IBinder;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message;
5450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException;
559d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.os.ServiceManager;
56ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.preference.PreferenceActivity;
57c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.text.SpannableString;
58c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.text.TextUtils;
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter;
60c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.text.style.BulletSpan;
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
629db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
639db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport java.lang.ref.WeakReference;
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
66f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.LayoutInflater;
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
68f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.ViewGroup;
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
71aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackbornimport android.widget.CheckBox;
72aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackbornimport android.widget.CompoundButton;
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
86f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class InstalledAppDetails extends Fragment
87aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        implements View.OnClickListener, CompoundButton.OnCheckedChangeListener,
88aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ApplicationsState.Callbacks {
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
90a12c1e3226ca660a23f049f880947df7f8d96c4eDianne Hackborn    static final boolean SUPPORT_DISABLE_APPS = true;
912f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn    private static final boolean localLOGV = false;
920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
93f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static final String ARG_PACKAGE_NAME = "package";
94f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageManager mPm;
969d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood    private IUsbManager mUsbManager;
97c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    private AppWidgetManager mAppWidgetManager;
985c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn    private DevicePolicyManager mDpm;
990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState mState;
100309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ApplicationsState.Session mSession;
1010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState.AppEntry mAppEntry;
1020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageInfo mPackageInfo;
1036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    private CanBeOnSdCardChecker mCanBeOnSdCardChecker;
104f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private View mRootView;
10542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mUninstallButton;
106de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private boolean mMoveInProgress = false;
10742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private boolean mUpdatedSysApp = false;
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
109aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private View mScreenCompatSection;
110aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private CheckBox mAskCompatibilityCB;
111aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private CheckBox mEnableCompatibilityCB;
1122f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn    private boolean mCanClearData = true;
11350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private TextView mAppVersion;
114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
117bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private TextView mExternalCodeSize;
118bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private TextView mExternalDataSize;
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
12542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mClearDataButton;
12642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mMoveAppButton;
12770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private CompoundButton mNotificationSwitch;
1284a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
129ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private PackageMoveObserver mPackageMoveObserver;
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private boolean mHaveSizes = false;
1320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCodeSize = -1;
1330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastDataSize = -1;
134bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private long mLastExternalCodeSize = -1;
135bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private long mLastExternalDataSize = -1;
1360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCacheSize = -1;
1370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastTotalSize = -1;
1380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
144ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private static final int PACKAGE_MOVE = 4;
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
15450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
15550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
15650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
15750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
15850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
15950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
16042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private static final int DLG_FORCE_STOP = DLG_BASE + 5;
1615cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private static final int DLG_MOVE_FAILED = DLG_BASE + 6;
162f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn    private static final int DLG_DISABLE = DLG_BASE + 7;
16370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private static final int DLG_DISABLE_NOTIFICATIONS = DLG_BASE + 8;
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
167f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            // If the fragment is gone, don't process any more messages.
168f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (getView() == null) {
16907f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn                return;
17007f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            }
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
1770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    mState.requestSize(mAppEntry.info.packageName);
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
179ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                case PACKAGE_MOVE:
180ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    processMoveMsg(msg);
181ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    break;
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
199ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
203ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
204ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    class PackageMoveObserver extends IPackageMoveObserver.Stub {
205ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        public void packageMoved(String packageName, int returnCode) throws RemoteException {
206ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            final Message msg = mHandler.obtainMessage(PACKAGE_MOVE);
207ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = returnCode;
208ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mHandler.sendMessage(msg);
209ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
210ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
216f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return Formatter.formatFileSize(getActivity(), size);
217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
21942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initDataButtons() {
2202f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn        if ((mAppEntry.info.flags&(ApplicationInfo.FLAG_SYSTEM
2212f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                | ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA))
2225c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                == ApplicationInfo.FLAG_SYSTEM
2235c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
22442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.clear_user_data_text);
2252f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setEnabled(false);
2262f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mCanClearData = false;
2272f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn        } else {
2282f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
2292f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.manage_space_text);
2302f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            } else {
2312f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.clear_user_data_text);
2322f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            }
2332f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setOnClickListener(this);
23442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
235ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
236ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
2375cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private CharSequence getMoveErrMsg(int errCode) {
2385cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        switch (errCode) {
2395cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
240f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.insufficient_storage);
2415cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_DOESNT_EXIST:
242f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.does_not_exist);
2435cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_FORWARD_LOCKED:
244f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.app_forward_locked);
2455cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INVALID_LOCATION:
246f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.invalid_location);
2475cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE:
248f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.system_package);
2499a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INTERNAL_ERROR:
2509a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu                return "";
2515cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        }
2529a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu        return "";
2535cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    }
2545cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
255ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void initMoveButton() {
256ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (Environment.isExternalStorageEmulated()) {
257ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mMoveAppButton.setVisibility(View.INVISIBLE);
258ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return;
259ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
26042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean dataOnly = false;
2610f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        dataOnly = (mPackageInfo == null) && (mAppEntry != null);
262ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        boolean moveDisable = true;
26342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (dataOnly) {
26442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app);
2650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
26642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_internal);
2674056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu            // Always let apps move to internal storage from sdcard.
268ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = false;
26942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
27042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_sdcard);
2716dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            mCanBeOnSdCardChecker.init();
2726dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            moveDisable = !mCanBeOnSdCardChecker.check(mAppEntry.info);
273730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu        }
274ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if (moveDisable) {
275ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
276ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
277ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setOnClickListener(this);
278ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(true);
279ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
28042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
28142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
28270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private boolean isThisASystemPackage() {
28370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        try {
28470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            PackageInfo sys = mPm.getPackageInfo("android", PackageManager.GET_SIGNATURES);
28570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            return (mPackageInfo != null && mPackageInfo.signatures != null &&
28670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    sys.signatures[0].equals(mPackageInfo.signatures[0]));
28770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } catch (PackageManager.NameNotFoundException e) {
28870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            return false;
28970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
29070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    }
29170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
292de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void initUninstallButtons() {
2930f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
29442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean enabled = true;
29542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mUpdatedSysApp) {
29642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.app_factory_reset);
29742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
2980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
299b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu                enabled = false;
30044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                if (SUPPORT_DISABLE_APPS) {
30144178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    try {
30244178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        // Try to prevent the user from bricking their phone
30344178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        // by not allowing disabling of apps signed with the
30444178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        // system cert and any launcher app in the system.
30544178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        PackageInfo sys = mPm.getPackageInfo("android",
30644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                                PackageManager.GET_SIGNATURES);
30744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        Intent intent = new Intent(Intent.ACTION_MAIN);
30844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        intent.addCategory(Intent.CATEGORY_HOME);
30944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        intent.setPackage(mAppEntry.info.packageName);
31044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        List<ResolveInfo> homes = mPm.queryIntentActivities(intent, 0);
31170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        if ((homes != null && homes.size() > 0) || isThisASystemPackage()) {
31244178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            // Disable button for core system applications.
31344178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            mUninstallButton.setText(R.string.disable_text);
31444178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        } else if (mAppEntry.info.enabled) {
31544178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            mUninstallButton.setText(R.string.disable_text);
31644178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            enabled = true;
31744178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        } else {
31844178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            mUninstallButton.setText(R.string.enable_text);
31944178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                            enabled = true;
32044178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        }
32144178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
32244178e2801c013e60defb4b5f390d893e7344a71Dianne Hackborn                        Log.w(TAG, "Unable to get package info", e);
3239db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                    }
3249db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
3252e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn            } else if ((mPackageInfo.applicationInfo.flags
3262e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    & ApplicationInfo.FLAG_INSTALLED) == 0) {
3272e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                mUninstallButton.setText(R.string.install_text);
3289db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            } else {
3299db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                mUninstallButton.setText(R.string.uninstall_text);
330b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu            }
33142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
3325c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        // If this is a device admin, it can't be uninstall or disabled.
3335c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        // We do this here so the text of the button is still set correctly.
3345c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
3355c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            enabled = false;
3365c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        }
33742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
33842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
33942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
34042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
34142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
34242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
34342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
3444a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    private void initNotificationButton() {
3454a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        INotificationManager nm = INotificationManager.Stub.asInterface(
3464a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
3474a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        boolean enabled = true; // default on
3484a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        try {
3494a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            enabled = nm.areNotificationsEnabledForPackage(mAppEntry.info.packageName);
3504a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } catch (android.os.RemoteException ex) {
3514a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            // this does not bode well
3524a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        }
3534a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        mNotificationSwitch.setChecked(enabled);
35470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        if (isThisASystemPackage()) {
35570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setEnabled(false);
35670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } else {
35770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setEnabled(true);
35870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setOnCheckedChangeListener(this);
35970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
3604a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    }
3614a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
362afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
364f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle icicle) {
365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
366b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
367f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mState = ApplicationsState.getInstance(getActivity().getApplication());
368309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession = mState.newSession(this);
369f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mPm = getActivity().getPackageManager();
3709d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        IBinder b = ServiceManager.getService(Context.USB_SERVICE);
3719d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        mUsbManager = IUsbManager.Stub.asInterface(b);
372c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        mAppWidgetManager = AppWidgetManager.getInstance(getActivity());
3735c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
3749d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood
3756dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mCanBeOnSdCardChecker = new CanBeOnSdCardChecker();
376f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    }
377f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
378f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    @Override
379f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
380f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View view = mRootView = inflater.inflate(R.layout.installed_app_details, null);
3816dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
382f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingStr = getActivity().getText(R.string.computing_size);
383b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
38450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
385f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mTotalSize = (TextView)view.findViewById(R.id.total_size_text);
386f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mAppSize = (TextView)view.findViewById(R.id.application_size_text);
387f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mDataSize = (TextView)view.findViewById(R.id.data_size_text);
388bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalCodeSize = (TextView)view.findViewById(R.id.external_code_size_text);
389bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalDataSize = (TextView)view.findViewById(R.id.external_data_size_text);
3901f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn
3911f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn        if (Environment.isExternalStorageEmulated()) {
3921f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            ((View)mExternalCodeSize.getParent()).setVisibility(View.GONE);
3931f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            ((View)mExternalDataSize.getParent()).setVisibility(View.GONE);
3941f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn        }
3951f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn
39642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
397f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View btnPanel = view.findViewById(R.id.control_buttons_panel);
39842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
39942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
40042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
401cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
402b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
40342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
404f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View data_buttons_panel = view.findViewById(R.id.data_buttons_panel);
405313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
406313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
407b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Cache section
409f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mCacheSize = (TextView) view.findViewById(R.id.cache_size_text);
410f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mClearCacheButton = (Button) view.findViewById(R.id.clear_cache_button);
411f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
412f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mActivitiesButton = (Button)view.findViewById(R.id.clear_activities_button);
4130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
414aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility control
415aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mScreenCompatSection = view.findViewById(R.id.screen_compatibility_section);
416aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mAskCompatibilityCB = (CheckBox)view.findViewById(R.id.ask_compatibility_cb);
417aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mEnableCompatibilityCB = (CheckBox)view.findViewById(R.id.enable_compatibility_cb);
4184a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
41970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        mNotificationSwitch = (CompoundButton) view.findViewById(R.id.notification_switch);
420aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
421f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return view;
422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
423f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
42450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set applicaiton label and icon.
425f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    private void setAppLabelAndIcon(PackageInfo pkgInfo) {
426f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View appSnippet = mRootView.findViewById(R.id.app_snippet);
427f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
4280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.ensureIcon(mAppEntry);
4290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        icon.setImageDrawable(mAppEntry.icon);
430f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        // Set application name.
431f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
4320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        label.setText(mAppEntry.label);
43350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
434f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size);
435f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
436f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        if (pkgInfo != null && pkgInfo.versionName != null) {
43750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
438f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            mAppVersion.setText(getActivity().getString(R.string.version_text,
4398e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
44050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
441f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu            mAppVersion.setVisibility(View.INVISIBLE);
44250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
44350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
44450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
44550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
44642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
44742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
448b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
449309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession.resume();
4500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!refreshUi()) {
451b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            setIntentAndFinish(true, true);
452b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
4530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
4560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPause() {
4570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        super.onPause();
458309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession.pause();
4590f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4600f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4610f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
4620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onAllSizesComputed() {
4630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4640f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
4660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageIconChanged() {
4670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4690f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
4700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageListChanged() {
4710f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
4720f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4730f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
47519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    public void onRebuildComplete(ArrayList<AppEntry> apps) {
47619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    }
47719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
47819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    @Override
4790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageSizeChanged(String packageName) {
4800f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (packageName.equals(mAppEntry.info.packageName)) {
4810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            refreshSizeInfo();
4820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
4830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4840f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
4860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onRunningStateChanged(boolean running) {
4870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
4880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
4890f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private boolean refreshUi() {
4900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mMoveInProgress) {
4910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return true;
4920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
4930c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        final Bundle args = getArguments();
4940c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        String packageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null;
495f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        if (packageName == null) {
4960c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy            Intent intent = (args == null) ?
4970c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy                    getActivity().getIntent() : (Intent) args.getParcelable("intent");
498f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (intent != null) {
499f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                packageName = intent.getData().getSchemeSpecificPart();
500f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
501f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
5020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mAppEntry = mState.getEntry(packageName);
5030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry == null) {
5050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
506b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
507b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
50850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application info again to refresh changed properties of application
50950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        try {
5100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
5110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_DISABLED_COMPONENTS |
5120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_UNINSTALLED_PACKAGES |
5130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_SIGNATURES);
51450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } catch (NameNotFoundException e) {
5150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
5160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
51750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
518b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
5190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Get list of preferred activities
5200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<ComponentName> prefActList = new ArrayList<ComponentName>();
521b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
5220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Intent list cannot be null. so pass empty list
5230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<IntentFilter> intentList = new ArrayList<IntentFilter>();
5240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mPm.getPreferredActivities(intentList, prefActList, packageName);
525c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        if (localLOGV)
526c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            Log.i(TAG, "Have " + prefActList.size() + " number of activities in preferred list");
5279d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        boolean hasUsbDefaults = false;
5289d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        try {
5292715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood            hasUsbDefaults = mUsbManager.hasDefaults(packageName);
5309d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        } catch (RemoteException e) {
5319d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            Log.e(TAG, "mUsbManager.hasDefaults", e);
5329d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        }
533c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        boolean hasBindAppWidgetPermission =
534c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                mAppWidgetManager.hasBindAppWidgetPermission(mAppEntry.info.packageName);
535c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
536c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        TextView autoLaunchTitleView = (TextView) mRootView.findViewById(R.id.auto_launch_title);
537c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
538c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        boolean autoLaunchEnabled = prefActList.size() > 0 || hasUsbDefaults;
539c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        if (!autoLaunchEnabled && !hasBindAppWidgetPermission) {
540c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView);
5410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else {
542c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            boolean useBullets = hasBindAppWidgetPermission && autoLaunchEnabled;
543c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
544c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (hasBindAppWidgetPermission) {
545c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                autoLaunchTitleView.setText(R.string.auto_launch_label_generic);
546c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            } else {
547c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                autoLaunchTitleView.setText(R.string.auto_launch_label);
548c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
549c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
550c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            CharSequence text = null;
551c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            int bulletIndent = getResources()
552c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    .getDimensionPixelSize(R.dimen.installed_app_details_bullet_offset);
553c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (autoLaunchEnabled) {
554c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                CharSequence autoLaunchEnableText = getText(R.string.auto_launch_enable_text);
555c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                SpannableString s = new SpannableString(autoLaunchEnableText);
556c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                if (useBullets) {
557c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    s.setSpan(new BulletSpan(bulletIndent), 0, autoLaunchEnableText.length(), 0);
558c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                }
559c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                text = (text == null) ?
560c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n");
561c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
562c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (hasBindAppWidgetPermission) {
563c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                CharSequence alwaysAllowBindAppWidgetsText =
564c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        getText(R.string.always_allow_bind_appwidgets_text);
565c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                SpannableString s = new SpannableString(alwaysAllowBindAppWidgetsText);
566c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                if (useBullets) {
567c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    s.setSpan(new BulletSpan(bulletIndent),
568c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                            0, alwaysAllowBindAppWidgetsText.length(), 0);
569c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                }
570c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                text = (text == null) ?
571c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n");
572c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
573c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            autoLaunchView.setText(text);
5740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setEnabled(true);
5750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setOnClickListener(this);
5760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
577aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
578aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility section.
579aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
580aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
581aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        int compatMode = am.getPackageScreenCompatMode(packageName);
58213bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // For now these are always off; this is the old UI model which we
58313bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // are no longer using.
58413bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        if (false && (compatMode == ActivityManager.COMPAT_MODE_DISABLED
58513bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn                || compatMode == ActivityManager.COMPAT_MODE_ENABLED)) {
586aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.VISIBLE);
587aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setChecked(am.getPackageAskScreenCompat(packageName));
588aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setOnCheckedChangeListener(this);
589aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setChecked(compatMode == ActivityManager.COMPAT_MODE_ENABLED);
590aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setOnCheckedChangeListener(this);
591aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else {
592aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.GONE);
593aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
594aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
5950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Security permissions section
596f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        LinearLayout permsView = (LinearLayout) mRootView.findViewById(R.id.permissions_section);
597f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        AppSecurityPermissions asp = new AppSecurityPermissions(getActivity(), packageName);
5980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (asp.getPermissionCount() > 0) {
5990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            permsView.setVisibility(View.VISIBLE);
6000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            // Make the security sections header visible
6010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            LinearLayout securityList = (LinearLayout) permsView.findViewById(
6020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    R.id.security_settings_list);
6030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.removeAllViews();
6040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.addView(asp.getPermissionsView());
605e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            // If this app is running under a shared user ID with other apps,
606e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            // update the description to explain this.
607e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            String[] packages = mPm.getPackagesForUid(mPackageInfo.applicationInfo.uid);
608e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            if (packages != null && packages.length > 1) {
609e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                ArrayList<CharSequence> pnames = new ArrayList<CharSequence>();
610e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                for (int i=0; i<packages.length; i++) {
611e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    String pkg = packages[i];
612e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    if (mPackageInfo.packageName.equals(pkg)) {
613e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        continue;
614e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
615e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    try {
616e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        ApplicationInfo ainfo = mPm.getApplicationInfo(pkg, 0);
617e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        pnames.add(ainfo.loadLabel(mPm));
618e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
619e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
620e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                }
621e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                final int N = pnames.size();
622e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                if (N > 0) {
623e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    final Resources res = getActivity().getResources();
624e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    String appListStr;
625e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    if (N == 1) {
626e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = pnames.get(0).toString();
627e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } else if (N == 2) {
628e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = res.getString(R.string.join_two_items, pnames.get(0),
629e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                pnames.get(1));
630e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } else {
631e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = pnames.get(N-2).toString();
632e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        for (int i=N-3; i>=0; i--) {
633e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            appListStr = res.getString(i == 0 ? R.string.join_many_items_first
634e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                    : R.string.join_many_items_middle, pnames.get(i), appListStr);
635e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        }
636e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = res.getString(R.string.join_many_items_last,
637e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                appListStr, pnames.get(N-1));
638e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
639e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    TextView descr = (TextView) mRootView.findViewById(
640e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            R.id.security_settings_desc);
641e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    descr.setText(res.getString(R.string.security_settings_desc_multi,
642e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            mPackageInfo.applicationInfo.loadLabel(mPm), appListStr));
643e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                }
644e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            }
6450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else {
6460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            permsView.setVisibility(View.GONE);
647de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
6480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
6490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        checkForceStop();
6500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        setAppLabelAndIcon(mPackageInfo);
6510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshButtons();
6520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshSizeInfo();
6530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        return true;
654afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
6550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
656c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    private void resetLaunchDefaultsUi(TextView title, TextView autoLaunchView) {
657c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        title.setText(R.string.auto_launch_label);
658c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        autoLaunchView.setText(R.string.auto_launch_disable_text);
659c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        // Disable clear activities button
660c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        mActivitiesButton.setEnabled(false);
661c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    }
662c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
663afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
664afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
665afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
666afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
667ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        PreferenceActivity pa = (PreferenceActivity)getActivity();
668ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        pa.finishPreferencePanel(this, Activity.RESULT_OK, intent);
669afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
670afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
6710f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private void refreshSizeInfo() {
6720f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry.size == ApplicationsState.SIZE_INVALID
6730f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) {
6740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1;
6750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (!mHaveSizes) {
6760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mAppSize.setText(mComputingStr);
6770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mDataSize.setText(mComputingStr);
6780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mCacheSize.setText(mComputingStr);
6790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(mComputingStr);
6800f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
6810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearDataButton.setEnabled(false);
6820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearCacheButton.setEnabled(false);
6830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
684afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
6850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mHaveSizes = true;
6861f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            long codeSize = mAppEntry.codeSize;
6871f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            long dataSize = mAppEntry.dataSize;
6881f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (Environment.isExternalStorageEmulated()) {
6891f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                codeSize += mAppEntry.externalCodeSize;
6901f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                dataSize +=  mAppEntry.externalDataSize;
6911f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            } else {
6921f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                if (mLastExternalCodeSize != mAppEntry.externalCodeSize) {
6931f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mLastExternalCodeSize = mAppEntry.externalCodeSize;
6941f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mExternalCodeSize.setText(getSizeStr(mAppEntry.externalCodeSize));
6951f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                }
6961f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                if (mLastExternalDataSize !=  mAppEntry.externalDataSize) {
6971f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mLastExternalDataSize =  mAppEntry.externalDataSize;
6981f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mExternalDataSize.setText(getSizeStr( mAppEntry.externalDataSize));
6991f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                }
700afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
7011f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (mLastCodeSize != codeSize) {
7021f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mLastCodeSize = codeSize;
7031f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mAppSize.setText(getSizeStr(codeSize));
704bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            }
7051f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (mLastDataSize != dataSize) {
7061f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mLastDataSize = dataSize;
7071f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mDataSize.setText(getSizeStr(dataSize));
708424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root            }
709313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            long cacheSize = mAppEntry.cacheSize + mAppEntry.externalCacheSize;
710313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            if (mLastCacheSize != cacheSize) {
711313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn                mLastCacheSize = cacheSize;
712313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn                mCacheSize.setText(getSizeStr(cacheSize));
713afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
7140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastTotalSize != mAppEntry.size) {
7150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastTotalSize = mAppEntry.size;
7160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(getSizeStr(mAppEntry.size));
717afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
7180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
7191f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if ((mAppEntry.dataSize+ mAppEntry.externalDataSize) <= 0 || !mCanClearData) {
7200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(false);
7210f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
7220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(true);
7230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setOnClickListener(this);
7240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
725313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            if (cacheSize <= 0) {
7260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(false);
7270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
7280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(true);
7290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setOnClickListener(this);
730afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
731afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
732afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
733afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
734afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
735afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
736afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
737afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
738afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
739afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
7400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
74142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
742afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
74342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
7440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
745afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
74642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
747afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
7489db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        checkForceStop();
749afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
750ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
751de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void refreshButtons() {
752de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        if (!mMoveInProgress) {
753de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initUninstallButtons();
754de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initDataButtons();
755de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initMoveButton();
7564a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            initNotificationButton();
757de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        } else {
758de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
759de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setEnabled(false);
760de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mUninstallButton.setEnabled(false);
761de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
762de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    }
763de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu
764ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
765ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
7660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
767de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        // Refresh the button attributes.
768de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        mMoveInProgress = false;
7690f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (result == PackageManager.MOVE_SUCCEEDED) {
770ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
771de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            // Refresh size information again.
7720f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
773ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
774f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_MOVE_FAILED, result);
775ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
7760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
777ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
7785cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
779afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
780afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
781afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
782afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
78342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
78442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
78542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
7860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
78742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
7880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mClearDataObserver == null) {
789afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
790afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
791f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)
792f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
793afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
7940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!res) {
79550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
796afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
797f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_CANNOT_CLEAR_DATA, 0);
798afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
79942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
800afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
801afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
802afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
803f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private void showDialogInner(int id, int moveErrorCode) {
804f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        DialogFragment newFragment = MyAlertDialogFragment.newInstance(id, moveErrorCode);
805f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.setTargetFragment(this, 0);
806f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.show(getFragmentManager(), "dialog " + id);
80750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
80850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
809f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static class MyAlertDialogFragment extends DialogFragment {
810f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
811f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public static MyAlertDialogFragment newInstance(int id, int moveErrorCode) {
812f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            MyAlertDialogFragment frag = new MyAlertDialogFragment();
813f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            Bundle args = new Bundle();
814f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("id", id);
815f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("moveError", moveErrorCode);
816f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            frag.setArguments(args);
817f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return frag;
818f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
819f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
820f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        InstalledAppDetails getOwner() {
821f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return (InstalledAppDetails)getTargetFragment();
822f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
823f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
824f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        @Override
825f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public Dialog onCreateDialog(Bundle savedInstanceState) {
826f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int id = getArguments().getInt("id");
827f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int moveErrorCode = getArguments().getInt("moveError");
828f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            switch (id) {
829f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CLEAR_DATA:
830f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
831f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_data_dlg_title))
832e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
833f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_data_dlg_text))
834f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
835f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
836f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
837f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
838f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().initiateClearUserData();
839f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
840f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
841f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
842f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
843f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FACTORY_RESET:
844f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
845f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title))
846e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
847f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text))
848f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
849f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
850f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
851f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
852f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName);
853f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
854f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
855f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
856f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
857f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_APP_NOT_FOUND:
858f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
859f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_not_found_dlg_title))
860e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
861f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_not_found_dlg_title))
862f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(getActivity().getText(R.string.dlg_ok),
863f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
864f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
865f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
866f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(true, true);
867f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
868f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
869f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
870f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CANNOT_CLEAR_DATA:
871f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
872f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_failed_dlg_title))
873e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
874f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_failed_dlg_text))
875f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok,
876f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
877f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
878f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().mClearDataButton.setEnabled(false);
879f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
880f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(false, false);
881f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
882f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
883f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
884f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FORCE_STOP:
885f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
886f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.force_stop_dlg_title))
887e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
888f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.force_stop_dlg_text))
889f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
890f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        new DialogInterface.OnClickListener() {
891f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
892f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Force stop
893f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().forceStopPackage(getOwner().mAppEntry.info.packageName);
894f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
895f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
896f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
897f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
898f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_MOVE_FAILED:
899f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    CharSequence msg = getActivity().getString(R.string.move_app_failed_dlg_text,
900f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().getMoveErrMsg(moveErrorCode));
901f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
902f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title))
903e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
904f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(msg)
905f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok, null)
906f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
907f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                case DLG_DISABLE:
908f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    return new AlertDialog.Builder(getActivity())
909f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_disable_dlg_title))
910e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
911f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_disable_dlg_text))
912f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
913f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DialogInterface.OnClickListener() {
914f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
915f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            // Disable the app
916f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            new DisableChanger(getOwner(), getOwner().mAppEntry.info,
917f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER)
918f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            .execute((Object)null);
919f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        }
920f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    })
921f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
922f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .create();
92370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                case DLG_DISABLE_NOTIFICATIONS:
92470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    return new AlertDialog.Builder(getActivity())
92570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setTitle(getActivity().getText(R.string.app_disable_notifications_dlg_title))
926c8272b075275f81ddfb9cef2f92514b7ce3365deBjörn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
92770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setMessage(getActivity().getText(R.string.app_disable_notifications_dlg_text))
92870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setPositiveButton(R.string.dlg_ok,
92970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        new DialogInterface.OnClickListener() {
93070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        public void onClick(DialogInterface dialog, int which) {
93170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            // Disable the package's notifications
93270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            getOwner().setNotificationsEnabled(false);
93370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        }
93470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    })
93570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setNegativeButton(R.string.dlg_cancel,
93670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        new DialogInterface.OnClickListener() {
93770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        public void onClick(DialogInterface dialog, int which) {
93870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            // Re-enable the checkbox
93970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            getOwner().mNotificationSwitch.setChecked(true);
94070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        }
94170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    })
94270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .create();
943f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
944f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            throw new IllegalArgumentException("unknown id " + id);
945f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
94650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
94750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
94850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void uninstallPkg(String packageName) {
94950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
95050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
95150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
95250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        startActivity(uninstallIntent);
95350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setIntentAndFinish(true, true);
95450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
95550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
95642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
957f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)getActivity().getSystemService(
95842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
95942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
960c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        mState.invalidatePackage(pkgName);
961c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName);
962c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        if (newEnt != null) {
963c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn            mAppEntry = newEnt;
964c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        }
965cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
96642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
96742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
968cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
969cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
970cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
971861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED);
972cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
973cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
974861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn
975861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    private void updateForceStopButton(boolean enabled) {
976861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setEnabled(enabled);
977861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setOnClickListener(InstalledAppDetails.this);
978861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    }
979cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
980cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
9815c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
9825c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            // User can't force stop device admin.
9835c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            updateForceStopButton(false);
9845c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
985861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // If the app isn't explicitly stopped, then always show the
986861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // force stop button.
987861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(true);
988861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        } else {
9895c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
9905c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                    Uri.fromParts("package", mAppEntry.info.packageName, null));
9915c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
9925c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
993861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
994861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn                    Activity.RESULT_CANCELED, null, null);
995861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        }
996cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
99770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
9989db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    static class DisableChanger extends AsyncTask<Object, Object, Object> {
9999db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final PackageManager mPm;
10009db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final WeakReference<InstalledAppDetails> mActivity;
10019db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final ApplicationInfo mInfo;
10029db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final int mState;
10039db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
10049db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) {
10059db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm = activity.mPm;
10069db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mActivity = new WeakReference<InstalledAppDetails>(activity);
10079db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mInfo = info;
10089db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mState = state;
10099db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
10109db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
10119db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        @Override
10129db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        protected Object doInBackground(Object... params) {
10139db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0);
10149db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            return null;
10159db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
10169db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    }
10179db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
101870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private void setNotificationsEnabled(boolean enabled) {
101970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        String packageName = mAppEntry.info.packageName;
102070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        INotificationManager nm = INotificationManager.Stub.asInterface(
102170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
102270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        try {
102370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            final boolean enable = mNotificationSwitch.isChecked();
102470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            nm.setNotificationsEnabledForPackage(packageName, enabled);
102570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } catch (android.os.RemoteException ex) {
102670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setChecked(!enabled); // revert
102770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
102870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    }
102970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
1030afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
1031afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
1032afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
1033afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
1034afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
10350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
103642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
103742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
1038f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_FACTORY_RESET, 0);
103942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
10400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
1041f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    if (mAppEntry.info.enabled) {
1042f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        showDialogInner(DLG_DISABLE, 0);
1043f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    } else {
1044f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DisableChanger(this, mAppEntry.info,
1045f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT)
1046f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        .execute((Object)null);
1047f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    }
10482e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) {
10492e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    try {
10502e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                        mPm.installExistingPackage(packageName);
10512e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                        refreshUi();
10522e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    } catch (NameNotFoundException e) {
10532e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    }
10549db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                } else {
10559db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                    uninstallPkg(packageName);
10569db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
1057afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1058afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
1059afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
10609d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            try {
10612715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood                mUsbManager.clearDefaults(packageName);
10629d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            } catch (RemoteException e) {
10639d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood                Log.e(TAG, "mUsbManager.clearDefaults", e);
10649d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            }
1065c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            mAppWidgetManager.setBindAppWidgetPermission(packageName, false);
1066c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            TextView autoLaunchTitleView =
1067c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    (TextView) mRootView.findViewById(R.id.auto_launch_title);
1068c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
1069c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView);
107042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
10710f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
10723fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                if (!Utils.isMonkeyRunning()) {
10733fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                    Intent intent = new Intent(Intent.ACTION_DEFAULT);
10743fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                    intent.setClassName(mAppEntry.info.packageName,
10753fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                            mAppEntry.info.manageSpaceActivityName);
10763fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                    startActivityForResult(intent, -1);
10773fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                }
107842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
1079f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_CLEAR_DATA, 0);
108042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
1081afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
1082afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
1083afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
1084afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
1085afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1086afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
1087afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
1088f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_FORCE_STOP, 0);
10899db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            //forceStopPackage(mAppInfo.packageName);
1090ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
1091ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
1092ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
1093ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
10940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ?
1095ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
1096de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveInProgress = true;
1097de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            refreshButtons();
10980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags);
1099afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1101aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
1102aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    @Override
1103aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1104aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        String packageName = mAppEntry.info.packageName;
1105aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
1106aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
1107aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        if (buttonView == mAskCompatibilityCB) {
1108aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageAskScreenCompat(packageName, isChecked);
1109aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else if (buttonView == mEnableCompatibilityCB) {
1110aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageScreenCompatMode(packageName, isChecked ?
1111aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                    ActivityManager.COMPAT_MODE_ENABLED : ActivityManager.COMPAT_MODE_DISABLED);
11124a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } else if (buttonView == mNotificationSwitch) {
111370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            if (!isChecked) {
111470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                showDialogInner(DLG_DISABLE_NOTIFICATIONS, 0);
111570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            } else {
111670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                setNotificationsEnabled(true);
11174a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            }
1118aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
1119aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    }
1120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1122