InstalledAppDetails.java revision 0fca4296ac08fcf42b58fac3a016ea068fcf6257
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) {
3432e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                mUninstallButton.setText(R.string.install_text);
3449db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            } else {
3459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                mUninstallButton.setText(R.string.uninstall_text);
346b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu            }
34742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
3485c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        // If this is a device admin, it can't be uninstall or disabled.
3495c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        // We do this here so the text of the button is still set correctly.
3505c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
3515c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            enabled = false;
3525c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        }
35342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
35442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
35542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
35642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
35742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
35842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
35942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
3604a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    private void initNotificationButton() {
3614a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        INotificationManager nm = INotificationManager.Stub.asInterface(
3624a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
3634a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        boolean enabled = true; // default on
3644a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        try {
3654a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            enabled = nm.areNotificationsEnabledForPackage(mAppEntry.info.packageName);
3664a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } catch (android.os.RemoteException ex) {
3674a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            // this does not bode well
3684a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        }
3694a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        mNotificationSwitch.setChecked(enabled);
37070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        if (isThisASystemPackage()) {
37170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setEnabled(false);
37270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } else {
37370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setEnabled(true);
37470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setOnCheckedChangeListener(this);
37570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
3764a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    }
3774a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
380f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle icicle) {
381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
3823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
383f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mState = ApplicationsState.getInstance(getActivity().getApplication());
384309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession = mState.newSession(this);
385f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mPm = getActivity().getPackageManager();
3863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        mUserManager = (UserManager)getActivity().getSystemService(Context.USER_SERVICE);
3879d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        IBinder b = ServiceManager.getService(Context.USB_SERVICE);
3889d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        mUsbManager = IUsbManager.Stub.asInterface(b);
389c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        mAppWidgetManager = AppWidgetManager.getInstance(getActivity());
3905c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
3913465b67740e17711af2b36b09e2250a02275d860Jake Hamby        mSmsManager = ISms.Stub.asInterface(ServiceManager.getService("isms"));
3929d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood
3936dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mCanBeOnSdCardChecker = new CanBeOnSdCardChecker();
3940fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
3950fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        retrieveAppEntry();
3960fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
3970fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        setHasOptionsMenu(true);
398f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    }
399f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
400f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    @Override
401f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
402f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View view = mRootView = inflater.inflate(R.layout.installed_app_details, null);
4036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
404f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingStr = getActivity().getText(R.string.computing_size);
405b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
40650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
407f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mTotalSize = (TextView)view.findViewById(R.id.total_size_text);
408f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mAppSize = (TextView)view.findViewById(R.id.application_size_text);
409f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mDataSize = (TextView)view.findViewById(R.id.data_size_text);
410bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalCodeSize = (TextView)view.findViewById(R.id.external_code_size_text);
411bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalDataSize = (TextView)view.findViewById(R.id.external_data_size_text);
4121f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn
4131f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn        if (Environment.isExternalStorageEmulated()) {
4141f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            ((View)mExternalCodeSize.getParent()).setVisibility(View.GONE);
4151f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            ((View)mExternalDataSize.getParent()).setVisibility(View.GONE);
4161f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn        }
4171f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn
41842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
419f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View btnPanel = view.findViewById(R.id.control_buttons_panel);
42042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
42142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
42242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
423cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
424b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
42542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
426f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View data_buttons_panel = view.findViewById(R.id.data_buttons_panel);
427313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
428313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
429b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Cache section
431f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mCacheSize = (TextView) view.findViewById(R.id.cache_size_text);
432f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mClearCacheButton = (Button) view.findViewById(R.id.clear_cache_button);
433f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
434f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mActivitiesButton = (Button)view.findViewById(R.id.clear_activities_button);
4350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
436aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility control
437aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mScreenCompatSection = view.findViewById(R.id.screen_compatibility_section);
438aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mAskCompatibilityCB = (CheckBox)view.findViewById(R.id.ask_compatibility_cb);
439aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mEnableCompatibilityCB = (CheckBox)view.findViewById(R.id.enable_compatibility_cb);
4404a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
44170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        mNotificationSwitch = (CompoundButton) view.findViewById(R.id.notification_switch);
442aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
443f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return view;
444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
445f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
4463db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4473db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
4483db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text)
4493db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4503db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
4513db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
4523db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4533db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onPrepareOptionsMenu(Menu menu) {
4543db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        boolean showIt = true;
4553db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (mUpdatedSysApp) {
4563db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4570fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        } else if (mAppEntry == null) {
4580fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn            showIt = false;
4593db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
4603db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4613db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
4623db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4633db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if (UserHandle.myUserId() != 0) {
4643db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4653db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if (mUserManager.getUsers().size() < 1) {
4663db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4673db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
4683db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt);
4693db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
4703db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
4713db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4723db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public boolean onOptionsItemSelected(MenuItem item) {
4733db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        int menuId = item.getItemId();
4743db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (menuId == UNINSTALL_ALL_USERS_MENU) {
4753db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            uninstallPkg(mAppEntry.info.packageName, true);
4763db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            return true;
4773db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
4783db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        return false;
4793db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
4803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
4813db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onActivityResult(int requestCode, int resultCode, Intent data) {
4833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        super.onActivityResult(requestCode, resultCode, data);
4843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (requestCode == REQUEST_UNINSTALL) {
4853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            if (!refreshUi()) {
4863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                setIntentAndFinish(true, true);
4873db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            }
4883db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
4893db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
4903db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
49150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set applicaiton label and icon.
492f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    private void setAppLabelAndIcon(PackageInfo pkgInfo) {
493f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View appSnippet = mRootView.findViewById(R.id.app_snippet);
494f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
4950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.ensureIcon(mAppEntry);
4960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        icon.setImageDrawable(mAppEntry.icon);
497f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        // Set application name.
498f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
4990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        label.setText(mAppEntry.label);
50050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
501f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size);
502f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
503f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        if (pkgInfo != null && pkgInfo.versionName != null) {
50450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
505f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            mAppVersion.setText(getActivity().getString(R.string.version_text,
5068e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
50750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
508f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu            mAppVersion.setVisibility(View.INVISIBLE);
50950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
51050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
51150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
51250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
51342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
51442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
515b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
516309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession.resume();
5170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!refreshUi()) {
518b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            setIntentAndFinish(true, true);
519b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
5200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5210f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPause() {
5240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        super.onPause();
525309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession.pause();
5260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onAllSizesComputed() {
5300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageIconChanged() {
5340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageListChanged() {
5380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
5390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
54219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    public void onRebuildComplete(ArrayList<AppEntry> apps) {
54319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    }
54419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
54519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    @Override
5460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageSizeChanged(String packageName) {
5470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (packageName.equals(mAppEntry.info.packageName)) {
5480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            refreshSizeInfo();
5490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
5500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onRunningStateChanged(boolean running) {
5540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5560fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn    private String retrieveAppEntry() {
5570c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        final Bundle args = getArguments();
5580c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        String packageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null;
559f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        if (packageName == null) {
5600c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy            Intent intent = (args == null) ?
5610c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy                    getActivity().getIntent() : (Intent) args.getParcelable("intent");
562f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (intent != null) {
563f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                packageName = intent.getData().getSchemeSpecificPart();
564f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
565f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
5660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mAppEntry = mState.getEntry(packageName);
5670fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        return packageName;
5680fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn    }
5690fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
5700fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn    private boolean refreshUi() {
5710fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        if (mMoveInProgress) {
5720fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn            return true;
5730fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        }
5740fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        final String packageName = retrieveAppEntry();
5750fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
5760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry == null) {
5770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
578b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
579b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
58050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application info again to refresh changed properties of application
58150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        try {
5820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
5830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_DISABLED_COMPONENTS |
5840f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_UNINSTALLED_PACKAGES |
5850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_SIGNATURES);
58650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } catch (NameNotFoundException e) {
5870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
5880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
58950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
590b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
5910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Get list of preferred activities
5920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<ComponentName> prefActList = new ArrayList<ComponentName>();
593b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
5940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Intent list cannot be null. so pass empty list
5950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<IntentFilter> intentList = new ArrayList<IntentFilter>();
5960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mPm.getPreferredActivities(intentList, prefActList, packageName);
597c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        if (localLOGV)
598c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            Log.i(TAG, "Have " + prefActList.size() + " number of activities in preferred list");
5999d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        boolean hasUsbDefaults = false;
6009d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        try {
6012715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood            hasUsbDefaults = mUsbManager.hasDefaults(packageName);
6029d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        } catch (RemoteException e) {
6039d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            Log.e(TAG, "mUsbManager.hasDefaults", e);
6049d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        }
605c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        boolean hasBindAppWidgetPermission =
606c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                mAppWidgetManager.hasBindAppWidgetPermission(mAppEntry.info.packageName);
607c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
608c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        TextView autoLaunchTitleView = (TextView) mRootView.findViewById(R.id.auto_launch_title);
609c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
610c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        boolean autoLaunchEnabled = prefActList.size() > 0 || hasUsbDefaults;
611c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        if (!autoLaunchEnabled && !hasBindAppWidgetPermission) {
612c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView);
6130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else {
614c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            boolean useBullets = hasBindAppWidgetPermission && autoLaunchEnabled;
615c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
616c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (hasBindAppWidgetPermission) {
617c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                autoLaunchTitleView.setText(R.string.auto_launch_label_generic);
618c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            } else {
619c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                autoLaunchTitleView.setText(R.string.auto_launch_label);
620c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
621c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
622c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            CharSequence text = null;
623c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            int bulletIndent = getResources()
624c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    .getDimensionPixelSize(R.dimen.installed_app_details_bullet_offset);
625c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (autoLaunchEnabled) {
626c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                CharSequence autoLaunchEnableText = getText(R.string.auto_launch_enable_text);
627c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                SpannableString s = new SpannableString(autoLaunchEnableText);
628c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                if (useBullets) {
629c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    s.setSpan(new BulletSpan(bulletIndent), 0, autoLaunchEnableText.length(), 0);
630c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                }
631c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                text = (text == null) ?
632c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n");
633c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
634c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (hasBindAppWidgetPermission) {
635c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                CharSequence alwaysAllowBindAppWidgetsText =
636c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        getText(R.string.always_allow_bind_appwidgets_text);
637c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                SpannableString s = new SpannableString(alwaysAllowBindAppWidgetsText);
638c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                if (useBullets) {
639c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    s.setSpan(new BulletSpan(bulletIndent),
640c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                            0, alwaysAllowBindAppWidgetsText.length(), 0);
641c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                }
642c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                text = (text == null) ?
643c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n");
644c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
645c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            autoLaunchView.setText(text);
6460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setEnabled(true);
6470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setOnClickListener(this);
6480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
649aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
650aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility section.
651aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
652aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
653aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        int compatMode = am.getPackageScreenCompatMode(packageName);
65413bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // For now these are always off; this is the old UI model which we
65513bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // are no longer using.
65613bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        if (false && (compatMode == ActivityManager.COMPAT_MODE_DISABLED
65713bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn                || compatMode == ActivityManager.COMPAT_MODE_ENABLED)) {
658aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.VISIBLE);
659aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setChecked(am.getPackageAskScreenCompat(packageName));
660aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setOnCheckedChangeListener(this);
661aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setChecked(compatMode == ActivityManager.COMPAT_MODE_ENABLED);
662aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setOnCheckedChangeListener(this);
663aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else {
664aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.GONE);
665aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
666aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
6670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Security permissions section
668f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        LinearLayout permsView = (LinearLayout) mRootView.findViewById(R.id.permissions_section);
669f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        AppSecurityPermissions asp = new AppSecurityPermissions(getActivity(), packageName);
6703465b67740e17711af2b36b09e2250a02275d860Jake Hamby        int premiumSmsPermission = getPremiumSmsPermission(packageName);
6713465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // Premium SMS permission implies the app also has SEND_SMS permission, so the original
6723465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // application permissions list doesn't have to be shown/hidden separately. The premium
6733465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // SMS subsection should only be visible if the app has tried to send to a premium SMS.
6743465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (asp.getPermissionCount() > 0
6753465b67740e17711af2b36b09e2250a02275d860Jake Hamby                || premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) {
6760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            permsView.setVisibility(View.VISIBLE);
6773465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } else {
6783465b67740e17711af2b36b09e2250a02275d860Jake Hamby            permsView.setVisibility(View.GONE);
6793465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
6803465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // Premium SMS permission subsection
6813465b67740e17711af2b36b09e2250a02275d860Jake Hamby        TextView securityBillingDesc = (TextView) permsView.findViewById(
6823465b67740e17711af2b36b09e2250a02275d860Jake Hamby                R.id.security_settings_billing_desc);
6833465b67740e17711af2b36b09e2250a02275d860Jake Hamby        LinearLayout securityBillingList = (LinearLayout) permsView.findViewById(
6843465b67740e17711af2b36b09e2250a02275d860Jake Hamby                R.id.security_settings_billing_list);
6853465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) {
6863465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Show the premium SMS permission selector
6873465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingDesc.setVisibility(View.VISIBLE);
6883465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingList.setVisibility(View.VISIBLE);
6893465b67740e17711af2b36b09e2250a02275d860Jake Hamby            Spinner spinner = (Spinner) permsView.findViewById(
6903465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    R.id.security_settings_premium_sms_list);
6913465b67740e17711af2b36b09e2250a02275d860Jake Hamby            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
6923465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    R.array.security_settings_premium_sms_values,
6933465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    android.R.layout.simple_spinner_item);
6943465b67740e17711af2b36b09e2250a02275d860Jake Hamby            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
6953465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setAdapter(adapter);
6963465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // List items are in the same order as SmsUsageMonitor constants, offset by 1.
6973465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setSelection(premiumSmsPermission - 1);
6983465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setOnItemSelectedListener(new PremiumSmsSelectionListener(
6993465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    packageName, mSmsManager));
7003465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } else {
7013465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Hide the premium SMS permission selector
7023465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingDesc.setVisibility(View.GONE);
7033465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingList.setVisibility(View.GONE);
7043465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7053465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // App permissions subsection
7063465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (asp.getPermissionCount() > 0) {
7070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            // Make the security sections header visible
7080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            LinearLayout securityList = (LinearLayout) permsView.findViewById(
7090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    R.id.security_settings_list);
7100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.removeAllViews();
7110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.addView(asp.getPermissionsView());
712e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            // If this app is running under a shared user ID with other apps,
713e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            // update the description to explain this.
714e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            String[] packages = mPm.getPackagesForUid(mPackageInfo.applicationInfo.uid);
715e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            if (packages != null && packages.length > 1) {
716e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                ArrayList<CharSequence> pnames = new ArrayList<CharSequence>();
717e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                for (int i=0; i<packages.length; i++) {
718e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    String pkg = packages[i];
719e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    if (mPackageInfo.packageName.equals(pkg)) {
720e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        continue;
721e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
722e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    try {
723e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        ApplicationInfo ainfo = mPm.getApplicationInfo(pkg, 0);
724e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        pnames.add(ainfo.loadLabel(mPm));
725e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
726e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
727e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                }
728e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                final int N = pnames.size();
729e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                if (N > 0) {
730e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    final Resources res = getActivity().getResources();
731e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    String appListStr;
732e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    if (N == 1) {
733e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = pnames.get(0).toString();
734e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } else if (N == 2) {
735e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = res.getString(R.string.join_two_items, pnames.get(0),
736e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                pnames.get(1));
737e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } else {
738e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = pnames.get(N-2).toString();
739e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        for (int i=N-3; i>=0; i--) {
740e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            appListStr = res.getString(i == 0 ? R.string.join_many_items_first
741e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                    : R.string.join_many_items_middle, pnames.get(i), appListStr);
742e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        }
743e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = res.getString(R.string.join_many_items_last,
744e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                appListStr, pnames.get(N-1));
745e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
746e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    TextView descr = (TextView) mRootView.findViewById(
747e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            R.id.security_settings_desc);
748e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    descr.setText(res.getString(R.string.security_settings_desc_multi,
749e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            mPackageInfo.applicationInfo.loadLabel(mPm), appListStr));
750e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                }
751e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            }
752de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
7530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
7540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        checkForceStop();
7550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        setAppLabelAndIcon(mPackageInfo);
7560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshButtons();
7570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshSizeInfo();
7580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        return true;
759afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
7603465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7613465b67740e17711af2b36b09e2250a02275d860Jake Hamby    private static class PremiumSmsSelectionListener implements AdapterView.OnItemSelectedListener {
7623465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private final String mPackageName;
7633465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private final ISms mSmsManager;
7643465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7653465b67740e17711af2b36b09e2250a02275d860Jake Hamby        PremiumSmsSelectionListener(String packageName, ISms smsManager) {
7663465b67740e17711af2b36b09e2250a02275d860Jake Hamby            mPackageName = packageName;
7673465b67740e17711af2b36b09e2250a02275d860Jake Hamby            mSmsManager = smsManager;
7683465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7693465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7703465b67740e17711af2b36b09e2250a02275d860Jake Hamby        @Override
7713465b67740e17711af2b36b09e2250a02275d860Jake Hamby        public void onItemSelected(AdapterView<?> parent, View view, int position,
7723465b67740e17711af2b36b09e2250a02275d860Jake Hamby                long id) {
7733465b67740e17711af2b36b09e2250a02275d860Jake Hamby            if (position >= 0 && position < 3) {
7743465b67740e17711af2b36b09e2250a02275d860Jake Hamby                Log.d(TAG, "Selected premium SMS policy " + position);
7753465b67740e17711af2b36b09e2250a02275d860Jake Hamby                setPremiumSmsPermission(mPackageName, (position + 1));
7763465b67740e17711af2b36b09e2250a02275d860Jake Hamby            } else {
7773465b67740e17711af2b36b09e2250a02275d860Jake Hamby                Log.e(TAG, "Error: unknown premium SMS policy " + position);
7783465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
7793465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7803465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7813465b67740e17711af2b36b09e2250a02275d860Jake Hamby        @Override
7823465b67740e17711af2b36b09e2250a02275d860Jake Hamby        public void onNothingSelected(AdapterView<?> parent) {
7833465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Ignored
7843465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7853465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7863465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private void setPremiumSmsPermission(String packageName, int permission) {
7873465b67740e17711af2b36b09e2250a02275d860Jake Hamby            try {
7883465b67740e17711af2b36b09e2250a02275d860Jake Hamby                if (mSmsManager != null) {
7893465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    mSmsManager.setPremiumSmsPermission(packageName, permission);
7903465b67740e17711af2b36b09e2250a02275d860Jake Hamby                }
7913465b67740e17711af2b36b09e2250a02275d860Jake Hamby            } catch (RemoteException ex) {
7923465b67740e17711af2b36b09e2250a02275d860Jake Hamby                // ignored
7933465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
7943465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7953465b67740e17711af2b36b09e2250a02275d860Jake Hamby    }
7960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
797c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    private void resetLaunchDefaultsUi(TextView title, TextView autoLaunchView) {
798c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        title.setText(R.string.auto_launch_label);
799c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        autoLaunchView.setText(R.string.auto_launch_disable_text);
800c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        // Disable clear activities button
801c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        mActivitiesButton.setEnabled(false);
802c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    }
803c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
804afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
805afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
806afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
807afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
808ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        PreferenceActivity pa = (PreferenceActivity)getActivity();
809ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        pa.finishPreferencePanel(this, Activity.RESULT_OK, intent);
810afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
811afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
8120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private void refreshSizeInfo() {
8130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry.size == ApplicationsState.SIZE_INVALID
8140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) {
8150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1;
8160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (!mHaveSizes) {
8170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mAppSize.setText(mComputingStr);
8180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mDataSize.setText(mComputingStr);
8190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mCacheSize.setText(mComputingStr);
8200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(mComputingStr);
8210f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
8220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearDataButton.setEnabled(false);
8230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearCacheButton.setEnabled(false);
8240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
825afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
8260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mHaveSizes = true;
8271f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            long codeSize = mAppEntry.codeSize;
8281f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            long dataSize = mAppEntry.dataSize;
8291f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (Environment.isExternalStorageEmulated()) {
8301f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                codeSize += mAppEntry.externalCodeSize;
8311f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                dataSize +=  mAppEntry.externalDataSize;
8321f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            } else {
8331f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                if (mLastExternalCodeSize != mAppEntry.externalCodeSize) {
8341f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mLastExternalCodeSize = mAppEntry.externalCodeSize;
8351f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mExternalCodeSize.setText(getSizeStr(mAppEntry.externalCodeSize));
8361f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                }
8371f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                if (mLastExternalDataSize !=  mAppEntry.externalDataSize) {
8381f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mLastExternalDataSize =  mAppEntry.externalDataSize;
8391f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mExternalDataSize.setText(getSizeStr( mAppEntry.externalDataSize));
8401f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                }
841afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
8421f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (mLastCodeSize != codeSize) {
8431f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mLastCodeSize = codeSize;
8441f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mAppSize.setText(getSizeStr(codeSize));
845bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            }
8461f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (mLastDataSize != dataSize) {
8471f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mLastDataSize = dataSize;
8481f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mDataSize.setText(getSizeStr(dataSize));
849424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root            }
850313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            long cacheSize = mAppEntry.cacheSize + mAppEntry.externalCacheSize;
851313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            if (mLastCacheSize != cacheSize) {
852313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn                mLastCacheSize = cacheSize;
853313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn                mCacheSize.setText(getSizeStr(cacheSize));
854afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
8550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastTotalSize != mAppEntry.size) {
8560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastTotalSize = mAppEntry.size;
8570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(getSizeStr(mAppEntry.size));
858afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
8590f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
8601f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if ((mAppEntry.dataSize+ mAppEntry.externalDataSize) <= 0 || !mCanClearData) {
8610f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(false);
8620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
8630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(true);
8640f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setOnClickListener(this);
8650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
866313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            if (cacheSize <= 0) {
8670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(false);
8680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
8690f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(true);
8700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setOnClickListener(this);
871afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
872afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
873afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
874afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
875afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
876afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
877afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
878afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
879afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
880afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
8810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
88242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
883afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
88442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
8850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
886afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
88742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
888afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
8899db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        checkForceStop();
890afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
891ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
892de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void refreshButtons() {
893de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        if (!mMoveInProgress) {
894de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initUninstallButtons();
895de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initDataButtons();
896de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initMoveButton();
8974a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            initNotificationButton();
898de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        } else {
899de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
900de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setEnabled(false);
901de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mUninstallButton.setEnabled(false);
902de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
903de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    }
904de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu
905ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
906ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
9070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
908de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        // Refresh the button attributes.
909de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        mMoveInProgress = false;
9100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (result == PackageManager.MOVE_SUCCEEDED) {
911ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
912de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            // Refresh size information again.
9130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
914ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
915f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_MOVE_FAILED, result);
916ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
9170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
918ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
9195cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
920afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
921afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
922afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
923afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
92442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
92542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
92642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
9270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
92842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
9290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mClearDataObserver == null) {
930afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
931afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
932f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)
933f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
934afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
9350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!res) {
93650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
937afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
938f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_CANNOT_CLEAR_DATA, 0);
939afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
94042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
941afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
942afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
943afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
944f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private void showDialogInner(int id, int moveErrorCode) {
945f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        DialogFragment newFragment = MyAlertDialogFragment.newInstance(id, moveErrorCode);
946f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.setTargetFragment(this, 0);
947f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.show(getFragmentManager(), "dialog " + id);
94850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
94950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
950f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static class MyAlertDialogFragment extends DialogFragment {
951f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
952f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public static MyAlertDialogFragment newInstance(int id, int moveErrorCode) {
953f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            MyAlertDialogFragment frag = new MyAlertDialogFragment();
954f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            Bundle args = new Bundle();
955f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("id", id);
956f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("moveError", moveErrorCode);
957f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            frag.setArguments(args);
958f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return frag;
959f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
960f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
961f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        InstalledAppDetails getOwner() {
962f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return (InstalledAppDetails)getTargetFragment();
963f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
964f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
965f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        @Override
966f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public Dialog onCreateDialog(Bundle savedInstanceState) {
967f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int id = getArguments().getInt("id");
968f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int moveErrorCode = getArguments().getInt("moveError");
969f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            switch (id) {
970f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CLEAR_DATA:
971f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
972f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_data_dlg_title))
973e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
974f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_data_dlg_text))
975f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
976f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
977f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
978f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
979f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().initiateClearUserData();
980f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
981f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
982f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
983f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
984f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FACTORY_RESET:
985f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
986f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title))
987e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
988f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text))
989f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
990f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
991f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
992f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
9933db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                            getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName, false);
994f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
995f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
996f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
997f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
998f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_APP_NOT_FOUND:
999f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1000f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_not_found_dlg_title))
1001e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1002f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_not_found_dlg_title))
1003f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(getActivity().getText(R.string.dlg_ok),
1004f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
1005f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1006f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
1007f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(true, true);
1008f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1009f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1010f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1011f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CANNOT_CLEAR_DATA:
1012f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1013f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_failed_dlg_title))
1014e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1015f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_failed_dlg_text))
1016f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok,
1017f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
1018f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1019f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().mClearDataButton.setEnabled(false);
1020f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
1021f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(false, false);
1022f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1023f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1024f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1025f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FORCE_STOP:
1026f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1027f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.force_stop_dlg_title))
1028e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1029f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.force_stop_dlg_text))
1030f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1031f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        new DialogInterface.OnClickListener() {
1032f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1033f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Force stop
1034f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().forceStopPackage(getOwner().mAppEntry.info.packageName);
1035f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1036f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1037f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1038f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1039f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_MOVE_FAILED:
1040f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    CharSequence msg = getActivity().getString(R.string.move_app_failed_dlg_text,
1041f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().getMoveErrMsg(moveErrorCode));
1042f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1043f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title))
1044e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1045f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(msg)
1046f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok, null)
1047f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1048f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                case DLG_DISABLE:
1049f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1050f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_disable_dlg_title))
1051e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1052f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_disable_dlg_text))
1053f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1054f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DialogInterface.OnClickListener() {
1055f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1056f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            // Disable the app
1057f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            new DisableChanger(getOwner(), getOwner().mAppEntry.info,
1058f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER)
1059f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            .execute((Object)null);
1060f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        }
1061f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    })
1062f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1063f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .create();
106470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                case DLG_DISABLE_NOTIFICATIONS:
106570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    return new AlertDialog.Builder(getActivity())
106670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setTitle(getActivity().getText(R.string.app_disable_notifications_dlg_title))
1067c8272b075275f81ddfb9cef2f92514b7ce3365deBjörn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
106870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setMessage(getActivity().getText(R.string.app_disable_notifications_dlg_text))
106970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setPositiveButton(R.string.dlg_ok,
107070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        new DialogInterface.OnClickListener() {
107170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        public void onClick(DialogInterface dialog, int which) {
107270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            // Disable the package's notifications
107370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            getOwner().setNotificationsEnabled(false);
107470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        }
107570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    })
107670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setNegativeButton(R.string.dlg_cancel,
107770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        new DialogInterface.OnClickListener() {
107870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        public void onClick(DialogInterface dialog, int which) {
107970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            // Re-enable the checkbox
108070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            getOwner().mNotificationSwitch.setChecked(true);
108170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        }
108270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    })
108370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .create();
1084f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
1085f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            throw new IllegalArgumentException("unknown id " + id);
1086f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
108750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
108850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
10893db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    private void uninstallPkg(String packageName, boolean allUsers) {
109050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
109150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
10923db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI);
10933db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers);
10943db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        startActivityForResult(uninstallIntent, REQUEST_UNINSTALL);
109550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
109650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
109742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
1098f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)getActivity().getSystemService(
109942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
110042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
1101c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        mState.invalidatePackage(pkgName);
1102c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName);
1103c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        if (newEnt != null) {
1104c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn            mAppEntry = newEnt;
1105c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        }
1106cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
110742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
110842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
1109cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
1110cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
1111cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
1112861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED);
1113cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
1114cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
1115861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn
1116861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    private void updateForceStopButton(boolean enabled) {
1117861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setEnabled(enabled);
1118861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setOnClickListener(InstalledAppDetails.this);
1119861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    }
1120cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
1121cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
11225c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
11235c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            // User can't force stop device admin.
11245c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            updateForceStopButton(false);
11255c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
1126861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // If the app isn't explicitly stopped, then always show the
1127861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // force stop button.
1128861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(true);
1129861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        } else {
11305c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
11315c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                    Uri.fromParts("package", mAppEntry.info.packageName, null));
11325c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
11335c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
1134861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
1135861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn                    Activity.RESULT_CANCELED, null, null);
1136861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        }
1137cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
113870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
11399db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    static class DisableChanger extends AsyncTask<Object, Object, Object> {
11409db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final PackageManager mPm;
11419db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final WeakReference<InstalledAppDetails> mActivity;
11429db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final ApplicationInfo mInfo;
11439db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final int mState;
11449db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
11459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) {
11469db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm = activity.mPm;
11479db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mActivity = new WeakReference<InstalledAppDetails>(activity);
11489db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mInfo = info;
11499db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mState = state;
11509db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
11519db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
11529db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        @Override
11539db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        protected Object doInBackground(Object... params) {
11549db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0);
11559db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            return null;
11569db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
11579db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    }
11589db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
115970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private void setNotificationsEnabled(boolean enabled) {
116070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        String packageName = mAppEntry.info.packageName;
116170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        INotificationManager nm = INotificationManager.Stub.asInterface(
116270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
116370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        try {
116470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            final boolean enable = mNotificationSwitch.isChecked();
116570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            nm.setNotificationsEnabledForPackage(packageName, enabled);
116670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } catch (android.os.RemoteException ex) {
116770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setChecked(!enabled); // revert
116870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
116970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    }
117070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
11713465b67740e17711af2b36b09e2250a02275d860Jake Hamby    private int getPremiumSmsPermission(String packageName) {
11723465b67740e17711af2b36b09e2250a02275d860Jake Hamby        try {
11733465b67740e17711af2b36b09e2250a02275d860Jake Hamby            if (mSmsManager != null) {
11743465b67740e17711af2b36b09e2250a02275d860Jake Hamby                return mSmsManager.getPremiumSmsPermission(packageName);
11753465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
11763465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } catch (RemoteException ex) {
11773465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // ignored
11783465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
11793465b67740e17711af2b36b09e2250a02275d860Jake Hamby        return SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN;
11803465b67740e17711af2b36b09e2250a02275d860Jake Hamby    }
11813465b67740e17711af2b36b09e2250a02275d860Jake Hamby
1182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
1183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
1184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
1185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
1186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
11870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
118842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
118942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
1190f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_FACTORY_RESET, 0);
119142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
11920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
1193f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    if (mAppEntry.info.enabled) {
1194f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        showDialogInner(DLG_DISABLE, 0);
1195f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    } else {
1196f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DisableChanger(this, mAppEntry.info,
1197f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT)
1198f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        .execute((Object)null);
1199f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    }
12002e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) {
12012e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    try {
12022e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                        mPm.installExistingPackage(packageName);
12032e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                        refreshUi();
12042e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    } catch (NameNotFoundException e) {
12052e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    }
12069db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                } else {
12073db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    uninstallPkg(packageName, false);
12089db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
1209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
1211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
12129d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            try {
12132715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood                mUsbManager.clearDefaults(packageName);
12149d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            } catch (RemoteException e) {
12159d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood                Log.e(TAG, "mUsbManager.clearDefaults", e);
12169d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            }
1217c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            mAppWidgetManager.setBindAppWidgetPermission(packageName, false);
1218c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            TextView autoLaunchTitleView =
1219c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    (TextView) mRootView.findViewById(R.id.auto_launch_title);
1220c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
1221c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView);
122242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
12230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
12243fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                if (!Utils.isMonkeyRunning()) {
12253fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                    Intent intent = new Intent(Intent.ACTION_DEFAULT);
12263fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                    intent.setClassName(mAppEntry.info.packageName,
12273fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                            mAppEntry.info.manageSpaceActivityName);
12283db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    startActivityForResult(intent, REQUEST_MANAGE_SPACE);
12293fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                }
123042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
1231f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_CLEAR_DATA, 0);
123242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
1233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
1234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
1235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
1236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
1237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
1239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
1240f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_FORCE_STOP, 0);
12419db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            //forceStopPackage(mAppInfo.packageName);
1242ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
1243ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
1244ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
1245ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
12460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ?
1247ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
1248de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveInProgress = true;
1249de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            refreshButtons();
12500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags);
1251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1253aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
1254aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    @Override
1255aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1256aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        String packageName = mAppEntry.info.packageName;
1257aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
1258aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
1259aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        if (buttonView == mAskCompatibilityCB) {
1260aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageAskScreenCompat(packageName, isChecked);
1261aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else if (buttonView == mEnableCompatibilityCB) {
1262aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageScreenCompatMode(packageName, isChecked ?
1263aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                    ActivityManager.COMPAT_MODE_ENABLED : ActivityManager.COMPAT_MODE_DISABLED);
12644a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } else if (buttonView == mNotificationSwitch) {
126570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            if (!isChecked) {
126670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                showDialogInner(DLG_DISABLE_NOTIFICATIONS, 0);
126770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            } else {
126870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                setNotificationsEnabled(true);
12694a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            }
1270aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
1271aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    }
1272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1274