InstalledAppDetails.java revision c715fb1207361bb2a793752eefb02f1956075739
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
193465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport com.android.internal.telephony.ISms;
203465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport com.android.internal.telephony.SmsUsageMonitor;
21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R;
223fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasaniimport com.android.settings.Utils;
2319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport com.android.settings.applications.ApplicationsState.AppEntry;
24728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.ActivityManager;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog;
2850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.app.Dialog;
29f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.DialogFragment;
30f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment;
314a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandlerimport android.app.INotificationManager;
325c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackbornimport android.app.admin.DevicePolicyManager;
33c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.appwidget.AppWidgetManager;
34cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver;
35c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.content.ComponentName;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver;
42ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver;
4350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager;
459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.content.pm.ResolveInfo;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
47e458832c765ed5c3de836384338c7626c80b5686Dianne Hackbornimport android.content.res.Resources;
489d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.hardware.usb.IUsbManager;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri;
509db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.os.AsyncTask;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
52ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.os.Environment;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler;
549d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.os.IBinder;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message;
5650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException;
579d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.os.ServiceManager;
583db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.os.UserHandle;
593db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.os.UserManager;
60ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.preference.PreferenceActivity;
61c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.text.SpannableString;
62c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.text.TextUtils;
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter;
64c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.text.style.BulletSpan;
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
669db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
679db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport java.lang.ref.WeakReference;
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
70f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.LayoutInflater;
713db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.Menu;
723db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuInflater;
733db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuItem;
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
75f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.ViewGroup;
763465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport android.widget.AdapterView;
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
783465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport android.widget.ArrayAdapter;
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
80aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackbornimport android.widget.CheckBox;
81aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackbornimport android.widget.CompoundButton;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
843465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport android.widget.Spinner;
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
96f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class InstalledAppDetails extends Fragment
97aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        implements View.OnClickListener, CompoundButton.OnCheckedChangeListener,
98aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ApplicationsState.Callbacks {
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
1002f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn    private static final boolean localLOGV = false;
1010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
102f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static final String ARG_PACKAGE_NAME = "package";
103f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
1040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageManager mPm;
1053db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    private UserManager mUserManager;
1069d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood    private IUsbManager mUsbManager;
107c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    private AppWidgetManager mAppWidgetManager;
1085c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn    private DevicePolicyManager mDpm;
1093465b67740e17711af2b36b09e2250a02275d860Jake Hamby    private ISms mSmsManager;
1100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState mState;
111309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ApplicationsState.Session mSession;
1120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState.AppEntry mAppEntry;
1130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageInfo mPackageInfo;
1146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    private CanBeOnSdCardChecker mCanBeOnSdCardChecker;
115f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private View mRootView;
11642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mUninstallButton;
117de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private boolean mMoveInProgress = false;
11842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private boolean mUpdatedSysApp = false;
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
120aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private View mScreenCompatSection;
121aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private CheckBox mAskCompatibilityCB;
122aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private CheckBox mEnableCompatibilityCB;
1232f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn    private boolean mCanClearData = true;
12450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private TextView mAppVersion;
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
128bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private TextView mExternalCodeSize;
129bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private TextView mExternalDataSize;
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
13642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mClearDataButton;
13742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mMoveAppButton;
13870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private CompoundButton mNotificationSwitch;
1394a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
140ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private PackageMoveObserver mPackageMoveObserver;
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private boolean mHaveSizes = false;
1430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCodeSize = -1;
1440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastDataSize = -1;
145bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private long mLastExternalCodeSize = -1;
146bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private long mLastExternalDataSize = -1;
1470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCacheSize = -1;
1480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastTotalSize = -1;
1490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
155ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private static final int PACKAGE_MOVE = 4;
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
16550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
16650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
16750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
16850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
16950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
17050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
17142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private static final int DLG_FORCE_STOP = DLG_BASE + 5;
1725cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private static final int DLG_MOVE_FAILED = DLG_BASE + 6;
173f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn    private static final int DLG_DISABLE = DLG_BASE + 7;
17470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private static final int DLG_DISABLE_NOTIFICATIONS = DLG_BASE + 8;
1753db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
1763db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    // Menu identifiers
1773db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public static final int UNINSTALL_ALL_USERS_MENU = 1;
1783db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
1793db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    // Result code identifiers
1803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public static final int REQUEST_UNINSTALL = 1;
1813db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public static final int REQUEST_MANAGE_SPACE = 2;
1823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
185f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            // If the fragment is gone, don't process any more messages.
186f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (getView() == null) {
18707f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn                return;
18807f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            }
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
1950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    mState.requestSize(mAppEntry.info.packageName);
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
197ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                case PACKAGE_MOVE:
198ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    processMoveMsg(msg);
199ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    break;
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
217ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
221ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
222ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    class PackageMoveObserver extends IPackageMoveObserver.Stub {
223ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        public void packageMoved(String packageName, int returnCode) throws RemoteException {
224ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            final Message msg = mHandler.obtainMessage(PACKAGE_MOVE);
225ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = returnCode;
226ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mHandler.sendMessage(msg);
227ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
228ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
234f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return Formatter.formatFileSize(getActivity(), size);
235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
23742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initDataButtons() {
2382f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn        if ((mAppEntry.info.flags&(ApplicationInfo.FLAG_SYSTEM
2392f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                | ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA))
2405c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                == ApplicationInfo.FLAG_SYSTEM
2415c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
24242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.clear_user_data_text);
2432f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setEnabled(false);
2442f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mCanClearData = false;
2452f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn        } else {
2462f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
2472f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.manage_space_text);
2482f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            } else {
2492f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.clear_user_data_text);
2502f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            }
2512f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setOnClickListener(this);
25242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
253ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
254ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
2555cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private CharSequence getMoveErrMsg(int errCode) {
2565cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        switch (errCode) {
2575cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
258f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.insufficient_storage);
2595cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_DOESNT_EXIST:
260f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.does_not_exist);
2615cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_FORWARD_LOCKED:
262f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.app_forward_locked);
2635cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INVALID_LOCATION:
264f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.invalid_location);
2655cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE:
266f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.system_package);
2679a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INTERNAL_ERROR:
2689a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu                return "";
2695cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        }
2709a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu        return "";
2715cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    }
2725cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
273ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void initMoveButton() {
274ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (Environment.isExternalStorageEmulated()) {
275ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mMoveAppButton.setVisibility(View.INVISIBLE);
276ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return;
277ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
27842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean dataOnly = false;
2790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        dataOnly = (mPackageInfo == null) && (mAppEntry != null);
280ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        boolean moveDisable = true;
28142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (dataOnly) {
28242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app);
2830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
28442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_internal);
2854056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu            // Always let apps move to internal storage from sdcard.
286ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = false;
28742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
28842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_sdcard);
2896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            mCanBeOnSdCardChecker.init();
2906dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            moveDisable = !mCanBeOnSdCardChecker.check(mAppEntry.info);
291730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu        }
292ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if (moveDisable) {
293ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
294ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
295ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setOnClickListener(this);
296ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(true);
297ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
29842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
29942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
30070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private boolean isThisASystemPackage() {
30170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        try {
30270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            PackageInfo sys = mPm.getPackageInfo("android", PackageManager.GET_SIGNATURES);
30370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            return (mPackageInfo != null && mPackageInfo.signatures != null &&
30470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    sys.signatures[0].equals(mPackageInfo.signatures[0]));
30570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } catch (PackageManager.NameNotFoundException e) {
30670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            return false;
30770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
30870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    }
30970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
310de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void initUninstallButtons() {
3110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
31242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean enabled = true;
31342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mUpdatedSysApp) {
31442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.app_factory_reset);
31542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
3160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
317b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu                enabled = false;
3183db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                try {
3193db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    // Try to prevent the user from bricking their phone
3203db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    // by not allowing disabling of apps signed with the
3213db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    // system cert and any launcher app in the system.
3223db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    PackageInfo sys = mPm.getPackageInfo("android",
3233db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                            PackageManager.GET_SIGNATURES);
3243db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    Intent intent = new Intent(Intent.ACTION_MAIN);
3253db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    intent.addCategory(Intent.CATEGORY_HOME);
3263db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    intent.setPackage(mAppEntry.info.packageName);
3273db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    List<ResolveInfo> homes = mPm.queryIntentActivities(intent, 0);
3283db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    if ((homes != null && homes.size() > 0) || isThisASystemPackage()) {
3293db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                        // Disable button for core system applications.
3303db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                        mUninstallButton.setText(R.string.disable_text);
3313db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    } else if (mAppEntry.info.enabled) {
3323db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                        mUninstallButton.setText(R.string.disable_text);
3333db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                        enabled = true;
3343db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    } else {
3353db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                        mUninstallButton.setText(R.string.enable_text);
3363db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                        enabled = true;
3379db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                    }
3383db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                } catch (PackageManager.NameNotFoundException e) {
3393db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    Log.w(TAG, "Unable to get package info", e);
3409db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
3412e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn            } else if ((mPackageInfo.applicationInfo.flags
3422e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    & ApplicationInfo.FLAG_INSTALLED) == 0) {
343c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn                mUninstallButton.setText(R.string.uninstall_text);
344c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn                enabled = false;
3459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            } else {
3469db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                mUninstallButton.setText(R.string.uninstall_text);
347b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu            }
34842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
3495c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        // If this is a device admin, it can't be uninstall or disabled.
3505c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        // We do this here so the text of the button is still set correctly.
3515c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
3525c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            enabled = false;
3535c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        }
35442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
35542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
35642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
35742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
35842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
35942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
36042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
3614a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    private void initNotificationButton() {
3624a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        INotificationManager nm = INotificationManager.Stub.asInterface(
3634a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
3644a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        boolean enabled = true; // default on
3654a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        try {
3664a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            enabled = nm.areNotificationsEnabledForPackage(mAppEntry.info.packageName);
3674a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } catch (android.os.RemoteException ex) {
3684a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            // this does not bode well
3694a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        }
3704a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        mNotificationSwitch.setChecked(enabled);
37170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        if (isThisASystemPackage()) {
37270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setEnabled(false);
37370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } else {
37470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setEnabled(true);
37570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setOnCheckedChangeListener(this);
37670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
3774a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    }
3784a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
381f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle icicle) {
382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
3833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
384f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mState = ApplicationsState.getInstance(getActivity().getApplication());
385309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession = mState.newSession(this);
386f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mPm = getActivity().getPackageManager();
3873db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        mUserManager = (UserManager)getActivity().getSystemService(Context.USER_SERVICE);
3889d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        IBinder b = ServiceManager.getService(Context.USB_SERVICE);
3899d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        mUsbManager = IUsbManager.Stub.asInterface(b);
390c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        mAppWidgetManager = AppWidgetManager.getInstance(getActivity());
3915c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
3923465b67740e17711af2b36b09e2250a02275d860Jake Hamby        mSmsManager = ISms.Stub.asInterface(ServiceManager.getService("isms"));
3939d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood
3946dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mCanBeOnSdCardChecker = new CanBeOnSdCardChecker();
3950fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
396c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn        // Need to make sure we have loaded applications at this point.
397c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn        mSession.resume();
398c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn
3990fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        retrieveAppEntry();
4000fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
4010fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        setHasOptionsMenu(true);
402f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    }
403f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
404f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    @Override
405f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
406f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View view = mRootView = inflater.inflate(R.layout.installed_app_details, null);
4076dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
408f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingStr = getActivity().getText(R.string.computing_size);
409b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
41050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
411f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mTotalSize = (TextView)view.findViewById(R.id.total_size_text);
412f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mAppSize = (TextView)view.findViewById(R.id.application_size_text);
413f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mDataSize = (TextView)view.findViewById(R.id.data_size_text);
414bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalCodeSize = (TextView)view.findViewById(R.id.external_code_size_text);
415bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalDataSize = (TextView)view.findViewById(R.id.external_data_size_text);
4161f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn
4171f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn        if (Environment.isExternalStorageEmulated()) {
4181f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            ((View)mExternalCodeSize.getParent()).setVisibility(View.GONE);
4191f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            ((View)mExternalDataSize.getParent()).setVisibility(View.GONE);
4201f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn        }
4211f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn
42242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
423f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View btnPanel = view.findViewById(R.id.control_buttons_panel);
42442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
42542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
42642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
427cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
428b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
42942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
430f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View data_buttons_panel = view.findViewById(R.id.data_buttons_panel);
431313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
432313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
433b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Cache section
435f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mCacheSize = (TextView) view.findViewById(R.id.cache_size_text);
436f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mClearCacheButton = (Button) view.findViewById(R.id.clear_cache_button);
437f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
438f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mActivitiesButton = (Button)view.findViewById(R.id.clear_activities_button);
4390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
440aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility control
441aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mScreenCompatSection = view.findViewById(R.id.screen_compatibility_section);
442aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mAskCompatibilityCB = (CheckBox)view.findViewById(R.id.ask_compatibility_cb);
443aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mEnableCompatibilityCB = (CheckBox)view.findViewById(R.id.enable_compatibility_cb);
4444a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
44570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        mNotificationSwitch = (CompoundButton) view.findViewById(R.id.notification_switch);
446aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
447f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return view;
448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
449f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
4503db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4513db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
4523db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text)
4533db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4543db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
4553db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
4563db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4573db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onPrepareOptionsMenu(Menu menu) {
4583db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        boolean showIt = true;
4593db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (mUpdatedSysApp) {
4603db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4610fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        } else if (mAppEntry == null) {
4620fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn            showIt = false;
4633db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
4643db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4653db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
4663db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4673db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if (UserHandle.myUserId() != 0) {
4683db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4693db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if (mUserManager.getUsers().size() < 1) {
4703db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4713db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
4723db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt);
4733db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
4743db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
4753db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4763db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public boolean onOptionsItemSelected(MenuItem item) {
4773db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        int menuId = item.getItemId();
4783db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (menuId == UNINSTALL_ALL_USERS_MENU) {
4793db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            uninstallPkg(mAppEntry.info.packageName, true);
4803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            return true;
4813db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
4823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        return false;
4833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
4843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
4853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onActivityResult(int requestCode, int resultCode, Intent data) {
4873db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        super.onActivityResult(requestCode, resultCode, data);
4883db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (requestCode == REQUEST_UNINSTALL) {
4893db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            if (!refreshUi()) {
4903db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                setIntentAndFinish(true, true);
4913db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            }
4923db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
4933db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
4943db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
49550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set applicaiton label and icon.
496f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    private void setAppLabelAndIcon(PackageInfo pkgInfo) {
497f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View appSnippet = mRootView.findViewById(R.id.app_snippet);
498f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
4990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.ensureIcon(mAppEntry);
5000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        icon.setImageDrawable(mAppEntry.icon);
501f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        // Set application name.
502f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
5030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        label.setText(mAppEntry.label);
50450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
505f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size);
506f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
507f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        if (pkgInfo != null && pkgInfo.versionName != null) {
50850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
509f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            mAppVersion.setText(getActivity().getString(R.string.version_text,
5108e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
51150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
512f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu            mAppVersion.setVisibility(View.INVISIBLE);
51350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
51450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
51550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
51650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
51742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
51842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
519b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
520309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession.resume();
5210f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!refreshUi()) {
522b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            setIntentAndFinish(true, true);
523b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
5240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5250f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPause() {
5280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        super.onPause();
529309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession.pause();
5300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onAllSizesComputed() {
5340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageIconChanged() {
5380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageListChanged() {
5420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
5430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
54619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    public void onRebuildComplete(ArrayList<AppEntry> apps) {
54719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    }
54819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
54919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    @Override
5500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageSizeChanged(String packageName) {
5510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (packageName.equals(mAppEntry.info.packageName)) {
5520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            refreshSizeInfo();
5530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
5540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onRunningStateChanged(boolean running) {
5580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5590f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5600fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn    private String retrieveAppEntry() {
5610c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        final Bundle args = getArguments();
5620c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        String packageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null;
563f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        if (packageName == null) {
5640c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy            Intent intent = (args == null) ?
5650c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy                    getActivity().getIntent() : (Intent) args.getParcelable("intent");
566f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (intent != null) {
567f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                packageName = intent.getData().getSchemeSpecificPart();
568f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
569f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
5700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mAppEntry = mState.getEntry(packageName);
571b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani        // Get application info again to refresh changed properties of application
572b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani        try {
573b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani            mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
574b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani                    PackageManager.GET_DISABLED_COMPONENTS |
575b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani                    PackageManager.GET_UNINSTALLED_PACKAGES |
576b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani                    PackageManager.GET_SIGNATURES);
577b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani        } catch (NameNotFoundException e) {
578b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani            Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
579b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani        }
580b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani
5810fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        return packageName;
5820fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn    }
5830fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
5840fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn    private boolean refreshUi() {
5850fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        if (mMoveInProgress) {
5860fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn            return true;
5870fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        }
5880fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        final String packageName = retrieveAppEntry();
5890fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
5900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry == null) {
5910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
592b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
593b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani
594b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani        if (mPackageInfo == null) {
5950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
59650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
597b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani
5980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Get list of preferred activities
5990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<ComponentName> prefActList = new ArrayList<ComponentName>();
600b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
6010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Intent list cannot be null. so pass empty list
6020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<IntentFilter> intentList = new ArrayList<IntentFilter>();
6030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mPm.getPreferredActivities(intentList, prefActList, packageName);
604c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        if (localLOGV)
605c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            Log.i(TAG, "Have " + prefActList.size() + " number of activities in preferred list");
6069d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        boolean hasUsbDefaults = false;
6079d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        try {
6082715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood            hasUsbDefaults = mUsbManager.hasDefaults(packageName);
6099d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        } catch (RemoteException e) {
6109d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            Log.e(TAG, "mUsbManager.hasDefaults", e);
6119d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        }
612c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        boolean hasBindAppWidgetPermission =
613c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                mAppWidgetManager.hasBindAppWidgetPermission(mAppEntry.info.packageName);
614c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
615c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        TextView autoLaunchTitleView = (TextView) mRootView.findViewById(R.id.auto_launch_title);
616c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
617c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        boolean autoLaunchEnabled = prefActList.size() > 0 || hasUsbDefaults;
618c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        if (!autoLaunchEnabled && !hasBindAppWidgetPermission) {
619c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView);
6200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else {
621c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            boolean useBullets = hasBindAppWidgetPermission && autoLaunchEnabled;
622c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
623c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (hasBindAppWidgetPermission) {
624c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                autoLaunchTitleView.setText(R.string.auto_launch_label_generic);
625c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            } else {
626c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                autoLaunchTitleView.setText(R.string.auto_launch_label);
627c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
628c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
629c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            CharSequence text = null;
630c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            int bulletIndent = getResources()
631c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    .getDimensionPixelSize(R.dimen.installed_app_details_bullet_offset);
632c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (autoLaunchEnabled) {
633c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                CharSequence autoLaunchEnableText = getText(R.string.auto_launch_enable_text);
634c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                SpannableString s = new SpannableString(autoLaunchEnableText);
635c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                if (useBullets) {
636c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    s.setSpan(new BulletSpan(bulletIndent), 0, autoLaunchEnableText.length(), 0);
637c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                }
638c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                text = (text == null) ?
639c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n");
640c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
641c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (hasBindAppWidgetPermission) {
642c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                CharSequence alwaysAllowBindAppWidgetsText =
643c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        getText(R.string.always_allow_bind_appwidgets_text);
644c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                SpannableString s = new SpannableString(alwaysAllowBindAppWidgetsText);
645c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                if (useBullets) {
646c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    s.setSpan(new BulletSpan(bulletIndent),
647c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                            0, alwaysAllowBindAppWidgetsText.length(), 0);
648c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                }
649c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                text = (text == null) ?
650c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n");
651c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
652c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            autoLaunchView.setText(text);
6530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setEnabled(true);
6540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setOnClickListener(this);
6550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
656aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
657aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility section.
658aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
659aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
660aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        int compatMode = am.getPackageScreenCompatMode(packageName);
66113bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // For now these are always off; this is the old UI model which we
66213bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // are no longer using.
66313bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        if (false && (compatMode == ActivityManager.COMPAT_MODE_DISABLED
66413bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn                || compatMode == ActivityManager.COMPAT_MODE_ENABLED)) {
665aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.VISIBLE);
666aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setChecked(am.getPackageAskScreenCompat(packageName));
667aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setOnCheckedChangeListener(this);
668aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setChecked(compatMode == ActivityManager.COMPAT_MODE_ENABLED);
669aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setOnCheckedChangeListener(this);
670aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else {
671aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.GONE);
672aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
673aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
6740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Security permissions section
675f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        LinearLayout permsView = (LinearLayout) mRootView.findViewById(R.id.permissions_section);
676f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        AppSecurityPermissions asp = new AppSecurityPermissions(getActivity(), packageName);
6773465b67740e17711af2b36b09e2250a02275d860Jake Hamby        int premiumSmsPermission = getPremiumSmsPermission(packageName);
6783465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // Premium SMS permission implies the app also has SEND_SMS permission, so the original
6793465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // application permissions list doesn't have to be shown/hidden separately. The premium
6803465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // SMS subsection should only be visible if the app has tried to send to a premium SMS.
6813465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (asp.getPermissionCount() > 0
6823465b67740e17711af2b36b09e2250a02275d860Jake Hamby                || premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) {
6830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            permsView.setVisibility(View.VISIBLE);
6843465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } else {
6853465b67740e17711af2b36b09e2250a02275d860Jake Hamby            permsView.setVisibility(View.GONE);
6863465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
6873465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // Premium SMS permission subsection
6883465b67740e17711af2b36b09e2250a02275d860Jake Hamby        TextView securityBillingDesc = (TextView) permsView.findViewById(
6893465b67740e17711af2b36b09e2250a02275d860Jake Hamby                R.id.security_settings_billing_desc);
6903465b67740e17711af2b36b09e2250a02275d860Jake Hamby        LinearLayout securityBillingList = (LinearLayout) permsView.findViewById(
6913465b67740e17711af2b36b09e2250a02275d860Jake Hamby                R.id.security_settings_billing_list);
6923465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) {
6933465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Show the premium SMS permission selector
6943465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingDesc.setVisibility(View.VISIBLE);
6953465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingList.setVisibility(View.VISIBLE);
6963465b67740e17711af2b36b09e2250a02275d860Jake Hamby            Spinner spinner = (Spinner) permsView.findViewById(
6973465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    R.id.security_settings_premium_sms_list);
6983465b67740e17711af2b36b09e2250a02275d860Jake Hamby            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
6993465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    R.array.security_settings_premium_sms_values,
7003465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    android.R.layout.simple_spinner_item);
7013465b67740e17711af2b36b09e2250a02275d860Jake Hamby            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
7023465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setAdapter(adapter);
7033465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // List items are in the same order as SmsUsageMonitor constants, offset by 1.
7043465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setSelection(premiumSmsPermission - 1);
7053465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setOnItemSelectedListener(new PremiumSmsSelectionListener(
7063465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    packageName, mSmsManager));
7073465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } else {
7083465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Hide the premium SMS permission selector
7093465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingDesc.setVisibility(View.GONE);
7103465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingList.setVisibility(View.GONE);
7113465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7123465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // App permissions subsection
7133465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (asp.getPermissionCount() > 0) {
7140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            // Make the security sections header visible
7150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            LinearLayout securityList = (LinearLayout) permsView.findViewById(
7160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    R.id.security_settings_list);
7170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.removeAllViews();
7180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.addView(asp.getPermissionsView());
719e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            // If this app is running under a shared user ID with other apps,
720e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            // update the description to explain this.
721e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            String[] packages = mPm.getPackagesForUid(mPackageInfo.applicationInfo.uid);
722e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            if (packages != null && packages.length > 1) {
723e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                ArrayList<CharSequence> pnames = new ArrayList<CharSequence>();
724e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                for (int i=0; i<packages.length; i++) {
725e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    String pkg = packages[i];
726e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    if (mPackageInfo.packageName.equals(pkg)) {
727e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        continue;
728e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
729e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    try {
730e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        ApplicationInfo ainfo = mPm.getApplicationInfo(pkg, 0);
731e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        pnames.add(ainfo.loadLabel(mPm));
732e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
733e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
734e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                }
735e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                final int N = pnames.size();
736e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                if (N > 0) {
737e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    final Resources res = getActivity().getResources();
738e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    String appListStr;
739e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    if (N == 1) {
740e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = pnames.get(0).toString();
741e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } else if (N == 2) {
742e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = res.getString(R.string.join_two_items, pnames.get(0),
743e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                pnames.get(1));
744e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } else {
745e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = pnames.get(N-2).toString();
746e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        for (int i=N-3; i>=0; i--) {
747e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            appListStr = res.getString(i == 0 ? R.string.join_many_items_first
748e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                    : R.string.join_many_items_middle, pnames.get(i), appListStr);
749e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        }
750e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = res.getString(R.string.join_many_items_last,
751e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                appListStr, pnames.get(N-1));
752e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
753e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    TextView descr = (TextView) mRootView.findViewById(
754e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            R.id.security_settings_desc);
755e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    descr.setText(res.getString(R.string.security_settings_desc_multi,
756e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            mPackageInfo.applicationInfo.loadLabel(mPm), appListStr));
757e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                }
758e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            }
759de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
7600f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
7610f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        checkForceStop();
7620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        setAppLabelAndIcon(mPackageInfo);
7630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshButtons();
7640f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshSizeInfo();
7650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        return true;
766afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
7673465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7683465b67740e17711af2b36b09e2250a02275d860Jake Hamby    private static class PremiumSmsSelectionListener implements AdapterView.OnItemSelectedListener {
7693465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private final String mPackageName;
7703465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private final ISms mSmsManager;
7713465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7723465b67740e17711af2b36b09e2250a02275d860Jake Hamby        PremiumSmsSelectionListener(String packageName, ISms smsManager) {
7733465b67740e17711af2b36b09e2250a02275d860Jake Hamby            mPackageName = packageName;
7743465b67740e17711af2b36b09e2250a02275d860Jake Hamby            mSmsManager = smsManager;
7753465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7763465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7773465b67740e17711af2b36b09e2250a02275d860Jake Hamby        @Override
7783465b67740e17711af2b36b09e2250a02275d860Jake Hamby        public void onItemSelected(AdapterView<?> parent, View view, int position,
7793465b67740e17711af2b36b09e2250a02275d860Jake Hamby                long id) {
7803465b67740e17711af2b36b09e2250a02275d860Jake Hamby            if (position >= 0 && position < 3) {
7813465b67740e17711af2b36b09e2250a02275d860Jake Hamby                Log.d(TAG, "Selected premium SMS policy " + position);
7823465b67740e17711af2b36b09e2250a02275d860Jake Hamby                setPremiumSmsPermission(mPackageName, (position + 1));
7833465b67740e17711af2b36b09e2250a02275d860Jake Hamby            } else {
7843465b67740e17711af2b36b09e2250a02275d860Jake Hamby                Log.e(TAG, "Error: unknown premium SMS policy " + position);
7853465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
7863465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7873465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7883465b67740e17711af2b36b09e2250a02275d860Jake Hamby        @Override
7893465b67740e17711af2b36b09e2250a02275d860Jake Hamby        public void onNothingSelected(AdapterView<?> parent) {
7903465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Ignored
7913465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7923465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7933465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private void setPremiumSmsPermission(String packageName, int permission) {
7943465b67740e17711af2b36b09e2250a02275d860Jake Hamby            try {
7953465b67740e17711af2b36b09e2250a02275d860Jake Hamby                if (mSmsManager != null) {
7963465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    mSmsManager.setPremiumSmsPermission(packageName, permission);
7973465b67740e17711af2b36b09e2250a02275d860Jake Hamby                }
7983465b67740e17711af2b36b09e2250a02275d860Jake Hamby            } catch (RemoteException ex) {
7993465b67740e17711af2b36b09e2250a02275d860Jake Hamby                // ignored
8003465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
8013465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
8023465b67740e17711af2b36b09e2250a02275d860Jake Hamby    }
8030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
804c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    private void resetLaunchDefaultsUi(TextView title, TextView autoLaunchView) {
805c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        title.setText(R.string.auto_launch_label);
806c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        autoLaunchView.setText(R.string.auto_launch_disable_text);
807c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        // Disable clear activities button
808c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        mActivitiesButton.setEnabled(false);
809c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    }
810c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
811afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
812afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
813afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
814afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
815ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        PreferenceActivity pa = (PreferenceActivity)getActivity();
816ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        pa.finishPreferencePanel(this, Activity.RESULT_OK, intent);
817afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
818afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
8190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private void refreshSizeInfo() {
8200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry.size == ApplicationsState.SIZE_INVALID
8210f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) {
8220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1;
8230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (!mHaveSizes) {
8240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mAppSize.setText(mComputingStr);
8250f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mDataSize.setText(mComputingStr);
8260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mCacheSize.setText(mComputingStr);
8270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(mComputingStr);
8280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
8290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearDataButton.setEnabled(false);
8300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearCacheButton.setEnabled(false);
8310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
832afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
8330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mHaveSizes = true;
8341f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            long codeSize = mAppEntry.codeSize;
8351f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            long dataSize = mAppEntry.dataSize;
8361f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (Environment.isExternalStorageEmulated()) {
8371f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                codeSize += mAppEntry.externalCodeSize;
8381f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                dataSize +=  mAppEntry.externalDataSize;
8391f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            } else {
8401f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                if (mLastExternalCodeSize != mAppEntry.externalCodeSize) {
8411f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mLastExternalCodeSize = mAppEntry.externalCodeSize;
8421f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mExternalCodeSize.setText(getSizeStr(mAppEntry.externalCodeSize));
8431f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                }
8441f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                if (mLastExternalDataSize !=  mAppEntry.externalDataSize) {
8451f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mLastExternalDataSize =  mAppEntry.externalDataSize;
8461f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mExternalDataSize.setText(getSizeStr( mAppEntry.externalDataSize));
8471f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                }
848afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
8491f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (mLastCodeSize != codeSize) {
8501f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mLastCodeSize = codeSize;
8511f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mAppSize.setText(getSizeStr(codeSize));
852bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            }
8531f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (mLastDataSize != dataSize) {
8541f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mLastDataSize = dataSize;
8551f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mDataSize.setText(getSizeStr(dataSize));
856424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root            }
857313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            long cacheSize = mAppEntry.cacheSize + mAppEntry.externalCacheSize;
858313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            if (mLastCacheSize != cacheSize) {
859313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn                mLastCacheSize = cacheSize;
860313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn                mCacheSize.setText(getSizeStr(cacheSize));
861afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
8620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastTotalSize != mAppEntry.size) {
8630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastTotalSize = mAppEntry.size;
8640f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(getSizeStr(mAppEntry.size));
865afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
8660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
8671f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if ((mAppEntry.dataSize+ mAppEntry.externalDataSize) <= 0 || !mCanClearData) {
8680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(false);
8690f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
8700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(true);
8710f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setOnClickListener(this);
8720f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
873313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            if (cacheSize <= 0) {
8740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(false);
8750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
8760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(true);
8770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setOnClickListener(this);
878afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
879afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
880afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
881afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
882afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
883afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
884afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
885afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
886afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
887afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
8880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
88942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
890afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
89142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
8920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
893afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
89442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
895afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
8969db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        checkForceStop();
897afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
898ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
899de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void refreshButtons() {
900de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        if (!mMoveInProgress) {
901de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initUninstallButtons();
902de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initDataButtons();
903de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initMoveButton();
9044a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            initNotificationButton();
905de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        } else {
906de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
907de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setEnabled(false);
908de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mUninstallButton.setEnabled(false);
909de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
910de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    }
911de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu
912ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
913ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
9140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
915de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        // Refresh the button attributes.
916de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        mMoveInProgress = false;
9170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (result == PackageManager.MOVE_SUCCEEDED) {
918ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
919de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            // Refresh size information again.
9200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
921ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
922f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_MOVE_FAILED, result);
923ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
9240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
925ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
9265cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
927afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
928afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
929afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
930afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
93142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
93242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
93342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
9340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
93542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
9360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mClearDataObserver == null) {
937afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
938afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
939f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)
940f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
941afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
9420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!res) {
94350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
944afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
945f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_CANNOT_CLEAR_DATA, 0);
946afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
94742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
948afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
949afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
950afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
951f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private void showDialogInner(int id, int moveErrorCode) {
952f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        DialogFragment newFragment = MyAlertDialogFragment.newInstance(id, moveErrorCode);
953f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.setTargetFragment(this, 0);
954f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.show(getFragmentManager(), "dialog " + id);
95550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
95650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
957f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static class MyAlertDialogFragment extends DialogFragment {
958f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
959f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public static MyAlertDialogFragment newInstance(int id, int moveErrorCode) {
960f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            MyAlertDialogFragment frag = new MyAlertDialogFragment();
961f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            Bundle args = new Bundle();
962f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("id", id);
963f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("moveError", moveErrorCode);
964f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            frag.setArguments(args);
965f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return frag;
966f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
967f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
968f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        InstalledAppDetails getOwner() {
969f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return (InstalledAppDetails)getTargetFragment();
970f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
971f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
972f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        @Override
973f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public Dialog onCreateDialog(Bundle savedInstanceState) {
974f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int id = getArguments().getInt("id");
975f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int moveErrorCode = getArguments().getInt("moveError");
976f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            switch (id) {
977f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CLEAR_DATA:
978f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
979f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_data_dlg_title))
980e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
981f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_data_dlg_text))
982f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
983f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
984f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
985f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
986f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().initiateClearUserData();
987f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
988f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
989f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
990f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
991f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FACTORY_RESET:
992f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
993f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title))
994e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
995f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text))
996f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
997f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
998f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
999f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
10003db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                            getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName, false);
1001f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1002f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1003f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1004f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1005f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_APP_NOT_FOUND:
1006f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1007f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_not_found_dlg_title))
1008e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1009f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_not_found_dlg_title))
1010f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(getActivity().getText(R.string.dlg_ok),
1011f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
1012f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1013f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
1014f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(true, true);
1015f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1016f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1017f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1018f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CANNOT_CLEAR_DATA:
1019f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1020f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_failed_dlg_title))
1021e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1022f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_failed_dlg_text))
1023f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok,
1024f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
1025f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1026f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().mClearDataButton.setEnabled(false);
1027f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
1028f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(false, false);
1029f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1030f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1031f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1032f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FORCE_STOP:
1033f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1034f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.force_stop_dlg_title))
1035e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1036f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.force_stop_dlg_text))
1037f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1038f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        new DialogInterface.OnClickListener() {
1039f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1040f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Force stop
1041f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().forceStopPackage(getOwner().mAppEntry.info.packageName);
1042f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1043f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1044f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1045f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1046f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_MOVE_FAILED:
1047f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    CharSequence msg = getActivity().getString(R.string.move_app_failed_dlg_text,
1048f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().getMoveErrMsg(moveErrorCode));
1049f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1050f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title))
1051e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1052f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(msg)
1053f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok, null)
1054f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1055f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                case DLG_DISABLE:
1056f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1057f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_disable_dlg_title))
1058e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1059f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_disable_dlg_text))
1060f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1061f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DialogInterface.OnClickListener() {
1062f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1063f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            // Disable the app
1064f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            new DisableChanger(getOwner(), getOwner().mAppEntry.info,
1065f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER)
1066f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            .execute((Object)null);
1067f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        }
1068f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    })
1069f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1070f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .create();
107170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                case DLG_DISABLE_NOTIFICATIONS:
107270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    return new AlertDialog.Builder(getActivity())
107370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setTitle(getActivity().getText(R.string.app_disable_notifications_dlg_title))
1074c8272b075275f81ddfb9cef2f92514b7ce3365deBjörn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
107570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setMessage(getActivity().getText(R.string.app_disable_notifications_dlg_text))
107670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setPositiveButton(R.string.dlg_ok,
107770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        new DialogInterface.OnClickListener() {
107870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        public void onClick(DialogInterface dialog, int which) {
107970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            // Disable the package's notifications
108070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            getOwner().setNotificationsEnabled(false);
108170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        }
108270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    })
108370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setNegativeButton(R.string.dlg_cancel,
108470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        new DialogInterface.OnClickListener() {
108570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        public void onClick(DialogInterface dialog, int which) {
108670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            // Re-enable the checkbox
108770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            getOwner().mNotificationSwitch.setChecked(true);
108870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        }
108970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    })
109070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .create();
1091f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
1092f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            throw new IllegalArgumentException("unknown id " + id);
1093f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
109450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
109550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
10963db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    private void uninstallPkg(String packageName, boolean allUsers) {
109750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
109850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
10993db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI);
11003db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers);
11013db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        startActivityForResult(uninstallIntent, REQUEST_UNINSTALL);
110250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
110350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
110442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
1105f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)getActivity().getSystemService(
110642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
110742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
1108c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        mState.invalidatePackage(pkgName);
1109c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName);
1110c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        if (newEnt != null) {
1111c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn            mAppEntry = newEnt;
1112c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        }
1113cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
111442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
111542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
1116cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
1117cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
1118cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
1119861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED);
1120cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
1121cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
1122861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn
1123861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    private void updateForceStopButton(boolean enabled) {
1124861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setEnabled(enabled);
1125861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setOnClickListener(InstalledAppDetails.this);
1126861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    }
1127cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
1128cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
11295c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
11305c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            // User can't force stop device admin.
11315c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            updateForceStopButton(false);
11325c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
1133861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // If the app isn't explicitly stopped, then always show the
1134861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // force stop button.
1135861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(true);
1136861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        } else {
11375c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
11385c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                    Uri.fromParts("package", mAppEntry.info.packageName, null));
11395c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
11405c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
1141c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn            intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid));
1142861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
1143861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn                    Activity.RESULT_CANCELED, null, null);
1144861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        }
1145cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
114670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
11479db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    static class DisableChanger extends AsyncTask<Object, Object, Object> {
11489db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final PackageManager mPm;
11499db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final WeakReference<InstalledAppDetails> mActivity;
11509db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final ApplicationInfo mInfo;
11519db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final int mState;
11529db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
11539db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) {
11549db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm = activity.mPm;
11559db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mActivity = new WeakReference<InstalledAppDetails>(activity);
11569db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mInfo = info;
11579db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mState = state;
11589db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
11599db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
11609db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        @Override
11619db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        protected Object doInBackground(Object... params) {
11629db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0);
11639db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            return null;
11649db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
11659db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    }
11669db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
116770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private void setNotificationsEnabled(boolean enabled) {
116870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        String packageName = mAppEntry.info.packageName;
116970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        INotificationManager nm = INotificationManager.Stub.asInterface(
117070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
117170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        try {
117270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            final boolean enable = mNotificationSwitch.isChecked();
117370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            nm.setNotificationsEnabledForPackage(packageName, enabled);
117470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } catch (android.os.RemoteException ex) {
117570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setChecked(!enabled); // revert
117670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
117770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    }
117870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
11793465b67740e17711af2b36b09e2250a02275d860Jake Hamby    private int getPremiumSmsPermission(String packageName) {
11803465b67740e17711af2b36b09e2250a02275d860Jake Hamby        try {
11813465b67740e17711af2b36b09e2250a02275d860Jake Hamby            if (mSmsManager != null) {
11823465b67740e17711af2b36b09e2250a02275d860Jake Hamby                return mSmsManager.getPremiumSmsPermission(packageName);
11833465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
11843465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } catch (RemoteException ex) {
11853465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // ignored
11863465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
11873465b67740e17711af2b36b09e2250a02275d860Jake Hamby        return SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN;
11883465b67740e17711af2b36b09e2250a02275d860Jake Hamby    }
11893465b67740e17711af2b36b09e2250a02275d860Jake Hamby
1190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
1191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
1192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
1193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
1194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
11950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
119642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
119742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
1198f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_FACTORY_RESET, 0);
119942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
12000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
1201f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    if (mAppEntry.info.enabled) {
1202f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        showDialogInner(DLG_DISABLE, 0);
1203f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    } else {
1204f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DisableChanger(this, mAppEntry.info,
1205f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT)
1206f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        .execute((Object)null);
1207f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    }
12082e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) {
12092e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    try {
12102e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                        mPm.installExistingPackage(packageName);
12112e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                        refreshUi();
12122e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    } catch (NameNotFoundException e) {
12132e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    }
12149db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                } else {
12153db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    uninstallPkg(packageName, false);
12169db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
1217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
1219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
12209d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            try {
12212715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood                mUsbManager.clearDefaults(packageName);
12229d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            } catch (RemoteException e) {
12239d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood                Log.e(TAG, "mUsbManager.clearDefaults", e);
12249d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            }
1225c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            mAppWidgetManager.setBindAppWidgetPermission(packageName, false);
1226c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            TextView autoLaunchTitleView =
1227c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    (TextView) mRootView.findViewById(R.id.auto_launch_title);
1228c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
1229c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView);
123042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
12310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
12323fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                if (!Utils.isMonkeyRunning()) {
12333fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                    Intent intent = new Intent(Intent.ACTION_DEFAULT);
12343fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                    intent.setClassName(mAppEntry.info.packageName,
12353fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                            mAppEntry.info.manageSpaceActivityName);
12363db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    startActivityForResult(intent, REQUEST_MANAGE_SPACE);
12373fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                }
123842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
1239f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_CLEAR_DATA, 0);
124042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
1241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
1242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
1243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
1244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
1245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
1247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
1248f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_FORCE_STOP, 0);
12499db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            //forceStopPackage(mAppInfo.packageName);
1250ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
1251ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
1252ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
1253ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
12540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ?
1255ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
1256de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveInProgress = true;
1257de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            refreshButtons();
12580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags);
1259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1261aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
1262aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    @Override
1263aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1264aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        String packageName = mAppEntry.info.packageName;
1265aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
1266aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
1267aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        if (buttonView == mAskCompatibilityCB) {
1268aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageAskScreenCompat(packageName, isChecked);
1269aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else if (buttonView == mEnableCompatibilityCB) {
1270aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageScreenCompatMode(packageName, isChecked ?
1271aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                    ActivityManager.COMPAT_MODE_ENABLED : ActivityManager.COMPAT_MODE_DISABLED);
12724a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } else if (buttonView == mNotificationSwitch) {
127370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            if (!isChecked) {
127470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                showDialogInner(DLG_DISABLE_NOTIFICATIONS, 0);
127570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            } else {
127670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                setNotificationsEnabled(true);
12774a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            }
1278aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
1279aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    }
1280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1282