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;
113ab616d477be693fc455329953711264af0ed7814Dianne Hackborn    private boolean mInitialized;
114ab616d477be693fc455329953711264af0ed7814Dianne Hackborn    private boolean mShowUninstalled;
1150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageInfo mPackageInfo;
1166dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    private CanBeOnSdCardChecker mCanBeOnSdCardChecker;
117f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private View mRootView;
11842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mUninstallButton;
1199072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    private View mMoreControlButtons;
1209072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    private Button mSpecialDisableButton;
121de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private boolean mMoveInProgress = false;
12242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private boolean mUpdatedSysApp = false;
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
124aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private View mScreenCompatSection;
125aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private CheckBox mAskCompatibilityCB;
126aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private CheckBox mEnableCompatibilityCB;
1272f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn    private boolean mCanClearData = true;
12850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private TextView mAppVersion;
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
132bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private TextView mExternalCodeSize;
133bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private TextView mExternalDataSize;
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
14042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mClearDataButton;
14142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mMoveAppButton;
14270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private CompoundButton mNotificationSwitch;
1434a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
144ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private PackageMoveObserver mPackageMoveObserver;
1459072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn
1469072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    private boolean mDisableAfterUninstall;
1479072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn
1480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private boolean mHaveSizes = false;
1490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCodeSize = -1;
1500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastDataSize = -1;
151bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private long mLastExternalCodeSize = -1;
152bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private long mLastExternalDataSize = -1;
1530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCacheSize = -1;
1540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastTotalSize = -1;
1550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
161ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private static final int PACKAGE_MOVE = 4;
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
17250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
17350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
17450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
17550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
17650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
17742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private static final int DLG_FORCE_STOP = DLG_BASE + 5;
1785cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private static final int DLG_MOVE_FAILED = DLG_BASE + 6;
179f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn    private static final int DLG_DISABLE = DLG_BASE + 7;
18070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private static final int DLG_DISABLE_NOTIFICATIONS = DLG_BASE + 8;
1819072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    private static final int DLG_SPECIAL_DISABLE = DLG_BASE + 9;
1823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
1833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    // Menu identifiers
1843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public static final int UNINSTALL_ALL_USERS_MENU = 1;
1853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
1863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    // Result code identifiers
1873db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public static final int REQUEST_UNINSTALL = 1;
1883db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public static final int REQUEST_MANAGE_SPACE = 2;
1893db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
192f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            // If the fragment is gone, don't process any more messages.
193f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (getView() == null) {
19407f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn                return;
19507f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            }
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
2020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    mState.requestSize(mAppEntry.info.packageName);
203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
204ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                case PACKAGE_MOVE:
205ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    processMoveMsg(msg);
206ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    break;
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
224ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
228ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
229ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    class PackageMoveObserver extends IPackageMoveObserver.Stub {
230ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        public void packageMoved(String packageName, int returnCode) throws RemoteException {
231ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            final Message msg = mHandler.obtainMessage(PACKAGE_MOVE);
232ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = returnCode;
233ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mHandler.sendMessage(msg);
234ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
235ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
241f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return Formatter.formatFileSize(getActivity(), size);
242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
24442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initDataButtons() {
2452f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn        if ((mAppEntry.info.flags&(ApplicationInfo.FLAG_SYSTEM
2462f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                | ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA))
2475c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                == ApplicationInfo.FLAG_SYSTEM
2485c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
24942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.clear_user_data_text);
2502f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setEnabled(false);
2512f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mCanClearData = false;
2522f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn        } else {
2532f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
2542f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.manage_space_text);
2552f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            } else {
2562f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.clear_user_data_text);
2572f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            }
2582f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setOnClickListener(this);
25942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
260ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
261ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
2625cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private CharSequence getMoveErrMsg(int errCode) {
2635cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        switch (errCode) {
2645cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
265f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.insufficient_storage);
2665cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_DOESNT_EXIST:
267f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.does_not_exist);
2685cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_FORWARD_LOCKED:
269f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.app_forward_locked);
2705cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INVALID_LOCATION:
271f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.invalid_location);
2725cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE:
273f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.system_package);
2749a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INTERNAL_ERROR:
2759a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu                return "";
2765cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        }
2779a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu        return "";
2785cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    }
2795cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
280ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void initMoveButton() {
281ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (Environment.isExternalStorageEmulated()) {
282ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mMoveAppButton.setVisibility(View.INVISIBLE);
283ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return;
284ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
28542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean dataOnly = false;
2860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        dataOnly = (mPackageInfo == null) && (mAppEntry != null);
287ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        boolean moveDisable = true;
28842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (dataOnly) {
28942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app);
2900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
29142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_internal);
2924056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu            // Always let apps move to internal storage from sdcard.
293ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = false;
29442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
29542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_sdcard);
2966dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            mCanBeOnSdCardChecker.init();
2976dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            moveDisable = !mCanBeOnSdCardChecker.check(mAppEntry.info);
298730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu        }
299ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if (moveDisable) {
300ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
301ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
302ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setOnClickListener(this);
303ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(true);
304ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
30542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
30642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
30770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private boolean isThisASystemPackage() {
30870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        try {
30970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            PackageInfo sys = mPm.getPackageInfo("android", PackageManager.GET_SIGNATURES);
31070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            return (mPackageInfo != null && mPackageInfo.signatures != null &&
31170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    sys.signatures[0].equals(mPackageInfo.signatures[0]));
31270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } catch (PackageManager.NameNotFoundException e) {
31370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            return false;
31470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
31570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    }
31670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
3179072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    private boolean handleDisableable(Button button) {
3189072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        boolean disableable = false;
3199072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        try {
3209072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            // Try to prevent the user from bricking their phone
3219072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            // by not allowing disabling of apps signed with the
3229072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            // system cert and any launcher app in the system.
3239072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            PackageInfo sys = mPm.getPackageInfo("android",
3249072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    PackageManager.GET_SIGNATURES);
3259072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            Intent intent = new Intent(Intent.ACTION_MAIN);
3269072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            intent.addCategory(Intent.CATEGORY_HOME);
3279072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            intent.setPackage(mAppEntry.info.packageName);
3289072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            List<ResolveInfo> homes = mPm.queryIntentActivities(intent, 0);
3299072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            if ((homes != null && homes.size() > 0) || isThisASystemPackage()) {
3309072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                // Disable button for core system applications.
3319072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                button.setText(R.string.disable_text);
3329072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            } else if (mAppEntry.info.enabled) {
3339072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                button.setText(R.string.disable_text);
3349072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                disableable = true;
3359072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            } else {
3369072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                button.setText(R.string.enable_text);
3379072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                disableable = true;
3389072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            }
3399072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        } catch (PackageManager.NameNotFoundException e) {
3409072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            Log.w(TAG, "Unable to get package info", e);
3419072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        }
3429072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        return disableable;
3439072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    }
3449072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn
345de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void initUninstallButtons() {
3460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
34742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean enabled = true;
34842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mUpdatedSysApp) {
34942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.app_factory_reset);
3509072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            boolean specialDisable = false;
3519072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
3529072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                specialDisable = handleDisableable(mSpecialDisableButton);
3539072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                mSpecialDisableButton.setOnClickListener(this);
3549072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            }
3559072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            mMoreControlButtons.setVisibility(specialDisable ? View.VISIBLE : View.GONE);
35642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
3579072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            mMoreControlButtons.setVisibility(View.GONE);
3580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
3599072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                enabled = handleDisableable(mUninstallButton);
3602e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn            } else if ((mPackageInfo.applicationInfo.flags
3614de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    & ApplicationInfo.FLAG_INSTALLED) == 0
3624de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    && mUserManager.getUsers().size() >= 2) {
3634de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                // When we have multiple users, there is a separate menu
3644de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                // to uninstall for all users.
365c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn                mUninstallButton.setText(R.string.uninstall_text);
366c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn                enabled = false;
3679db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            } else {
3689db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                mUninstallButton.setText(R.string.uninstall_text);
369b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu            }
37042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
3715c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        // If this is a device admin, it can't be uninstall or disabled.
3725c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        // We do this here so the text of the button is still set correctly.
3735c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
3745c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            enabled = false;
3755c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        }
37642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
37742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
37842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
37942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
38042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
38142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
38242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
3834a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    private void initNotificationButton() {
3844a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        INotificationManager nm = INotificationManager.Stub.asInterface(
3854a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
3864a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        boolean enabled = true; // default on
3874a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        try {
388df3f6d6c4722a7acc8189e47d0499aaf618969f9Daniel Sandler            enabled = nm.areNotificationsEnabledForPackage(mAppEntry.info.packageName,
389df3f6d6c4722a7acc8189e47d0499aaf618969f9Daniel Sandler                    mAppEntry.info.uid);
3904a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } catch (android.os.RemoteException ex) {
3914a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            // this does not bode well
3924a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        }
3934a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        mNotificationSwitch.setChecked(enabled);
39470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        if (isThisASystemPackage()) {
39570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setEnabled(false);
39670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } else {
39770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setEnabled(true);
39870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setOnCheckedChangeListener(this);
39970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
4004a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    }
4014a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
404f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle icicle) {
405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
4063db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
407f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mState = ApplicationsState.getInstance(getActivity().getApplication());
408309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession = mState.newSession(this);
409f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mPm = getActivity().getPackageManager();
4103db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        mUserManager = (UserManager)getActivity().getSystemService(Context.USER_SERVICE);
4119d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        IBinder b = ServiceManager.getService(Context.USB_SERVICE);
4129d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        mUsbManager = IUsbManager.Stub.asInterface(b);
413c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        mAppWidgetManager = AppWidgetManager.getInstance(getActivity());
4145c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
4153465b67740e17711af2b36b09e2250a02275d860Jake Hamby        mSmsManager = ISms.Stub.asInterface(ServiceManager.getService("isms"));
4169d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood
4176dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mCanBeOnSdCardChecker = new CanBeOnSdCardChecker();
4180fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
419c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn        // Need to make sure we have loaded applications at this point.
420c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn        mSession.resume();
421c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn
4220fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        retrieveAppEntry();
4230fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
4240fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        setHasOptionsMenu(true);
425f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    }
426f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
427f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    @Override
42897d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey    public View onCreateView(
42997d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
43097d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        final View view = inflater.inflate(R.layout.installed_app_details, container, false);
43197d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        Utils.prepareCustomPreferencesList(container, view, view, false);
43297d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey
43397d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        mRootView = view;
434f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingStr = getActivity().getText(R.string.computing_size);
435b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
43650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
437f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mTotalSize = (TextView)view.findViewById(R.id.total_size_text);
438f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mAppSize = (TextView)view.findViewById(R.id.application_size_text);
439f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mDataSize = (TextView)view.findViewById(R.id.data_size_text);
440bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalCodeSize = (TextView)view.findViewById(R.id.external_code_size_text);
441bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalDataSize = (TextView)view.findViewById(R.id.external_data_size_text);
4421f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn
4431f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn        if (Environment.isExternalStorageEmulated()) {
4441f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            ((View)mExternalCodeSize.getParent()).setVisibility(View.GONE);
4451f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            ((View)mExternalDataSize.getParent()).setVisibility(View.GONE);
4461f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn        }
4471f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn
44842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
449f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View btnPanel = view.findViewById(R.id.control_buttons_panel);
45042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
45142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
45242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
453cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
454b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4559072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        // Get More Control button panel
4569072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        mMoreControlButtons = view.findViewById(R.id.more_control_buttons_panel);
4579072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        mMoreControlButtons.findViewById(R.id.left_button).setVisibility(View.INVISIBLE);
4589072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        mSpecialDisableButton = (Button)mMoreControlButtons.findViewById(R.id.right_button);
4599072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        mMoreControlButtons.setVisibility(View.GONE);
4609072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn
46142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
462f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View data_buttons_panel = view.findViewById(R.id.data_buttons_panel);
463313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
464313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
465b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Cache section
467f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mCacheSize = (TextView) view.findViewById(R.id.cache_size_text);
468f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mClearCacheButton = (Button) view.findViewById(R.id.clear_cache_button);
469f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
470f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mActivitiesButton = (Button)view.findViewById(R.id.clear_activities_button);
4710f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
472aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility control
473aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mScreenCompatSection = view.findViewById(R.id.screen_compatibility_section);
474aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mAskCompatibilityCB = (CheckBox)view.findViewById(R.id.ask_compatibility_cb);
475aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mEnableCompatibilityCB = (CheckBox)view.findViewById(R.id.enable_compatibility_cb);
4764a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
47770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        mNotificationSwitch = (CompoundButton) view.findViewById(R.id.notification_switch);
478aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
479f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return view;
480afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
481f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
4823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
4843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text)
4853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
4873db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
4883db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4893db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onPrepareOptionsMenu(Menu menu) {
4903db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        boolean showIt = true;
4913db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (mUpdatedSysApp) {
4923db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4930fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        } else if (mAppEntry == null) {
4940fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn            showIt = false;
4953db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
4963db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
49754b3f501ca4a7ff88ead39247d2277d2efc82bb6Jeff Sharkey        } else if (mPackageInfo == null || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
4983db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4993db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if (UserHandle.myUserId() != 0) {
5003db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
5017a1c4cdfae66e8b110de3988e65586871a969c04Amith Yamasani        } else if (mUserManager.getUsers().size() < 2) {
5023db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
5033db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
5043db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt);
5053db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
5063db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
5073db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
5083db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public boolean onOptionsItemSelected(MenuItem item) {
5093db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        int menuId = item.getItemId();
5103db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (menuId == UNINSTALL_ALL_USERS_MENU) {
5119072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            uninstallPkg(mAppEntry.info.packageName, true, false);
5123db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            return true;
5133db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
5143db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        return false;
5153db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
5163db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
5173db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
5183db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onActivityResult(int requestCode, int resultCode, Intent data) {
5193db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        super.onActivityResult(requestCode, resultCode, data);
5203db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (requestCode == REQUEST_UNINSTALL) {
5219072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            if (mDisableAfterUninstall) {
5229072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                mDisableAfterUninstall = false;
5239072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                try {
5249072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    ApplicationInfo ainfo = getActivity().getPackageManager().getApplicationInfo(
5259072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                            mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES
5269072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                            | PackageManager.GET_DISABLED_COMPONENTS);
5279072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    if ((ainfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) {
5289072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                        new DisableChanger(this, mAppEntry.info,
5299072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                                PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER)
5309072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                                .execute((Object)null);
5319072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    }
5329072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                } catch (NameNotFoundException e) {
5339072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                }
5349072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            }
5353db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            if (!refreshUi()) {
5363db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                setIntentAndFinish(true, true);
5373db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            }
5383db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
5393db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
5403db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
5410dd9902c89e7b705fd73158aadf1bf27843ad201Dianne Hackborn    // Utility method to set application label and icon.
542f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    private void setAppLabelAndIcon(PackageInfo pkgInfo) {
54397d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        final View appSnippet = mRootView.findViewById(R.id.app_snippet);
544b27223f139248f92637997378d7a38d7d24f6b02Fabrice Di Meglio        appSnippet.setPaddingRelative(0, appSnippet.getPaddingTop(), 0, appSnippet.getPaddingBottom());
54597d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey
546f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
5470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.ensureIcon(mAppEntry);
5480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        icon.setImageDrawable(mAppEntry.icon);
549f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        // Set application name.
550f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
5510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        label.setText(mAppEntry.label);
55250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
553f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size);
554f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
555f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        if (pkgInfo != null && pkgInfo.versionName != null) {
55650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
557f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            mAppVersion.setText(getActivity().getString(R.string.version_text,
5588e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
55950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
560f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu            mAppVersion.setVisibility(View.INVISIBLE);
56150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
56250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
56350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
56450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
56542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
56642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
567b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
568309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession.resume();
5690f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!refreshUi()) {
570b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            setIntentAndFinish(true, true);
571b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
5720f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5730f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPause() {
5760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        super.onPause();
577309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession.pause();
5780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5800f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onAllSizesComputed() {
5820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5840f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageIconChanged() {
5860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5890f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageListChanged() {
5900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
5910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5930f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
59419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    public void onRebuildComplete(ArrayList<AppEntry> apps) {
59519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    }
59619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
59719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    @Override
5980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageSizeChanged(String packageName) {
5990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (packageName.equals(mAppEntry.info.packageName)) {
6000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            refreshSizeInfo();
6010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
6020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
6030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
6040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
6050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onRunningStateChanged(boolean running) {
6060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
6070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
6080fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn    private String retrieveAppEntry() {
6090c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        final Bundle args = getArguments();
6100c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        String packageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null;
611f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        if (packageName == null) {
6120c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy            Intent intent = (args == null) ?
6130c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy                    getActivity().getIntent() : (Intent) args.getParcelable("intent");
614f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (intent != null) {
615f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                packageName = intent.getData().getSchemeSpecificPart();
616f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
617f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
6180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mAppEntry = mState.getEntry(packageName);
619347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey        if (mAppEntry != null) {
620347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey            // Get application info again to refresh changed properties of application
621347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey            try {
622347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey                mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
623347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey                        PackageManager.GET_DISABLED_COMPONENTS |
624347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey                        PackageManager.GET_UNINSTALLED_PACKAGES |
625347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey                        PackageManager.GET_SIGNATURES);
626347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey            } catch (NameNotFoundException e) {
627347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey                Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
628347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey            }
629347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey        } else {
630347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey            Log.w(TAG, "Missing AppEntry; maybe reinstalling?");
631347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey            mPackageInfo = null;
632b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani        }
633b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani
6340fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        return packageName;
6350fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn    }
6360fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
6370fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn    private boolean refreshUi() {
6380fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        if (mMoveInProgress) {
6390fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn            return true;
6400fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        }
6410fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn        final String packageName = retrieveAppEntry();
6420fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn
6430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry == null) {
6440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
645b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
646b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani
647b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani        if (mPackageInfo == null) {
6480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
64950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
650b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani
6510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Get list of preferred activities
6520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<ComponentName> prefActList = new ArrayList<ComponentName>();
653b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
6540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Intent list cannot be null. so pass empty list
6550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<IntentFilter> intentList = new ArrayList<IntentFilter>();
6560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mPm.getPreferredActivities(intentList, prefActList, packageName);
657c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        if (localLOGV)
658c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            Log.i(TAG, "Have " + prefActList.size() + " number of activities in preferred list");
6599d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        boolean hasUsbDefaults = false;
6609d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        try {
661be32d4b408a2fd0ec25bdd4f0e67cba2f23a4edbJeff Sharkey            hasUsbDefaults = mUsbManager.hasDefaults(packageName, UserHandle.myUserId());
6629d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        } catch (RemoteException e) {
6639d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            Log.e(TAG, "mUsbManager.hasDefaults", e);
6649d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        }
665c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        boolean hasBindAppWidgetPermission =
666c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                mAppWidgetManager.hasBindAppWidgetPermission(mAppEntry.info.packageName);
667c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
668c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        TextView autoLaunchTitleView = (TextView) mRootView.findViewById(R.id.auto_launch_title);
669c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
670c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        boolean autoLaunchEnabled = prefActList.size() > 0 || hasUsbDefaults;
671c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        if (!autoLaunchEnabled && !hasBindAppWidgetPermission) {
672c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView);
6730f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else {
674c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            boolean useBullets = hasBindAppWidgetPermission && autoLaunchEnabled;
675c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
676c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (hasBindAppWidgetPermission) {
677c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                autoLaunchTitleView.setText(R.string.auto_launch_label_generic);
678c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            } else {
679c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                autoLaunchTitleView.setText(R.string.auto_launch_label);
680c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
681c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
682c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            CharSequence text = null;
683c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            int bulletIndent = getResources()
684c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    .getDimensionPixelSize(R.dimen.installed_app_details_bullet_offset);
685c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (autoLaunchEnabled) {
686c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                CharSequence autoLaunchEnableText = getText(R.string.auto_launch_enable_text);
687c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                SpannableString s = new SpannableString(autoLaunchEnableText);
688c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                if (useBullets) {
689c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    s.setSpan(new BulletSpan(bulletIndent), 0, autoLaunchEnableText.length(), 0);
690c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                }
691c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                text = (text == null) ?
692c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n");
693c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
694c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (hasBindAppWidgetPermission) {
695c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                CharSequence alwaysAllowBindAppWidgetsText =
696c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        getText(R.string.always_allow_bind_appwidgets_text);
697c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                SpannableString s = new SpannableString(alwaysAllowBindAppWidgetsText);
698c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                if (useBullets) {
699c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    s.setSpan(new BulletSpan(bulletIndent),
700c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                            0, alwaysAllowBindAppWidgetsText.length(), 0);
701c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                }
702c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                text = (text == null) ?
703c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n");
704c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
705c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            autoLaunchView.setText(text);
7060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setEnabled(true);
7070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setOnClickListener(this);
7080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
709aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
710aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility section.
711aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
712aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
713aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        int compatMode = am.getPackageScreenCompatMode(packageName);
71413bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // For now these are always off; this is the old UI model which we
71513bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // are no longer using.
71613bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        if (false && (compatMode == ActivityManager.COMPAT_MODE_DISABLED
71713bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn                || compatMode == ActivityManager.COMPAT_MODE_ENABLED)) {
718aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.VISIBLE);
719aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setChecked(am.getPackageAskScreenCompat(packageName));
720aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setOnCheckedChangeListener(this);
721aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setChecked(compatMode == ActivityManager.COMPAT_MODE_ENABLED);
722aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setOnCheckedChangeListener(this);
723aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else {
724aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.GONE);
725aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
726aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
7270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Security permissions section
728f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        LinearLayout permsView = (LinearLayout) mRootView.findViewById(R.id.permissions_section);
729f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        AppSecurityPermissions asp = new AppSecurityPermissions(getActivity(), packageName);
7303465b67740e17711af2b36b09e2250a02275d860Jake Hamby        int premiumSmsPermission = getPremiumSmsPermission(packageName);
7313465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // Premium SMS permission implies the app also has SEND_SMS permission, so the original
7323465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // application permissions list doesn't have to be shown/hidden separately. The premium
7333465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // SMS subsection should only be visible if the app has tried to send to a premium SMS.
7343465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (asp.getPermissionCount() > 0
7353465b67740e17711af2b36b09e2250a02275d860Jake Hamby                || premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) {
7360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            permsView.setVisibility(View.VISIBLE);
7373465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } else {
7383465b67740e17711af2b36b09e2250a02275d860Jake Hamby            permsView.setVisibility(View.GONE);
7393465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7403465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // Premium SMS permission subsection
7413465b67740e17711af2b36b09e2250a02275d860Jake Hamby        TextView securityBillingDesc = (TextView) permsView.findViewById(
7423465b67740e17711af2b36b09e2250a02275d860Jake Hamby                R.id.security_settings_billing_desc);
7433465b67740e17711af2b36b09e2250a02275d860Jake Hamby        LinearLayout securityBillingList = (LinearLayout) permsView.findViewById(
7443465b67740e17711af2b36b09e2250a02275d860Jake Hamby                R.id.security_settings_billing_list);
7453465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) {
7463465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Show the premium SMS permission selector
7473465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingDesc.setVisibility(View.VISIBLE);
7483465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingList.setVisibility(View.VISIBLE);
7493465b67740e17711af2b36b09e2250a02275d860Jake Hamby            Spinner spinner = (Spinner) permsView.findViewById(
7503465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    R.id.security_settings_premium_sms_list);
7513465b67740e17711af2b36b09e2250a02275d860Jake Hamby            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
7523465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    R.array.security_settings_premium_sms_values,
7533465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    android.R.layout.simple_spinner_item);
7543465b67740e17711af2b36b09e2250a02275d860Jake Hamby            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
7553465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setAdapter(adapter);
7563465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // List items are in the same order as SmsUsageMonitor constants, offset by 1.
7573465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setSelection(premiumSmsPermission - 1);
7583465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setOnItemSelectedListener(new PremiumSmsSelectionListener(
7593465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    packageName, mSmsManager));
7603465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } else {
7613465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Hide the premium SMS permission selector
7623465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingDesc.setVisibility(View.GONE);
7633465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingList.setVisibility(View.GONE);
7643465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7653465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // App permissions subsection
7663465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (asp.getPermissionCount() > 0) {
7670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            // Make the security sections header visible
7680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            LinearLayout securityList = (LinearLayout) permsView.findViewById(
7690f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    R.id.security_settings_list);
7700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.removeAllViews();
771b26a61d6433e2e5456563e5d33aa4f419a8966fbNick Kralevich            securityList.addView(asp.getPermissionsViewWithRevokeButtons());
772e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            // If this app is running under a shared user ID with other apps,
773e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            // update the description to explain this.
774e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            String[] packages = mPm.getPackagesForUid(mPackageInfo.applicationInfo.uid);
775e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            if (packages != null && packages.length > 1) {
776e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                ArrayList<CharSequence> pnames = new ArrayList<CharSequence>();
777e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                for (int i=0; i<packages.length; i++) {
778e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    String pkg = packages[i];
779e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    if (mPackageInfo.packageName.equals(pkg)) {
780e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        continue;
781e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
782e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    try {
783e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        ApplicationInfo ainfo = mPm.getApplicationInfo(pkg, 0);
784e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        pnames.add(ainfo.loadLabel(mPm));
785e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
786e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
787e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                }
788e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                final int N = pnames.size();
789e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                if (N > 0) {
790e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    final Resources res = getActivity().getResources();
791e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    String appListStr;
792e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    if (N == 1) {
793e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = pnames.get(0).toString();
794e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } else if (N == 2) {
795e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = res.getString(R.string.join_two_items, pnames.get(0),
796e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                pnames.get(1));
797e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } else {
798e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = pnames.get(N-2).toString();
799e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        for (int i=N-3; i>=0; i--) {
800e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            appListStr = res.getString(i == 0 ? R.string.join_many_items_first
801e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                    : R.string.join_many_items_middle, pnames.get(i), appListStr);
802e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        }
803e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = res.getString(R.string.join_many_items_last,
804e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                appListStr, pnames.get(N-1));
805e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
806e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    TextView descr = (TextView) mRootView.findViewById(
807e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            R.id.security_settings_desc);
808e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    descr.setText(res.getString(R.string.security_settings_desc_multi,
809e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            mPackageInfo.applicationInfo.loadLabel(mPm), appListStr));
810e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                }
811e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            }
812de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
8130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
8140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        checkForceStop();
8150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        setAppLabelAndIcon(mPackageInfo);
8160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshButtons();
8170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshSizeInfo();
818ab616d477be693fc455329953711264af0ed7814Dianne Hackborn
819ab616d477be693fc455329953711264af0ed7814Dianne Hackborn        if (!mInitialized) {
820ab616d477be693fc455329953711264af0ed7814Dianne Hackborn            // First time init: are we displaying an uninstalled app?
821ab616d477be693fc455329953711264af0ed7814Dianne Hackborn            mInitialized = true;
822ab616d477be693fc455329953711264af0ed7814Dianne Hackborn            mShowUninstalled = (mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0;
8234de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn        } else {
8244de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn            // All other times: if the app no longer exists then we want
8254de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn            // to go away.
8269072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            try {
8279072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                ApplicationInfo ainfo = getActivity().getPackageManager().getApplicationInfo(
8289072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                        mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES
8299072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                        | PackageManager.GET_DISABLED_COMPONENTS);
8304de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                if (!mShowUninstalled) {
8314de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    // If we did not start out with the app uninstalled, then
8324de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    // it transitioning to the uninstalled state for the current
8334de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    // user means we should go away as well.
8344de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    return (ainfo.flags&ApplicationInfo.FLAG_INSTALLED) != 0;
8354de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                }
8369072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            } catch (NameNotFoundException e) {
8379072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                return false;
8389072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            }
839ab616d477be693fc455329953711264af0ed7814Dianne Hackborn        }
840ab616d477be693fc455329953711264af0ed7814Dianne Hackborn
8410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        return true;
842afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
8433465b67740e17711af2b36b09e2250a02275d860Jake Hamby
8443465b67740e17711af2b36b09e2250a02275d860Jake Hamby    private static class PremiumSmsSelectionListener implements AdapterView.OnItemSelectedListener {
8453465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private final String mPackageName;
8463465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private final ISms mSmsManager;
8473465b67740e17711af2b36b09e2250a02275d860Jake Hamby
8483465b67740e17711af2b36b09e2250a02275d860Jake Hamby        PremiumSmsSelectionListener(String packageName, ISms smsManager) {
8493465b67740e17711af2b36b09e2250a02275d860Jake Hamby            mPackageName = packageName;
8503465b67740e17711af2b36b09e2250a02275d860Jake Hamby            mSmsManager = smsManager;
8513465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
8523465b67740e17711af2b36b09e2250a02275d860Jake Hamby
8533465b67740e17711af2b36b09e2250a02275d860Jake Hamby        @Override
8543465b67740e17711af2b36b09e2250a02275d860Jake Hamby        public void onItemSelected(AdapterView<?> parent, View view, int position,
8553465b67740e17711af2b36b09e2250a02275d860Jake Hamby                long id) {
8563465b67740e17711af2b36b09e2250a02275d860Jake Hamby            if (position >= 0 && position < 3) {
8573465b67740e17711af2b36b09e2250a02275d860Jake Hamby                Log.d(TAG, "Selected premium SMS policy " + position);
8583465b67740e17711af2b36b09e2250a02275d860Jake Hamby                setPremiumSmsPermission(mPackageName, (position + 1));
8593465b67740e17711af2b36b09e2250a02275d860Jake Hamby            } else {
8603465b67740e17711af2b36b09e2250a02275d860Jake Hamby                Log.e(TAG, "Error: unknown premium SMS policy " + position);
8613465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
8623465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
8633465b67740e17711af2b36b09e2250a02275d860Jake Hamby
8643465b67740e17711af2b36b09e2250a02275d860Jake Hamby        @Override
8653465b67740e17711af2b36b09e2250a02275d860Jake Hamby        public void onNothingSelected(AdapterView<?> parent) {
8663465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Ignored
8673465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
8683465b67740e17711af2b36b09e2250a02275d860Jake Hamby
8693465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private void setPremiumSmsPermission(String packageName, int permission) {
8703465b67740e17711af2b36b09e2250a02275d860Jake Hamby            try {
8713465b67740e17711af2b36b09e2250a02275d860Jake Hamby                if (mSmsManager != null) {
8723465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    mSmsManager.setPremiumSmsPermission(packageName, permission);
8733465b67740e17711af2b36b09e2250a02275d860Jake Hamby                }
8743465b67740e17711af2b36b09e2250a02275d860Jake Hamby            } catch (RemoteException ex) {
8753465b67740e17711af2b36b09e2250a02275d860Jake Hamby                // ignored
8763465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
8773465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
8783465b67740e17711af2b36b09e2250a02275d860Jake Hamby    }
8790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
880c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    private void resetLaunchDefaultsUi(TextView title, TextView autoLaunchView) {
881c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        title.setText(R.string.auto_launch_label);
882c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        autoLaunchView.setText(R.string.auto_launch_disable_text);
883c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        // Disable clear activities button
884c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        mActivitiesButton.setEnabled(false);
885c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    }
886c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
887afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
888afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
889afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
890afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
891ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        PreferenceActivity pa = (PreferenceActivity)getActivity();
892ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        pa.finishPreferencePanel(this, Activity.RESULT_OK, intent);
893afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
894afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
8950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private void refreshSizeInfo() {
8960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry.size == ApplicationsState.SIZE_INVALID
8970f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) {
8980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1;
8990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (!mHaveSizes) {
9000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mAppSize.setText(mComputingStr);
9010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mDataSize.setText(mComputingStr);
9020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mCacheSize.setText(mComputingStr);
9030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(mComputingStr);
9040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
9050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearDataButton.setEnabled(false);
9060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearCacheButton.setEnabled(false);
9070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
908afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
9090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mHaveSizes = true;
9101f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            long codeSize = mAppEntry.codeSize;
9111f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            long dataSize = mAppEntry.dataSize;
9121f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (Environment.isExternalStorageEmulated()) {
9131f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                codeSize += mAppEntry.externalCodeSize;
9141f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                dataSize +=  mAppEntry.externalDataSize;
9151f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            } else {
9161f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                if (mLastExternalCodeSize != mAppEntry.externalCodeSize) {
9171f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mLastExternalCodeSize = mAppEntry.externalCodeSize;
9181f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mExternalCodeSize.setText(getSizeStr(mAppEntry.externalCodeSize));
9191f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                }
9201f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                if (mLastExternalDataSize !=  mAppEntry.externalDataSize) {
9211f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mLastExternalDataSize =  mAppEntry.externalDataSize;
9221f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mExternalDataSize.setText(getSizeStr( mAppEntry.externalDataSize));
9231f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                }
924afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
9251f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (mLastCodeSize != codeSize) {
9261f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mLastCodeSize = codeSize;
9271f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mAppSize.setText(getSizeStr(codeSize));
928bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            }
9291f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (mLastDataSize != dataSize) {
9301f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mLastDataSize = dataSize;
9311f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mDataSize.setText(getSizeStr(dataSize));
932424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root            }
933313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            long cacheSize = mAppEntry.cacheSize + mAppEntry.externalCacheSize;
934313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            if (mLastCacheSize != cacheSize) {
935313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn                mLastCacheSize = cacheSize;
936313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn                mCacheSize.setText(getSizeStr(cacheSize));
937afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
9380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastTotalSize != mAppEntry.size) {
9390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastTotalSize = mAppEntry.size;
9400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(getSizeStr(mAppEntry.size));
941afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
9420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
9431f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if ((mAppEntry.dataSize+ mAppEntry.externalDataSize) <= 0 || !mCanClearData) {
9440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(false);
9450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
9460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(true);
9470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setOnClickListener(this);
9480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
949313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            if (cacheSize <= 0) {
9500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(false);
9510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
9520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(true);
9530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setOnClickListener(this);
954afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
955afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
956afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
957afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
958afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
959afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
960afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
961afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
962afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
963afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
9640f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
96542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
966afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
96742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
9680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
969afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
97042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
971afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
9729db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        checkForceStop();
973afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
974ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
975de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void refreshButtons() {
976de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        if (!mMoveInProgress) {
977de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initUninstallButtons();
978de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initDataButtons();
979de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initMoveButton();
9804a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            initNotificationButton();
981de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        } else {
982de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
983de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setEnabled(false);
984de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mUninstallButton.setEnabled(false);
9859072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            mSpecialDisableButton.setEnabled(false);
986de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
987de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    }
988de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu
989ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
990ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
9910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
992de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        // Refresh the button attributes.
993de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        mMoveInProgress = false;
9940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (result == PackageManager.MOVE_SUCCEEDED) {
995ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
996de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            // Refresh size information again.
9970f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
998ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
999f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_MOVE_FAILED, result);
1000ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
10010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
1002ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
10035cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
1004afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
1005afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
1006afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
1007afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
100842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
100942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
101042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
10110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
101242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
10130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mClearDataObserver == null) {
1014afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
1015afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1016f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)
1017f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
1018afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
10190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!res) {
102050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
1021afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
1022f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_CANNOT_CLEAR_DATA, 0);
1023afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
102442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
1025afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1026afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1027afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1028f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private void showDialogInner(int id, int moveErrorCode) {
1029f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        DialogFragment newFragment = MyAlertDialogFragment.newInstance(id, moveErrorCode);
1030f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.setTargetFragment(this, 0);
1031f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.show(getFragmentManager(), "dialog " + id);
103250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
103350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
1034f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static class MyAlertDialogFragment extends DialogFragment {
1035f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
1036f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public static MyAlertDialogFragment newInstance(int id, int moveErrorCode) {
1037f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            MyAlertDialogFragment frag = new MyAlertDialogFragment();
1038f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            Bundle args = new Bundle();
1039f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("id", id);
1040f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("moveError", moveErrorCode);
1041f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            frag.setArguments(args);
1042f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return frag;
1043f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
1044f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
1045f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        InstalledAppDetails getOwner() {
1046f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return (InstalledAppDetails)getTargetFragment();
1047f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
1048f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
1049f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        @Override
1050f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public Dialog onCreateDialog(Bundle savedInstanceState) {
1051f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int id = getArguments().getInt("id");
1052f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int moveErrorCode = getArguments().getInt("moveError");
1053f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            switch (id) {
1054f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CLEAR_DATA:
1055f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1056f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_data_dlg_title))
1057e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1058f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_data_dlg_text))
1059f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1060f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
1061f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1062f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
1063f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().initiateClearUserData();
1064f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1065f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1066f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1067f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1068f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FACTORY_RESET:
1069f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1070f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title))
1071e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1072f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text))
1073f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1074f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
1075f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1076f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
10779072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                            getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName,
10789072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                                    false, false);
1079f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1080f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1081f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1082f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1083f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_APP_NOT_FOUND:
1084f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1085f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_not_found_dlg_title))
1086e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1087f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_not_found_dlg_title))
1088f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(getActivity().getText(R.string.dlg_ok),
1089f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
1090f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1091f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
1092f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(true, true);
1093f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1094f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1095f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1096f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CANNOT_CLEAR_DATA:
1097f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1098f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_failed_dlg_title))
1099e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1100f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_failed_dlg_text))
1101f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok,
1102f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
1103f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1104f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().mClearDataButton.setEnabled(false);
1105f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
1106f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(false, false);
1107f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1108f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1109f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1110f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FORCE_STOP:
1111f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1112f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.force_stop_dlg_title))
1113e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1114f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.force_stop_dlg_text))
1115f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1116f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        new DialogInterface.OnClickListener() {
1117f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1118f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Force stop
1119f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().forceStopPackage(getOwner().mAppEntry.info.packageName);
1120f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1121f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1122f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1123f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1124f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_MOVE_FAILED:
1125f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    CharSequence msg = getActivity().getString(R.string.move_app_failed_dlg_text,
1126f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().getMoveErrMsg(moveErrorCode));
1127f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1128f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title))
1129e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1130f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(msg)
1131f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok, null)
1132f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1133f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                case DLG_DISABLE:
1134f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1135f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_disable_dlg_title))
1136e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1137f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_disable_dlg_text))
1138f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1139f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DialogInterface.OnClickListener() {
1140f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1141f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            // Disable the app
1142f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            new DisableChanger(getOwner(), getOwner().mAppEntry.info,
1143f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER)
1144f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            .execute((Object)null);
1145f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        }
1146f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    })
1147f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1148f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .create();
114970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                case DLG_DISABLE_NOTIFICATIONS:
115070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    return new AlertDialog.Builder(getActivity())
115170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setTitle(getActivity().getText(R.string.app_disable_notifications_dlg_title))
1152c8272b075275f81ddfb9cef2f92514b7ce3365deBjörn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
115370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setMessage(getActivity().getText(R.string.app_disable_notifications_dlg_text))
115470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setPositiveButton(R.string.dlg_ok,
115570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        new DialogInterface.OnClickListener() {
115670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        public void onClick(DialogInterface dialog, int which) {
115770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            // Disable the package's notifications
115870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            getOwner().setNotificationsEnabled(false);
115970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        }
116070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    })
116170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setNegativeButton(R.string.dlg_cancel,
116270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        new DialogInterface.OnClickListener() {
116370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        public void onClick(DialogInterface dialog, int which) {
116470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            // Re-enable the checkbox
116570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            getOwner().mNotificationSwitch.setChecked(true);
116670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        }
116770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    })
116870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .create();
11699072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                case DLG_SPECIAL_DISABLE:
11709072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    return new AlertDialog.Builder(getActivity())
11719072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_special_disable_dlg_title))
11729072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    .setIconAttribute(android.R.attr.alertDialogIcon)
11739072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_special_disable_dlg_text))
11749072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
11759072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                            new DialogInterface.OnClickListener() {
11769072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
11779072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                            // Clear user data here
11789072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                            getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName,
11799072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                                    false, true);
11809072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                        }
11819072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    })
11829072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
11839072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    .create();
1184f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
1185f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            throw new IllegalArgumentException("unknown id " + id);
1186f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
118750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
118850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
11899072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn    private void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) {
119050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
119150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
11923db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI);
11933db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers);
11943db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        startActivityForResult(uninstallIntent, REQUEST_UNINSTALL);
11959072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        mDisableAfterUninstall = andDisable;
119650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
119750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
119842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
1199f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)getActivity().getSystemService(
120042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
120142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
1202c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        mState.invalidatePackage(pkgName);
1203c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName);
1204c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        if (newEnt != null) {
1205c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn            mAppEntry = newEnt;
1206c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        }
1207cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
120842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
120942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
1210cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
1211cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
1212cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
1213861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED);
1214cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
1215cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
1216861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn
1217861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    private void updateForceStopButton(boolean enabled) {
1218861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setEnabled(enabled);
1219861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setOnClickListener(InstalledAppDetails.this);
1220861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    }
1221cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
1222cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
12235c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
12245c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            // User can't force stop device admin.
12255c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            updateForceStopButton(false);
12265c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
1227861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // If the app isn't explicitly stopped, then always show the
1228861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // force stop button.
1229861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(true);
1230861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        } else {
12315c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
12325c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                    Uri.fromParts("package", mAppEntry.info.packageName, null));
12335c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
12345c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
1235c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn            intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid));
1236861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
1237861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn                    Activity.RESULT_CANCELED, null, null);
1238861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        }
1239cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
124070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
12419db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    static class DisableChanger extends AsyncTask<Object, Object, Object> {
12429db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final PackageManager mPm;
12439db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final WeakReference<InstalledAppDetails> mActivity;
12449db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final ApplicationInfo mInfo;
12459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final int mState;
12469db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
12479db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) {
12489db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm = activity.mPm;
12499db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mActivity = new WeakReference<InstalledAppDetails>(activity);
12509db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mInfo = info;
12519db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mState = state;
12529db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
12539db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
12549db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        @Override
12559db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        protected Object doInBackground(Object... params) {
12569db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0);
12579db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            return null;
12589db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
12599db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    }
12609db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
126170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private void setNotificationsEnabled(boolean enabled) {
126270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        String packageName = mAppEntry.info.packageName;
126370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        INotificationManager nm = INotificationManager.Stub.asInterface(
126470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
126570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        try {
126670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            final boolean enable = mNotificationSwitch.isChecked();
1267df3f6d6c4722a7acc8189e47d0499aaf618969f9Daniel Sandler            nm.setNotificationsEnabledForPackage(packageName, mAppEntry.info.uid, enabled);
126870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } catch (android.os.RemoteException ex) {
126970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setChecked(!enabled); // revert
127070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
127170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    }
127270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
12733465b67740e17711af2b36b09e2250a02275d860Jake Hamby    private int getPremiumSmsPermission(String packageName) {
12743465b67740e17711af2b36b09e2250a02275d860Jake Hamby        try {
12753465b67740e17711af2b36b09e2250a02275d860Jake Hamby            if (mSmsManager != null) {
12763465b67740e17711af2b36b09e2250a02275d860Jake Hamby                return mSmsManager.getPremiumSmsPermission(packageName);
12773465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
12783465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } catch (RemoteException ex) {
12793465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // ignored
12803465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
12813465b67740e17711af2b36b09e2250a02275d860Jake Hamby        return SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN;
12823465b67740e17711af2b36b09e2250a02275d860Jake Hamby    }
12833465b67740e17711af2b36b09e2250a02275d860Jake Hamby
1284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
1285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
1286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
1287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
1288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
12890f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
129042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
129142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
1292f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_FACTORY_RESET, 0);
129342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
12940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
1295f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    if (mAppEntry.info.enabled) {
1296f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        showDialogInner(DLG_DISABLE, 0);
1297f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    } else {
1298f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DisableChanger(this, mAppEntry.info,
1299f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT)
1300f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        .execute((Object)null);
1301f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    }
13022e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) {
13034de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn                    uninstallPkg(packageName, true, false);
13049db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                } else {
13059072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn                    uninstallPkg(packageName, false, false);
13069db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
1307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
13089072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn        } else if(v == mSpecialDisableButton) {
13099072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn            showDialogInner(DLG_SPECIAL_DISABLE, 0);
1310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
1311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
13129d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            try {
1313be32d4b408a2fd0ec25bdd4f0e67cba2f23a4edbJeff Sharkey                mUsbManager.clearDefaults(packageName, UserHandle.myUserId());
13149d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            } catch (RemoteException e) {
13159d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood                Log.e(TAG, "mUsbManager.clearDefaults", e);
13169d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            }
1317c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            mAppWidgetManager.setBindAppWidgetPermission(packageName, false);
1318c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            TextView autoLaunchTitleView =
1319c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    (TextView) mRootView.findViewById(R.id.auto_launch_title);
1320c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
1321c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView);
132242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
13230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
13243fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                if (!Utils.isMonkeyRunning()) {
13253fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                    Intent intent = new Intent(Intent.ACTION_DEFAULT);
13263fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                    intent.setClassName(mAppEntry.info.packageName,
13273fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                            mAppEntry.info.manageSpaceActivityName);
13283db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    startActivityForResult(intent, REQUEST_MANAGE_SPACE);
13293fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                }
133042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
1331f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_CLEAR_DATA, 0);
133242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
1333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
1334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
1335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
1336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
1337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
1339afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
1340f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_FORCE_STOP, 0);
13419db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            //forceStopPackage(mAppInfo.packageName);
1342ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
1343ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
1344ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
1345ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
13460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ?
1347ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
1348de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveInProgress = true;
1349de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            refreshButtons();
13500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags);
1351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1352afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1353aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
1354aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    @Override
1355aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1356aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        String packageName = mAppEntry.info.packageName;
1357aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
1358aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
1359aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        if (buttonView == mAskCompatibilityCB) {
1360aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageAskScreenCompat(packageName, isChecked);
1361aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else if (buttonView == mEnableCompatibilityCB) {
1362aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageScreenCompatMode(packageName, isChecked ?
1363aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                    ActivityManager.COMPAT_MODE_ENABLED : ActivityManager.COMPAT_MODE_DISABLED);
13644a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } else if (buttonView == mNotificationSwitch) {
136570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            if (!isChecked) {
136670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                showDialogInner(DLG_DISABLE_NOTIFICATIONS, 0);
136770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            } else {
136870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                setNotificationsEnabled(true);
13694a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            }
1370aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
1371aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    }
1372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1373afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1374