InstalledAppDetails.java revision 3db54cb97630fe83342c2ca189d13ff5a1a598d3
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * use this file except in compliance with the License. You may obtain a copy
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * License for the specific language governing permissions and limitations
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
193465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport com.android.internal.telephony.ISms;
203465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport com.android.internal.telephony.SmsUsageMonitor;
21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R;
223fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasaniimport com.android.settings.Utils;
2319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport com.android.settings.applications.ApplicationsState.AppEntry;
24728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.ActivityManager;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog;
2850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.app.Dialog;
29f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.DialogFragment;
30f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment;
314a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandlerimport android.app.INotificationManager;
325c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackbornimport android.app.admin.DevicePolicyManager;
33c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.appwidget.AppWidgetManager;
34cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver;
35c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.content.ComponentName;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver;
42ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver;
4350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager;
459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.content.pm.ResolveInfo;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
47e458832c765ed5c3de836384338c7626c80b5686Dianne Hackbornimport android.content.res.Resources;
489d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.hardware.usb.IUsbManager;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri;
509db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.os.AsyncTask;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
52ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.os.Environment;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler;
549d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.os.IBinder;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message;
5650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException;
579d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.os.ServiceManager;
583db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.os.UserHandle;
593db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.os.UserManager;
60ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.preference.PreferenceActivity;
61c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.text.SpannableString;
62c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.text.TextUtils;
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter;
64c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.text.style.BulletSpan;
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
669db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
679db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport java.lang.ref.WeakReference;
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
70f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.LayoutInflater;
713db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.Menu;
723db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuInflater;
733db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuItem;
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
75f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.ViewGroup;
763465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport android.widget.AdapterView;
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
783465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport android.widget.ArrayAdapter;
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
80aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackbornimport android.widget.CheckBox;
81aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackbornimport android.widget.CompoundButton;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
843465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport android.widget.Spinner;
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
96f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class InstalledAppDetails extends Fragment
97aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        implements View.OnClickListener, CompoundButton.OnCheckedChangeListener,
98aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ApplicationsState.Callbacks {
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
1002f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn    private static final boolean localLOGV = false;
1010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
102f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static final String ARG_PACKAGE_NAME = "package";
103f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
1040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageManager mPm;
1053db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    private UserManager mUserManager;
1069d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood    private IUsbManager mUsbManager;
107c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    private AppWidgetManager mAppWidgetManager;
1085c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn    private DevicePolicyManager mDpm;
1093465b67740e17711af2b36b09e2250a02275d860Jake Hamby    private ISms mSmsManager;
1100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState mState;
111309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn    private ApplicationsState.Session mSession;
1120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private ApplicationsState.AppEntry mAppEntry;
1130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private PackageInfo mPackageInfo;
1146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn    private CanBeOnSdCardChecker mCanBeOnSdCardChecker;
115f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private View mRootView;
11642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mUninstallButton;
117de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private boolean mMoveInProgress = false;
11842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private boolean mUpdatedSysApp = false;
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
120aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private View mScreenCompatSection;
121aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private CheckBox mAskCompatibilityCB;
122aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    private CheckBox mEnableCompatibilityCB;
1232f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn    private boolean mCanClearData = true;
12450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private TextView mAppVersion;
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
128bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private TextView mExternalCodeSize;
129bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private TextView mExternalDataSize;
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
13642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mClearDataButton;
13742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private Button mMoveAppButton;
13870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private CompoundButton mNotificationSwitch;
1394a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
140ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private PackageMoveObserver mPackageMoveObserver;
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private boolean mHaveSizes = false;
1430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCodeSize = -1;
1440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastDataSize = -1;
145bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private long mLastExternalCodeSize = -1;
146bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn    private long mLastExternalDataSize = -1;
1470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastCacheSize = -1;
1480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private long mLastTotalSize = -1;
1490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
155ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private static final int PACKAGE_MOVE = 4;
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
16550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
16650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
16750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
16850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
16950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
17050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
17142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private static final int DLG_FORCE_STOP = DLG_BASE + 5;
1725cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private static final int DLG_MOVE_FAILED = DLG_BASE + 6;
173f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn    private static final int DLG_DISABLE = DLG_BASE + 7;
17470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private static final int DLG_DISABLE_NOTIFICATIONS = DLG_BASE + 8;
1753db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
1763db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    // Menu identifiers
1773db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public static final int UNINSTALL_ALL_USERS_MENU = 1;
1783db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
1793db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    // Result code identifiers
1803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public static final int REQUEST_UNINSTALL = 1;
1813db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public static final int REQUEST_MANAGE_SPACE = 2;
1823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
185f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            // If the fragment is gone, don't process any more messages.
186f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (getView() == null) {
18707f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn                return;
18807f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn            }
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
1950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    mState.requestSize(mAppEntry.info.packageName);
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
197ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                case PACKAGE_MOVE:
198ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    processMoveMsg(msg);
199ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    break;
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
217ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
221ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
222ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    class PackageMoveObserver extends IPackageMoveObserver.Stub {
223ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        public void packageMoved(String packageName, int returnCode) throws RemoteException {
224ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            final Message msg = mHandler.obtainMessage(PACKAGE_MOVE);
225ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            msg.arg1 = returnCode;
226ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mHandler.sendMessage(msg);
227ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
228ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
234f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return Formatter.formatFileSize(getActivity(), size);
235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
23742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void initDataButtons() {
2382f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn        if ((mAppEntry.info.flags&(ApplicationInfo.FLAG_SYSTEM
2392f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                | ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA))
2405c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                == ApplicationInfo.FLAG_SYSTEM
2415c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
24242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.clear_user_data_text);
2432f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setEnabled(false);
2442f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mCanClearData = false;
2452f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn        } else {
2462f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
2472f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.manage_space_text);
2482f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            } else {
2492f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn                mClearDataButton.setText(R.string.clear_user_data_text);
2502f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            }
2512f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn            mClearDataButton.setOnClickListener(this);
25242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
253ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
254ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
2555cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    private CharSequence getMoveErrMsg(int errCode) {
2565cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        switch (errCode) {
2575cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
258f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.insufficient_storage);
2595cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_DOESNT_EXIST:
260f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.does_not_exist);
2615cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_FORWARD_LOCKED:
262f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.app_forward_locked);
2635cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INVALID_LOCATION:
264f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.invalid_location);
2655cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu            case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE:
266f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                return getActivity().getString(R.string.system_package);
2679a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu            case PackageManager.MOVE_FAILED_INTERNAL_ERROR:
2689a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu                return "";
2695cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu        }
2709a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu        return "";
2715cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu    }
2725cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
273ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void initMoveButton() {
274ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        if (Environment.isExternalStorageEmulated()) {
275ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mMoveAppButton.setVisibility(View.INVISIBLE);
276ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return;
277ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
27842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean dataOnly = false;
2790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        dataOnly = (mPackageInfo == null) && (mAppEntry != null);
280ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        boolean moveDisable = true;
28142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (dataOnly) {
28242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app);
2830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
28442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_internal);
2854056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu            // Always let apps move to internal storage from sdcard.
286ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            moveDisable = false;
28742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
28842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mMoveAppButton.setText(R.string.move_app_to_sdcard);
2896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            mCanBeOnSdCardChecker.init();
2906dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn            moveDisable = !mCanBeOnSdCardChecker.check(mAppEntry.info);
291730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu        }
292ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        if (moveDisable) {
293ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(false);
294ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
295ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setOnClickListener(this);
296ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            mMoveAppButton.setEnabled(true);
297ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
29842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
29942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
30070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private boolean isThisASystemPackage() {
30170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        try {
30270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            PackageInfo sys = mPm.getPackageInfo("android", PackageManager.GET_SIGNATURES);
30370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            return (mPackageInfo != null && mPackageInfo.signatures != null &&
30470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    sys.signatures[0].equals(mPackageInfo.signatures[0]));
30570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } catch (PackageManager.NameNotFoundException e) {
30670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            return false;
30770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
30870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    }
30970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
310de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void initUninstallButtons() {
3110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
31242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        boolean enabled = true;
31342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (mUpdatedSysApp) {
31442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setText(R.string.app_factory_reset);
31542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else {
3160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
317b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu                enabled = false;
3183db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                try {
3193db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    // Try to prevent the user from bricking their phone
3203db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    // by not allowing disabling of apps signed with the
3213db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    // system cert and any launcher app in the system.
3223db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    PackageInfo sys = mPm.getPackageInfo("android",
3233db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                            PackageManager.GET_SIGNATURES);
3243db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    Intent intent = new Intent(Intent.ACTION_MAIN);
3253db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    intent.addCategory(Intent.CATEGORY_HOME);
3263db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    intent.setPackage(mAppEntry.info.packageName);
3273db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    List<ResolveInfo> homes = mPm.queryIntentActivities(intent, 0);
3283db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    if ((homes != null && homes.size() > 0) || isThisASystemPackage()) {
3293db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                        // Disable button for core system applications.
3303db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                        mUninstallButton.setText(R.string.disable_text);
3313db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    } else if (mAppEntry.info.enabled) {
3323db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                        mUninstallButton.setText(R.string.disable_text);
3333db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                        enabled = true;
3343db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    } else {
3353db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                        mUninstallButton.setText(R.string.enable_text);
3363db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                        enabled = true;
3379db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                    }
3383db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                } catch (PackageManager.NameNotFoundException e) {
3393db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    Log.w(TAG, "Unable to get package info", e);
3409db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
3412e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn            } else if ((mPackageInfo.applicationInfo.flags
3422e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    & ApplicationInfo.FLAG_INSTALLED) == 0) {
3432e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                mUninstallButton.setText(R.string.install_text);
3449db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            } else {
3459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                mUninstallButton.setText(R.string.uninstall_text);
346b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu            }
34742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
3485c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        // If this is a device admin, it can't be uninstall or disabled.
3495c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        // We do this here so the text of the button is still set correctly.
3505c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
3515c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            enabled = false;
3525c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        }
35342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton.setEnabled(enabled);
35442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if (enabled) {
35542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            // Register listener
35642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mUninstallButton.setOnClickListener(this);
35742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        }
35842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
35942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
3604a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    private void initNotificationButton() {
3614a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        INotificationManager nm = INotificationManager.Stub.asInterface(
3624a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
3634a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        boolean enabled = true; // default on
3644a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        try {
3654a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            enabled = nm.areNotificationsEnabledForPackage(mAppEntry.info.packageName);
3664a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } catch (android.os.RemoteException ex) {
3674a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            // this does not bode well
3684a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        }
3694a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        mNotificationSwitch.setChecked(enabled);
37070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        if (isThisASystemPackage()) {
37170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setEnabled(false);
37270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } else {
37370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setEnabled(true);
37470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setOnCheckedChangeListener(this);
37570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
3764a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler    }
3774a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
380f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public void onCreate(Bundle icicle) {
381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
382b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
3833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        setHasOptionsMenu(true);
3843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
385f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mState = ApplicationsState.getInstance(getActivity().getApplication());
386309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession = mState.newSession(this);
387f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mPm = getActivity().getPackageManager();
3883db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        mUserManager = (UserManager)getActivity().getSystemService(Context.USER_SERVICE);
3899d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        IBinder b = ServiceManager.getService(Context.USB_SERVICE);
3909d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        mUsbManager = IUsbManager.Stub.asInterface(b);
391c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        mAppWidgetManager = AppWidgetManager.getInstance(getActivity());
3925c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
3933465b67740e17711af2b36b09e2250a02275d860Jake Hamby        mSmsManager = ISms.Stub.asInterface(ServiceManager.getService("isms"));
3949d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood
3956dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn        mCanBeOnSdCardChecker = new CanBeOnSdCardChecker();
396f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    }
397f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
398f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    @Override
399f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
400f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View view = mRootView = inflater.inflate(R.layout.installed_app_details, null);
4016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn
402f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mComputingStr = getActivity().getText(R.string.computing_size);
403b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
40450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
405f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mTotalSize = (TextView)view.findViewById(R.id.total_size_text);
406f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mAppSize = (TextView)view.findViewById(R.id.application_size_text);
407f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mDataSize = (TextView)view.findViewById(R.id.data_size_text);
408bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalCodeSize = (TextView)view.findViewById(R.id.external_code_size_text);
409bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn        mExternalDataSize = (TextView)view.findViewById(R.id.external_data_size_text);
4101f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn
4111f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn        if (Environment.isExternalStorageEmulated()) {
4121f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            ((View)mExternalCodeSize.getParent()).setVisibility(View.GONE);
4131f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            ((View)mExternalDataSize.getParent()).setVisibility(View.GONE);
4141f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn        }
4151f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn
41642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Get Control button panel
417f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View btnPanel = view.findViewById(R.id.control_buttons_panel);
41842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button);
41942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mForceStopButton.setText(R.string.force_stop);
42042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button);
421cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
422b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
42342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Initialize clear data and move install location buttons
424f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View data_buttons_panel = view.findViewById(R.id.data_buttons_panel);
425313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn        mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
426313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn        mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
427b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
4280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Cache section
429f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mCacheSize = (TextView) view.findViewById(R.id.cache_size_text);
430f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mClearCacheButton = (Button) view.findViewById(R.id.clear_cache_button);
431f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
432f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        mActivitiesButton = (Button)view.findViewById(R.id.clear_activities_button);
4330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
434aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility control
435aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mScreenCompatSection = view.findViewById(R.id.screen_compatibility_section);
436aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mAskCompatibilityCB = (CheckBox)view.findViewById(R.id.ask_compatibility_cb);
437aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        mEnableCompatibilityCB = (CheckBox)view.findViewById(R.id.enable_compatibility_cb);
4384a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler
43970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        mNotificationSwitch = (CompoundButton) view.findViewById(R.id.notification_switch);
440aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
441f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        return view;
442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
443f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
4443db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4453db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
4463db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text)
4473db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
4483db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
4493db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
4503db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4513db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onPrepareOptionsMenu(Menu menu) {
4523db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        boolean showIt = true;
4533db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (mUpdatedSysApp) {
4543db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4553db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
4563db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4573db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
4583db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4593db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if (UserHandle.myUserId() != 0) {
4603db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4613db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        } else if (mUserManager.getUsers().size() < 1) {
4623db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            showIt = false;
4633db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
4643db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt);
4653db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
4663db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
4673db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4683db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public boolean onOptionsItemSelected(MenuItem item) {
4693db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        int menuId = item.getItemId();
4703db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (menuId == UNINSTALL_ALL_USERS_MENU) {
4713db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            uninstallPkg(mAppEntry.info.packageName, true);
4723db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            return true;
4733db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
4743db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        return false;
4753db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
4763db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
4773db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    @Override
4783db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    public void onActivityResult(int requestCode, int resultCode, Intent data) {
4793db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        super.onActivityResult(requestCode, resultCode, data);
4803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        if (requestCode == REQUEST_UNINSTALL) {
4813db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            if (!refreshUi()) {
4823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                setIntentAndFinish(true, true);
4833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn            }
4843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        }
4853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    }
4863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn
48750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set applicaiton label and icon.
488f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu    private void setAppLabelAndIcon(PackageInfo pkgInfo) {
489f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        View appSnippet = mRootView.findViewById(R.id.app_snippet);
490f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
4910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mState.ensureIcon(mAppEntry);
4920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        icon.setImageDrawable(mAppEntry.icon);
493f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        // Set application name.
494f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
4950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        label.setText(mAppEntry.label);
49650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
497f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size);
498f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu
499f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu        if (pkgInfo != null && pkgInfo.versionName != null) {
50050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
501f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            mAppVersion.setText(getActivity().getString(R.string.version_text,
5028e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
50350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
504f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu            mAppVersion.setVisibility(View.INVISIBLE);
50550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
50650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
50750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
50850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
50942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    public void onResume() {
51042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        super.onResume();
511b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
512309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession.resume();
5130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!refreshUi()) {
514b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown            setIntentAndFinish(true, true);
515b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
5160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPause() {
5200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        super.onPause();
521309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn        mSession.pause();
5220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5250f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onAllSizesComputed() {
5260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageIconChanged() {
5300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageListChanged() {
5340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
5350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
53819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    public void onRebuildComplete(ArrayList<AppEntry> apps) {
53919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    }
54019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn
54119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn    @Override
5420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onPackageSizeChanged(String packageName) {
5430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (packageName.equals(mAppEntry.info.packageName)) {
5440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            refreshSizeInfo();
5450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
5460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    @Override
5490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    public void onRunningStateChanged(boolean running) {
5500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    }
5510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private boolean refreshUi() {
5530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mMoveInProgress) {
5540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return true;
5550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
5560c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        final Bundle args = getArguments();
5570c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy        String packageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null;
558f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        if (packageName == null) {
5590c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy            Intent intent = (args == null) ?
5600c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy                    getActivity().getIntent() : (Intent) args.getParcelable("intent");
561f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            if (intent != null) {
562f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                packageName = intent.getData().getSchemeSpecificPart();
563f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
564f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
5650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mAppEntry = mState.getEntry(packageName);
5660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
5670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry == null) {
5680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
569b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown        }
570b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
57150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application info again to refresh changed properties of application
57250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        try {
5730f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
5740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_DISABLED_COMPONENTS |
5750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_UNINSTALLED_PACKAGES |
5760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    PackageManager.GET_SIGNATURES);
57750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } catch (NameNotFoundException e) {
5780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
5790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            return false; // onCreate must have failed, make sure to exit
58050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
581b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
5820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Get list of preferred activities
5830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<ComponentName> prefActList = new ArrayList<ComponentName>();
584b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown
5850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Intent list cannot be null. so pass empty list
5860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        List<IntentFilter> intentList = new ArrayList<IntentFilter>();
5870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        mPm.getPreferredActivities(intentList, prefActList, packageName);
588c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        if (localLOGV)
589c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            Log.i(TAG, "Have " + prefActList.size() + " number of activities in preferred list");
5909d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        boolean hasUsbDefaults = false;
5919d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        try {
5922715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood            hasUsbDefaults = mUsbManager.hasDefaults(packageName);
5939d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        } catch (RemoteException e) {
5949d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            Log.e(TAG, "mUsbManager.hasDefaults", e);
5959d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood        }
596c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        boolean hasBindAppWidgetPermission =
597c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                mAppWidgetManager.hasBindAppWidgetPermission(mAppEntry.info.packageName);
598c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
599c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        TextView autoLaunchTitleView = (TextView) mRootView.findViewById(R.id.auto_launch_title);
600c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
601c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        boolean autoLaunchEnabled = prefActList.size() > 0 || hasUsbDefaults;
602c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        if (!autoLaunchEnabled && !hasBindAppWidgetPermission) {
603c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView);
6040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        } else {
605c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            boolean useBullets = hasBindAppWidgetPermission && autoLaunchEnabled;
606c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
607c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (hasBindAppWidgetPermission) {
608c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                autoLaunchTitleView.setText(R.string.auto_launch_label_generic);
609c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            } else {
610c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                autoLaunchTitleView.setText(R.string.auto_launch_label);
611c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
612c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
613c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            CharSequence text = null;
614c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            int bulletIndent = getResources()
615c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    .getDimensionPixelSize(R.dimen.installed_app_details_bullet_offset);
616c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (autoLaunchEnabled) {
617c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                CharSequence autoLaunchEnableText = getText(R.string.auto_launch_enable_text);
618c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                SpannableString s = new SpannableString(autoLaunchEnableText);
619c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                if (useBullets) {
620c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    s.setSpan(new BulletSpan(bulletIndent), 0, autoLaunchEnableText.length(), 0);
621c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                }
622c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                text = (text == null) ?
623c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n");
624c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
625c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            if (hasBindAppWidgetPermission) {
626c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                CharSequence alwaysAllowBindAppWidgetsText =
627c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        getText(R.string.always_allow_bind_appwidgets_text);
628c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                SpannableString s = new SpannableString(alwaysAllowBindAppWidgetsText);
629c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                if (useBullets) {
630c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    s.setSpan(new BulletSpan(bulletIndent),
631c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                            0, alwaysAllowBindAppWidgetsText.length(), 0);
632c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                }
633c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                text = (text == null) ?
634c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                        TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n");
635c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            }
636c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            autoLaunchView.setText(text);
6370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setEnabled(true);
6380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mActivitiesButton.setOnClickListener(this);
6390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        }
640aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
641aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        // Screen compatibility section.
642aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
643aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
644aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        int compatMode = am.getPackageScreenCompatMode(packageName);
64513bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // For now these are always off; this is the old UI model which we
64613bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        // are no longer using.
64713bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn        if (false && (compatMode == ActivityManager.COMPAT_MODE_DISABLED
64813bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn                || compatMode == ActivityManager.COMPAT_MODE_ENABLED)) {
649aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.VISIBLE);
650aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setChecked(am.getPackageAskScreenCompat(packageName));
651aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mAskCompatibilityCB.setOnCheckedChangeListener(this);
652aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setChecked(compatMode == ActivityManager.COMPAT_MODE_ENABLED);
653aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mEnableCompatibilityCB.setOnCheckedChangeListener(this);
654aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else {
655aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            mScreenCompatSection.setVisibility(View.GONE);
656aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
657aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
6580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        // Security permissions section
659f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        LinearLayout permsView = (LinearLayout) mRootView.findViewById(R.id.permissions_section);
660f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        AppSecurityPermissions asp = new AppSecurityPermissions(getActivity(), packageName);
6613465b67740e17711af2b36b09e2250a02275d860Jake Hamby        int premiumSmsPermission = getPremiumSmsPermission(packageName);
6623465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // Premium SMS permission implies the app also has SEND_SMS permission, so the original
6633465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // application permissions list doesn't have to be shown/hidden separately. The premium
6643465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // SMS subsection should only be visible if the app has tried to send to a premium SMS.
6653465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (asp.getPermissionCount() > 0
6663465b67740e17711af2b36b09e2250a02275d860Jake Hamby                || premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) {
6670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            permsView.setVisibility(View.VISIBLE);
6683465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } else {
6693465b67740e17711af2b36b09e2250a02275d860Jake Hamby            permsView.setVisibility(View.GONE);
6703465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
6713465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // Premium SMS permission subsection
6723465b67740e17711af2b36b09e2250a02275d860Jake Hamby        TextView securityBillingDesc = (TextView) permsView.findViewById(
6733465b67740e17711af2b36b09e2250a02275d860Jake Hamby                R.id.security_settings_billing_desc);
6743465b67740e17711af2b36b09e2250a02275d860Jake Hamby        LinearLayout securityBillingList = (LinearLayout) permsView.findViewById(
6753465b67740e17711af2b36b09e2250a02275d860Jake Hamby                R.id.security_settings_billing_list);
6763465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) {
6773465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Show the premium SMS permission selector
6783465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingDesc.setVisibility(View.VISIBLE);
6793465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingList.setVisibility(View.VISIBLE);
6803465b67740e17711af2b36b09e2250a02275d860Jake Hamby            Spinner spinner = (Spinner) permsView.findViewById(
6813465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    R.id.security_settings_premium_sms_list);
6823465b67740e17711af2b36b09e2250a02275d860Jake Hamby            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
6833465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    R.array.security_settings_premium_sms_values,
6843465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    android.R.layout.simple_spinner_item);
6853465b67740e17711af2b36b09e2250a02275d860Jake Hamby            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
6863465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setAdapter(adapter);
6873465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // List items are in the same order as SmsUsageMonitor constants, offset by 1.
6883465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setSelection(premiumSmsPermission - 1);
6893465b67740e17711af2b36b09e2250a02275d860Jake Hamby            spinner.setOnItemSelectedListener(new PremiumSmsSelectionListener(
6903465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    packageName, mSmsManager));
6913465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } else {
6923465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Hide the premium SMS permission selector
6933465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingDesc.setVisibility(View.GONE);
6943465b67740e17711af2b36b09e2250a02275d860Jake Hamby            securityBillingList.setVisibility(View.GONE);
6953465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
6963465b67740e17711af2b36b09e2250a02275d860Jake Hamby        // App permissions subsection
6973465b67740e17711af2b36b09e2250a02275d860Jake Hamby        if (asp.getPermissionCount() > 0) {
6980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            // Make the security sections header visible
6990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            LinearLayout securityList = (LinearLayout) permsView.findViewById(
7000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                    R.id.security_settings_list);
7010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.removeAllViews();
7020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            securityList.addView(asp.getPermissionsView());
703e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            // If this app is running under a shared user ID with other apps,
704e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            // update the description to explain this.
705e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            String[] packages = mPm.getPackagesForUid(mPackageInfo.applicationInfo.uid);
706e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            if (packages != null && packages.length > 1) {
707e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                ArrayList<CharSequence> pnames = new ArrayList<CharSequence>();
708e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                for (int i=0; i<packages.length; i++) {
709e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    String pkg = packages[i];
710e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    if (mPackageInfo.packageName.equals(pkg)) {
711e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        continue;
712e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
713e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    try {
714e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        ApplicationInfo ainfo = mPm.getApplicationInfo(pkg, 0);
715e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        pnames.add(ainfo.loadLabel(mPm));
716e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
717e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
718e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                }
719e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                final int N = pnames.size();
720e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                if (N > 0) {
721e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    final Resources res = getActivity().getResources();
722e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    String appListStr;
723e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    if (N == 1) {
724e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = pnames.get(0).toString();
725e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } else if (N == 2) {
726e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = res.getString(R.string.join_two_items, pnames.get(0),
727e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                pnames.get(1));
728e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    } else {
729e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = pnames.get(N-2).toString();
730e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        for (int i=N-3; i>=0; i--) {
731e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            appListStr = res.getString(i == 0 ? R.string.join_many_items_first
732e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                    : R.string.join_many_items_middle, pnames.get(i), appListStr);
733e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        }
734e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                        appListStr = res.getString(R.string.join_many_items_last,
735e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                                appListStr, pnames.get(N-1));
736e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    }
737e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    TextView descr = (TextView) mRootView.findViewById(
738e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            R.id.security_settings_desc);
739e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                    descr.setText(res.getString(R.string.security_settings_desc_multi,
740e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                            mPackageInfo.applicationInfo.loadLabel(mPm), appListStr));
741e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn                }
742e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn            }
743de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
7440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
7450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        checkForceStop();
7460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        setAppLabelAndIcon(mPackageInfo);
7470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshButtons();
7480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshSizeInfo();
7490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        return true;
750afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
7513465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7523465b67740e17711af2b36b09e2250a02275d860Jake Hamby    private static class PremiumSmsSelectionListener implements AdapterView.OnItemSelectedListener {
7533465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private final String mPackageName;
7543465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private final ISms mSmsManager;
7553465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7563465b67740e17711af2b36b09e2250a02275d860Jake Hamby        PremiumSmsSelectionListener(String packageName, ISms smsManager) {
7573465b67740e17711af2b36b09e2250a02275d860Jake Hamby            mPackageName = packageName;
7583465b67740e17711af2b36b09e2250a02275d860Jake Hamby            mSmsManager = smsManager;
7593465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7603465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7613465b67740e17711af2b36b09e2250a02275d860Jake Hamby        @Override
7623465b67740e17711af2b36b09e2250a02275d860Jake Hamby        public void onItemSelected(AdapterView<?> parent, View view, int position,
7633465b67740e17711af2b36b09e2250a02275d860Jake Hamby                long id) {
7643465b67740e17711af2b36b09e2250a02275d860Jake Hamby            if (position >= 0 && position < 3) {
7653465b67740e17711af2b36b09e2250a02275d860Jake Hamby                Log.d(TAG, "Selected premium SMS policy " + position);
7663465b67740e17711af2b36b09e2250a02275d860Jake Hamby                setPremiumSmsPermission(mPackageName, (position + 1));
7673465b67740e17711af2b36b09e2250a02275d860Jake Hamby            } else {
7683465b67740e17711af2b36b09e2250a02275d860Jake Hamby                Log.e(TAG, "Error: unknown premium SMS policy " + position);
7693465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
7703465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7713465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7723465b67740e17711af2b36b09e2250a02275d860Jake Hamby        @Override
7733465b67740e17711af2b36b09e2250a02275d860Jake Hamby        public void onNothingSelected(AdapterView<?> parent) {
7743465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // Ignored
7753465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7763465b67740e17711af2b36b09e2250a02275d860Jake Hamby
7773465b67740e17711af2b36b09e2250a02275d860Jake Hamby        private void setPremiumSmsPermission(String packageName, int permission) {
7783465b67740e17711af2b36b09e2250a02275d860Jake Hamby            try {
7793465b67740e17711af2b36b09e2250a02275d860Jake Hamby                if (mSmsManager != null) {
7803465b67740e17711af2b36b09e2250a02275d860Jake Hamby                    mSmsManager.setPremiumSmsPermission(packageName, permission);
7813465b67740e17711af2b36b09e2250a02275d860Jake Hamby                }
7823465b67740e17711af2b36b09e2250a02275d860Jake Hamby            } catch (RemoteException ex) {
7833465b67740e17711af2b36b09e2250a02275d860Jake Hamby                // ignored
7843465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
7853465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
7863465b67740e17711af2b36b09e2250a02275d860Jake Hamby    }
7870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
788c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    private void resetLaunchDefaultsUi(TextView title, TextView autoLaunchView) {
789c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        title.setText(R.string.auto_launch_label);
790c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        autoLaunchView.setText(R.string.auto_launch_disable_text);
791c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        // Disable clear activities button
792c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka        mActivitiesButton.setEnabled(false);
793c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka    }
794c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka
795afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
796afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
797afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
798afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
799ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        PreferenceActivity pa = (PreferenceActivity)getActivity();
800ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        pa.finishPreferencePanel(this, Activity.RESULT_OK, intent);
801afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
802afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
8030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn    private void refreshSizeInfo() {
8040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mAppEntry.size == ApplicationsState.SIZE_INVALID
8050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) {
8060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1;
8070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (!mHaveSizes) {
8080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mAppSize.setText(mComputingStr);
8090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mDataSize.setText(mComputingStr);
8100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mCacheSize.setText(mComputingStr);
8110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(mComputingStr);
8120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
8130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearDataButton.setEnabled(false);
8140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mClearCacheButton.setEnabled(false);
8150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
816afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
8170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mHaveSizes = true;
8181f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            long codeSize = mAppEntry.codeSize;
8191f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            long dataSize = mAppEntry.dataSize;
8201f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (Environment.isExternalStorageEmulated()) {
8211f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                codeSize += mAppEntry.externalCodeSize;
8221f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                dataSize +=  mAppEntry.externalDataSize;
8231f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            } else {
8241f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                if (mLastExternalCodeSize != mAppEntry.externalCodeSize) {
8251f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mLastExternalCodeSize = mAppEntry.externalCodeSize;
8261f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mExternalCodeSize.setText(getSizeStr(mAppEntry.externalCodeSize));
8271f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                }
8281f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                if (mLastExternalDataSize !=  mAppEntry.externalDataSize) {
8291f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mLastExternalDataSize =  mAppEntry.externalDataSize;
8301f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                    mExternalDataSize.setText(getSizeStr( mAppEntry.externalDataSize));
8311f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                }
832afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
8331f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (mLastCodeSize != codeSize) {
8341f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mLastCodeSize = codeSize;
8351f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mAppSize.setText(getSizeStr(codeSize));
836bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn            }
8371f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if (mLastDataSize != dataSize) {
8381f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mLastDataSize = dataSize;
8391f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn                mDataSize.setText(getSizeStr(dataSize));
840424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root            }
841313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            long cacheSize = mAppEntry.cacheSize + mAppEntry.externalCacheSize;
842313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            if (mLastCacheSize != cacheSize) {
843313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn                mLastCacheSize = cacheSize;
844313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn                mCacheSize.setText(getSizeStr(cacheSize));
845afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
8460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mLastTotalSize != mAppEntry.size) {
8470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mLastTotalSize = mAppEntry.size;
8480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mTotalSize.setText(getSizeStr(mAppEntry.size));
849afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
8500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn
8511f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn            if ((mAppEntry.dataSize+ mAppEntry.externalDataSize) <= 0 || !mCanClearData) {
8520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(false);
8530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
8540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setEnabled(true);
8550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearDataButton.setOnClickListener(this);
8560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            }
857313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn            if (cacheSize <= 0) {
8580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(false);
8590f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            } else {
8600f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setEnabled(true);
8610f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                mClearCacheButton.setOnClickListener(this);
862afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
863afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
864afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
865afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
866afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
867afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
868afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
869afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
870afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
871afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
8720f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
87342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setText(R.string.clear_user_data_text);
874afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
87542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            Log.i(TAG, "Cleared user data for package : "+packageName);
8760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
877afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
87842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setEnabled(true);
879afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
8809db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        checkForceStop();
881afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
882ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu
883de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    private void refreshButtons() {
884de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        if (!mMoveInProgress) {
885de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initUninstallButtons();
886de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initDataButtons();
887de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            initMoveButton();
8884a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            initNotificationButton();
889de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        } else {
890de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setText(R.string.moving);
891de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveAppButton.setEnabled(false);
892de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mUninstallButton.setEnabled(false);
893de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        }
894de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu    }
895de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu
896ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    private void processMoveMsg(Message msg) {
897ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        int result = msg.arg1;
8980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
899de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        // Refresh the button attributes.
900de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu        mMoveInProgress = false;
9010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (result == PackageManager.MOVE_SUCCEEDED) {
902ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            Log.i(TAG, "Moved resources for " + packageName);
903de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            // Refresh size information again.
9040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mState.requestSize(mAppEntry.info.packageName);
905ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else {
906f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_MOVE_FAILED, result);
907ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        }
9080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        refreshUi();
909ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu    }
9105cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu
911afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
912afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
913afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
914afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
91542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private  void initiateClearUserData() {
91642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        mClearDataButton.setEnabled(false);
91742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        // Invoke uninstall or clear user data based on sysPackage
9180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
91942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        Log.i(TAG, "Clearing user data for package : " + packageName);
9200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (mClearDataObserver == null) {
921afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
922afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
923f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)
924f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
925afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
9260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        if (!res) {
92750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
928afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
929f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_CANNOT_CLEAR_DATA, 0);
930afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
93142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            mClearDataButton.setText(R.string.recompute_size);
932afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
933afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
934afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
935f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    private void showDialogInner(int id, int moveErrorCode) {
936f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        DialogFragment newFragment = MyAlertDialogFragment.newInstance(id, moveErrorCode);
937f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.setTargetFragment(this, 0);
938f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        newFragment.show(getFragmentManager(), "dialog " + id);
93950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
94050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
941f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn    public static class MyAlertDialogFragment extends DialogFragment {
942f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
943f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public static MyAlertDialogFragment newInstance(int id, int moveErrorCode) {
944f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            MyAlertDialogFragment frag = new MyAlertDialogFragment();
945f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            Bundle args = new Bundle();
946f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("id", id);
947f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            args.putInt("moveError", moveErrorCode);
948f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            frag.setArguments(args);
949f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return frag;
950f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
951f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
952f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        InstalledAppDetails getOwner() {
953f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            return (InstalledAppDetails)getTargetFragment();
954f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
955f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn
956f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        @Override
957f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        public Dialog onCreateDialog(Bundle savedInstanceState) {
958f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int id = getArguments().getInt("id");
959f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            int moveErrorCode = getArguments().getInt("moveError");
960f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            switch (id) {
961f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CLEAR_DATA:
962f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
963f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_data_dlg_title))
964e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
965f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_data_dlg_text))
966f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
967f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
968f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
969f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
970f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().initiateClearUserData();
971f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
972f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
973f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
974f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
975f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FACTORY_RESET:
976f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
977f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title))
978e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
979f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text))
980f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
981f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
982f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
983f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Clear user data here
9843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                            getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName, false);
985f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
986f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
987f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
988f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
989f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_APP_NOT_FOUND:
990f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
991f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_not_found_dlg_title))
992e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
993f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_not_found_dlg_title))
994f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(getActivity().getText(R.string.dlg_ok),
995f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
996f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
997f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
998f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(true, true);
999f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1000f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1001f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1002f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_CANNOT_CLEAR_DATA:
1003f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1004f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.clear_failed_dlg_title))
1005e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1006f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.clear_failed_dlg_text))
1007f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok,
1008f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            new DialogInterface.OnClickListener() {
1009f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1010f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().mClearDataButton.setEnabled(false);
1011f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            //force to recompute changed value
1012f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().setIntentAndFinish(false, false);
1013f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1014f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1015f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1016f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_FORCE_STOP:
1017f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1018f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.force_stop_dlg_title))
1019e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1020f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(getActivity().getText(R.string.force_stop_dlg_text))
1021f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1022f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        new DialogInterface.OnClickListener() {
1023f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1024f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            // Force stop
1025f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().forceStopPackage(getOwner().mAppEntry.info.packageName);
1026f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                        }
1027f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    })
1028f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1029f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1030f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                case DLG_MOVE_FAILED:
1031f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    CharSequence msg = getActivity().getString(R.string.move_app_failed_dlg_text,
1032f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                            getOwner().getMoveErrMsg(moveErrorCode));
1033f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1034f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title))
1035e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1036f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setMessage(msg)
1037f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .setNeutralButton(R.string.dlg_ok, null)
1038f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                    .create();
1039f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                case DLG_DISABLE:
1040f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    return new AlertDialog.Builder(getActivity())
1041f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setTitle(getActivity().getText(R.string.app_disable_dlg_title))
1042e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
1043f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setMessage(getActivity().getText(R.string.app_disable_dlg_text))
1044f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setPositiveButton(R.string.dlg_ok,
1045f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DialogInterface.OnClickListener() {
1046f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
1047f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            // Disable the app
1048f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            new DisableChanger(getOwner(), getOwner().mAppEntry.info,
1049f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER)
1050f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                            .execute((Object)null);
1051f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        }
1052f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    })
1053f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .setNegativeButton(R.string.dlg_cancel, null)
1054f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    .create();
105570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                case DLG_DISABLE_NOTIFICATIONS:
105670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    return new AlertDialog.Builder(getActivity())
105770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setTitle(getActivity().getText(R.string.app_disable_notifications_dlg_title))
1058c8272b075275f81ddfb9cef2f92514b7ce3365deBjörn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
105970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setMessage(getActivity().getText(R.string.app_disable_notifications_dlg_text))
106070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setPositiveButton(R.string.dlg_ok,
106170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        new DialogInterface.OnClickListener() {
106270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        public void onClick(DialogInterface dialog, int which) {
106370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            // Disable the package's notifications
106470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            getOwner().setNotificationsEnabled(false);
106570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        }
106670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    })
106770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .setNegativeButton(R.string.dlg_cancel,
106870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        new DialogInterface.OnClickListener() {
106970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        public void onClick(DialogInterface dialog, int which) {
107070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            // Re-enable the checkbox
107170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                            getOwner().mNotificationSwitch.setChecked(true);
107270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                        }
107370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    })
107470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                    .create();
1075f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            }
1076f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            throw new IllegalArgumentException("unknown id " + id);
1077f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        }
107850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
107950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
10803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn    private void uninstallPkg(String packageName, boolean allUsers) {
108150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
108250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
10833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI);
10843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers);
10853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn        startActivityForResult(uninstallIntent, REQUEST_UNINSTALL);
108650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
108750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
108842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    private void forceStopPackage(String pkgName) {
1089f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn        ActivityManager am = (ActivityManager)getActivity().getSystemService(
109042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu                Context.ACTIVITY_SERVICE);
109142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        am.forceStopPackage(pkgName);
1092c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        mState.invalidatePackage(pkgName);
1093c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName);
1094c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        if (newEnt != null) {
1095c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn            mAppEntry = newEnt;
1096c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn        }
1097cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
109842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu    }
109942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu
1100cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
1101cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
1102cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
1103861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED);
1104cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
1105cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
1106861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn
1107861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    private void updateForceStopButton(boolean enabled) {
1108861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setEnabled(enabled);
1109861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        mForceStopButton.setOnClickListener(InstalledAppDetails.this);
1110861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn    }
1111cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
1112cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
11135c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
11145c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            // User can't force stop device admin.
11155c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            updateForceStopButton(false);
11165c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
1117861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // If the app isn't explicitly stopped, then always show the
1118861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            // force stop button.
1119861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            updateForceStopButton(true);
1120861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        } else {
11215c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
11225c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                    Uri.fromParts("package", mAppEntry.info.packageName, null));
11235c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
11245c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
1125861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn            getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
1126861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn                    Activity.RESULT_CANCELED, null, null);
1127861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn        }
1128cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
112970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
11309db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    static class DisableChanger extends AsyncTask<Object, Object, Object> {
11319db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final PackageManager mPm;
11329db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final WeakReference<InstalledAppDetails> mActivity;
11339db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final ApplicationInfo mInfo;
11349db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        final int mState;
11359db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
11369db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) {
11379db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm = activity.mPm;
11389db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mActivity = new WeakReference<InstalledAppDetails>(activity);
11399db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mInfo = info;
11409db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mState = state;
11419db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
11429db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
11439db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        @Override
11449db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        protected Object doInBackground(Object... params) {
11459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0);
11469db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            return null;
11479db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn        }
11489db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn    }
11499db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn
115070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    private void setNotificationsEnabled(boolean enabled) {
115170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        String packageName = mAppEntry.info.packageName;
115270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        INotificationManager nm = INotificationManager.Stub.asInterface(
115370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
115470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        try {
115570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            final boolean enable = mNotificationSwitch.isChecked();
115670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            nm.setNotificationsEnabledForPackage(packageName, enabled);
115770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        } catch (android.os.RemoteException ex) {
115870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            mNotificationSwitch.setChecked(!enabled); // revert
115970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler        }
116070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler    }
116170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler
11623465b67740e17711af2b36b09e2250a02275d860Jake Hamby    private int getPremiumSmsPermission(String packageName) {
11633465b67740e17711af2b36b09e2250a02275d860Jake Hamby        try {
11643465b67740e17711af2b36b09e2250a02275d860Jake Hamby            if (mSmsManager != null) {
11653465b67740e17711af2b36b09e2250a02275d860Jake Hamby                return mSmsManager.getPremiumSmsPermission(packageName);
11663465b67740e17711af2b36b09e2250a02275d860Jake Hamby            }
11673465b67740e17711af2b36b09e2250a02275d860Jake Hamby        } catch (RemoteException ex) {
11683465b67740e17711af2b36b09e2250a02275d860Jake Hamby            // ignored
11693465b67740e17711af2b36b09e2250a02275d860Jake Hamby        }
11703465b67740e17711af2b36b09e2250a02275d860Jake Hamby        return SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN;
11713465b67740e17711af2b36b09e2250a02275d860Jake Hamby    }
11723465b67740e17711af2b36b09e2250a02275d860Jake Hamby
1173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
1174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
1175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
1176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
1177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
11780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn        String packageName = mAppEntry.info.packageName;
117942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        if(v == mUninstallButton) {
118042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            if (mUpdatedSysApp) {
1181f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_FACTORY_RESET, 0);
118242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
11830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn                if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
1184f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    if (mAppEntry.info.enabled) {
1185f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        showDialogInner(DLG_DISABLE, 0);
1186f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    } else {
1187f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        new DisableChanger(this, mAppEntry.info,
1188f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT)
1189f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                        .execute((Object)null);
1190f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn                    }
11912e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) {
11922e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    try {
11932e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                        mPm.installExistingPackage(packageName);
11942e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                        refreshUi();
11952e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    } catch (NameNotFoundException e) {
11962e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn                    }
11979db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                } else {
11983db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    uninstallPkg(packageName, false);
11999db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn                }
1200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
1202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
12039d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            try {
12042715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood                mUsbManager.clearDefaults(packageName);
12059d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            } catch (RemoteException e) {
12069d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood                Log.e(TAG, "mUsbManager.clearDefaults", e);
12079d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood            }
1208c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            mAppWidgetManager.setBindAppWidgetPermission(packageName, false);
1209c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            TextView autoLaunchTitleView =
1210c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka                    (TextView) mRootView.findViewById(R.id.auto_launch_title);
1211c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
1212c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka            resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView);
121342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu        } else if(v == mClearDataButton) {
12140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            if (mAppEntry.info.manageSpaceActivityName != null) {
12153fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                if (!Utils.isMonkeyRunning()) {
12163fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                    Intent intent = new Intent(Intent.ACTION_DEFAULT);
12173fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                    intent.setClassName(mAppEntry.info.packageName,
12183fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                            mAppEntry.info.manageSpaceActivityName);
12193db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn                    startActivityForResult(intent, REQUEST_MANAGE_SPACE);
12203fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani                }
122142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            } else {
1222f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn                showDialogInner(DLG_CLEAR_DATA, 0);
122342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu            }
1224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
1225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
1226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
1227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
1228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
1230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
1231f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn            showDialogInner(DLG_FORCE_STOP, 0);
12329db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn            //forceStopPackage(mAppInfo.packageName);
1233ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu        } else if (v == mMoveAppButton) {
1234ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            if (mPackageMoveObserver == null) {
1235ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                mPackageMoveObserver = new PackageMoveObserver();
1236ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu            }
12370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ?
1238ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu                    PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
1239de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            mMoveInProgress = true;
1240de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu            refreshButtons();
12410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn            mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags);
1242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1244aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn
1245aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    @Override
1246aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1247aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        String packageName = mAppEntry.info.packageName;
1248aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        ActivityManager am = (ActivityManager)
1249aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
1250aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        if (buttonView == mAskCompatibilityCB) {
1251aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageAskScreenCompat(packageName, isChecked);
1252aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        } else if (buttonView == mEnableCompatibilityCB) {
1253aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn            am.setPackageScreenCompatMode(packageName, isChecked ?
1254aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn                    ActivityManager.COMPAT_MODE_ENABLED : ActivityManager.COMPAT_MODE_DISABLED);
12554a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler        } else if (buttonView == mNotificationSwitch) {
125670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            if (!isChecked) {
125770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                showDialogInner(DLG_DISABLE_NOTIFICATIONS, 0);
125870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler            } else {
125970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler                setNotificationsEnabled(true);
12604a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler            }
1261aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn        }
1262aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn    }
1263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1265